gpt4 book ai didi

c - 在C中如何告诉一个子进程另一个子进程的pid?

转载 作者:行者123 更新时间:2023-11-30 17:11:36 26 4
gpt4 key购买 nike

我正在编写一个程序,其中需要创建两个子进程,一个生产者和一个消费者。生产者将从 stdin 读取的内容写入文件,消费者在生产者写入该行后读取同一文件。我需要同步两个进程,并且我想通过使用信号来做到这一点,但我现在遇到一个问题,我无法将信号从消费者发送(使用kill()函数)到生产者。

这是我的程序:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void catcherp(){};
void catcherc(){};

pid_t producer, consumer;

int main () {
int status_consumer, status_producer;
char string[128], reading[128];
FILE * fout, *finn;


producer = fork();
if (producer == 0){
signal(SIGUSR2, catcherp);
// producer process, child
while(1){
fout = fopen ("test.txt", "w");
printf ("?: ");
scanf ("%s", string);
fputs(string, fout);
fclose(fout);

kill(consumer, SIGUSR1);
pause();
}

exit(0);
} else {
// parent process
consumer = fork ();
if (consumer == 0) {
signal(SIGUSR1, catcherc);
// consumer process, child
while(1) {
pause();
finn = fopen ("test.txt", "r");
fgets(reading, 128, finn);
printf("%s\n", reading);
fclose(finn);

kill (producer, SIGUSR2);

}
exit(0);
} else {
printf("This is the parent process\n");
waitpid(producer, &status_producer, 0);
waitpid(consumer, &status_consumer, 0);
printf("The children exited\n");
}
}
return 0;
}

两个子进程中的 exit(0) 命令都在那里,因为我仍然必须实现循环的退出条件。我很确定我的问题在于如何在创建生产者进程后创建消费者进程。这意味着生产者看到“消费者”pid 为 0,从而终止程序。

现在,我想了解如何使用 fork() 函数创建两个并发进程(如果可能的话),有人可以启发我吗?

最佳答案

最后我设法解决了这个问题,但是我必须使用临时文件才能在消费者进程内获取生产者进程的pid。我本来希望找到更聪明的方法,但类(class)给出的解决方案基本相同。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>

void catcher(){};

int main () {
int status_consumer, status_producer; // needed for the waitpid functions
pid_t producer, consumer; // pids of the child processes
char string[128]; // input string
FILE * f; // fp

signal (SIGUSR1, catcher);

consumer = fork();
if (consumer == 0) {
// child process
while (1) {
pause(); // wait for the ready signal from the sender
f = fopen ("tmp.txt", "r");
fscanf (f, "%d %s", &producer, string); // read string and the pid of the sender
printf("%s\n", string);
fclose(f);

if (strcmp("end", string) == 0) {
break; // exit the loop when the word "end" is read
}
kill (producer, SIGUSR1);
}

exit(0);
} else {
producer = fork ();
if (producer == 0) {
// child process
while(1) {
f = fopen ("tmp.txt", "w");
printf("?: ");
scanf("%s", string); // read from stdin the string
fprintf(f, "%d\t%s\n", getpid(), string); // write on tmp.txt the string
fclose(f);

kill(consumer, SIGUSR1);
if (strcmp("end", string) == 0){
break; // exit the loop when the word "end" is read
}
pause();
}
} else {
// parent process
waitpid(producer, &status_producer, 0);
waitpid(consumer, &status_consumer, 0);
}

}
return 0; // end of program
}

感谢您的评论

关于c - 在C中如何告诉一个子进程另一个子进程的pid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32055621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com