C 两个子进程向父进程发送信号,父进程回复



我在向 c 中的父进程发送多个信号时遇到问题。 我已经尝试了很长时间,但我仍然陷入僵局或等待锁定。 但我认为它不应该那么复杂,我根本无法理解发生了什么。

所以我有一个父进程和两个子进程。子项向父级发出信号,父级接受它们,然后在管道中向子级发送消息。他们把它写出来给控制台。

到目前为止我的代码:

#include <stdio.h>
#include <signal.h>
#include <unistd.h> 
#include <sys/types.h>
void handler(int signumber) {
printf("Signal with number %i has arrivedn", signumber);
}
int main() {

signal(SIGUSR1, handler);
signal(SIGUSR2, handler);
int pipefd[2];
char sz[100];
if (pipe(pipefd) == -1)
{
perror("Pipe open error");
exit(EXIT_FAILURE);
}
pid_t child, child2;
child = fork();
if (child > 0)
{
pause();
printf("Signal1 arrivedn", SIGUSR1);
//pause();
printf("Signal2 arrivedn", SIGUSR2);
close(pipefd[0]); //Usually we close unused read end
write(pipefd[1], "Message", 13);
printf("Pipe write completen");
int status;
waitpid(child2, &status, 0);
waitpid(child, &status, 0);
printf("Parent process endedn");
}
else
{
child2 = fork();
if(child2>0) //child 1
{ 
printf(" child 1 Waits 3 seconds, then send a SIGTERM %i signaln", SIGUSR1);
sleep(3);
signal(SIGUSR1, handler);
close(pipefd[1]);  //Usually we close the unused write end
printf("Child1 read startn");
read(pipefd[0], sz, sizeof(sz)); // reading max 100 chars
printf("Child1 read end, Message: %s", sz);
printf("n");
close(pipefd[0]); // finally we close the used read end
printf("Child1 process endedn");
kill(child, SIGTERM);
}
else //child 2
{
printf("child 2 Waits 3 seconds, then send a SIGTERM %i signaln", SIGUSR2);
sleep(3);
signal(SIGUSR2, handler);
close(pipefd[1]);  //Usually we close the unused write end
printf("Child2 read startn");
read(pipefd[0], sz, sizeof(sz)); // reading max 100 chars
printf("Child2 read end, Message: %s", sz);
printf("n");
close(pipefd[0]); // finally we close the used read end
printf("Child2 process endedn");
kill(child2, SIGTERM);
}
}
return 0;
}```

我认为您的代码带有竞争条件和内存错误。您也不会向家长发送SIGUSR1SIGUSR2。主观地说,您的解决方案以一种难以遵循的方式实施。如果你对你的陈述进行不同的排序,我想你也会发现我看到的同样的错误(我稍后会提到这一点(。

我强烈建议从小处着手,朝着目标前进。例如,第 1 步可能是让一个进程分叉,让父级通过管道向子级发送消息,让子级退出并让父级收获子级。在步骤 2 中,仅将上述示例代码中的信号处理程序添加到父级,并让子级使用kill()将该信号(父级将处理的确切信号(发送给父级。在后面的某个步骤中,添加另一个分叉调用以创建另一个子项。

就争用条件而言,您的代码的排序方式是,在第一个fork之后,您有一个父进程将尝试处理两个子进程,但只创建了一个子进程。因此,您正在尝试做一些禁忌的事情。此外,第一个孩子正在创建第二个孩子。这意味着第一个孩子的父级甚至不知道第二个孩子的存在,因为第一个孩子具有完全不同的内存空间。第一个子项没有等待它创建的第二个子项的waitpid,因为它的"入口点"可以说是在代码前面的waitpid调用之后。

另外,小心你的write(pipefd[1], "Message", 13);是可怕的。write()的最后一个参数是count。您提供了13但字符串"Message"的长度小于13。系统调用将向读者喷出垃圾,从而导致更多不良问题。

相关内容

  • 没有找到相关文章

最新更新