c - 如何让子进程等待信号?
问题描述
在下面的代码中,我创建了 3 个子进程。我想让父母先完成[some code 1]
,然后让父母和3个孩子同时继续,等待所有孩子都死了再继续[some code 3]
。
[some code x]
但很明显,在运行代码时,有时孩子会在发送 SIGSTOP 之前自己启动。现在我不允许使用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);
}
解决方案
延迟调用 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 应该像这样。这也有消除嵌套的副作用。
推荐阅读
- linux - 在 Bash 中执行 TAR 失败
- google-cloud-platform - 提取 .7z 文件时 Google Cloud vm 停止或冻结
- amazon-web-services - URLSession 带有辞职 URL 的 AWS 视频上传真的很慢
- node-red - Node-Red HTTP 请求节点在文件下载时抛出 1020 错误
- javascript - 在函数的打字稿中声明承诺类型
- java - 未使用 Jetty-web.xml 值
- python - using 'While' statements
- vue.js - vuetify pagination add custom features (slot/template)
- flutter - Can't receive object instance from ChangeNotifierProvider
- python - Open Application (such as zoom.us) with Selenium Webdriver