如何解决仅在挂起子进程之后运行父进程代码
我有一个过程P1。我正在用fork创建一个孩子,然后在fork的孩子部分内执行。我想暂停孩子,然后仅在孩子暂停之后才执行其余的父代码。知道我该怎么做吗?
int pid=fork();
if(pid==0)
{
//Do something in here
}
else
{ 暂停孩子并做其他事情,只有在孩子被暂停之后 }
解决方法
我认为,最简单的同步机制是简单的管道。如果您希望孩子在执行之前等待,请阻止它进行读取。例如:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc,char **argv)
{
int p1[2];
int c;
if( pipe(p1)) {
perror("pipe");
return EXIT_FAILURE;
}
switch( fork() ) {
case -1:
perror("fork");
return EXIT_FAILURE;
case 0:
read(p1[0],&c,1); /* wait on the parent */
close(p1[0]);
close(p1[1]);
execlp("echo","echo","foo",NULL);
perror("exec");
return EXIT_FAILURE;
default:
puts("This will always print first");
fflush(stdout);
write(p1[1],1); /* tell the child to continue */
close(p1[1]);
close(p1[0]);
}
return EXIT_SUCCESS;
}
如果您希望孩子在挂起之前执行,可以尝试发送SIGSTOP并使其继续使用SIGCONT,但实际上没有任何意义。如果这样做,您将无法知道孩子何时会停止,甚至可能在您发送SIGSTOP之前就运行完毕。如果您有其他外部同步方法(例如,子进程正在写入文件系统,并且您可以对其进行监视),则应使用该方法使子进程自行挂起。无论如何,尝试使用SIGSTOP / SIGCONT都会有很多竞争条件。最好的选择是延迟exec
并执行类似上述的操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。