C 创建的流程不是创建该流程的流程的子流程
我想从进程a创建一个进程B。但是,我不希望B成为A的孩子,如果我只是使用fork,情况就是这样。我怎样才能做到这一点?换句话说,我希望进程B继续执行,即使进程A被终止。您可以使用setsid()函数C 创建的流程不是创建该流程的流程的子流程,c,linux,gcc,fork,C,Linux,Gcc,Fork,我想从进程a创建一个进程B。但是,我不希望B成为A的孩子,如果我只是使用fork,情况就是这样。我怎样才能做到这一点?换句话说,我希望进程B继续执行,即使进程A被终止。您可以使用setsid()函数 或者,正如您已经将问题标记为“linux”一样,您可能希望使用daemon()而不是fork()+setsid() 我看到的唯一方法是让孤儿(然后被init收养)。 这可以通过在子进程之前终止父进程来实现(但只需注意信号传播) 可能会发现一些不错的样本如果B是A的孩子,你为什么认为B在A被杀死后不会
或者,正如您已经将问题标记为“linux”一样,您可能希望使用daemon()而不是fork()+setsid() 我看到的唯一方法是让孤儿(然后被init收养)。 这可以通过在子进程之前终止父进程来实现(但只需注意信号传播)
可能会发现一些不错的样本如果B是A的孩子,你为什么认为B在A被杀死后不会继续执行?那不是真的 但是,如果您仍然希望B不是a的子对象,那么您可以通过
fork()
两次执行此操作:一次创建子对象a½,一次创建B。B是a½的孩子和a的孙子。然后立即退出B将由init
继承,并且与A没有进一步的关系
如果您关心的是
SIGHUP
和SIGINT
等信号,这些信号是响应向整个前台进程组广播的Control-C按键等事件而生成的,请参阅的答案。您希望它是谁的孩子?cnicutar,为什么要删除您的答案?我发现它非常有用。我很高兴你发现它有用,但我认为setsid
的想法更优越:-)如果B是A的孩子,如果A被杀死,B会继续执行。一个选择是让孩子再次分叉,孙子继续,而孩子退出(自杀)。您仍然需要将(子代和)孙代与父代的会话分开。呸!这相当复杂:)!所以基本上你的意思是,如果父进程退出或被终止,子进程仍将继续执行?换句话说,杀死父母不会杀死孩子?知道这个子组和CTRL+C故事是什么吗?@metallicprate CTRL+C会将SIGINT
发送到tty的前台进程组中的每个进程。使用setsid()
将流程放入与任何控制tty无关的全新流程组(和会话)。这就是避免收到信号的好方法。使用setId()
是成为守护进程的一个步骤(例如,将您自己的输入和输出重定向到/dev/null
)。@metallicprade当子进程死亡且父进程未启用wait()
时,它通常会在ps
列表中显示为”
。它将保持这种方式,直到父级wait()
s在其上,或者它被处理为SIGCHLD
信号。OTOH,SIGINT
是当用户点击CTRL
+C
时进程接收到的中断信号。SIGINT的默认信号处理程序导致进程退出。但是,您可以覆盖SIGINT
来做任何您想做的事情(或者什么都不做!)。@metallicprast链接将为您介绍Linux中可用的各种进程间通信。希望这有帮助@如果您发现上面的代码片段有助于理解问题/解决方案,请单击旁边的勾号进行确认?!谢谢调用setsid不会更改父级或进程。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
switch(pid = fork()) {
case -1:
perror("fork");
exit(1);
case 0:
printf(" CHILD: This is the child process!\n");
printf(" CHILD: My PID is %d\n", getpid());
printf(" CHILD: My parent's PID is %d\n", getppid());
/* you can exec another program here if you wish to */
printf(" CHILD: I'm outta here!\n");
break;
default:
printf("PARENT: This is the parent process!\n");
printf("PARENT: My PID is %d\n", getpid());
printf("PARENT: My child's PID is %d\n", pid);
printf("PARENT: I'm not going to wait for my child to exit\n");
signal(SIGCHLD, SIG_IGN);
printf("PARENT: I'm outta here!\n");
}
return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
/*
Execute this program and do 'ps ax | grep Z' to see that this
is put in a defunct state or zombie state
*/
int main()
{
pid_t child_pid;
child_pid = fork();
if (child_pid > 0) {
sleep(60);
} else {
return 0;
}
return 0;
}