如何让子进程等待信号?
Posted
技术标签:
【中文标题】如何让子进程等待信号?【英文标题】:How to let child process wait for signal? 【发布时间】:2021-01-13 00:32:54 【问题描述】:在下面的代码中,我创建了 3 个子进程。我想让父母先完成[some code 1]
,然后让父母和3个孩子同时继续,等所有孩子都死了再继续[some code 3]
。
但显然,在运行代码时,有时孩子会在发送 SIGSTOP 之前启动自己的[some code x]
。现在我不允许使用sleep()
。我可以做些什么来确保孩子在父母完成[some code 1]
之前等待?
pid_t fpid1 = fork();
if (fpid1 > 0) // parent
kill(fpid1, SIGSTOP);
pid_t fpid2 = fork();
if (fpid2 > 0) // parent
kill(fpid2, SIGSTOP);
pid_t fpid3 = fork();
if (fpid3 > 0) // parent
kill(fpid3, SIGSTOP);
[some code 1];
kill(fpid1, SIGCONT);
kill(fpid2, SIGCONT);
kill(fpid3, SIGCONT);
[some code 2];
while(wait(NULL) > 0);
[some code 3];
else if (fpid3 == 0) // child 3
[some code 4];
exit(0);
else if (fpid2 == 0) // child 2
[some code 5];
exit(0);
else if (fpid1 == 0) // child 1
[some code 6];
exit(0);
【问题讨论】:
【参考方案1】:延迟调用 fork 会有帮助吗?像这样的:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(void)
puts("some code 1");
puts("some code 2");
pid_t fpid1 = fork();
if (fpid1 == 0)
puts("some code 6");
exit(0);
pid_t fpid2 = fork();
if (fpid2 == 0)
puts("some code 5");
exit(0);
pid_t fpid3 = fork();
if (fpid3 == 0)
puts("some code 4");
exit(0);
while (wait(NULL) > 0);
puts("some code 3");
不是一些代码 1-6 以任何顺序运行,只有一些代码 4-6 应该这样。这也有消除嵌套的副作用。
【讨论】:
【参考方案2】:我个人在使用 fork 时总是尊重这种模式:我希望它可以帮助你?
if (fork == -1)
// error //
else if (fork == 0)
// child processing //
kill(getpid, SIGKILL)
else
waitpid(pid, status, -YOUR OPTION-);
【讨论】:
以上是关于如何让子进程等待信号?的主要内容,如果未能解决你的问题,请参考以下文章