我想从流程 A 创建流程 B 。但是,我不希望 B 成为 A 的孩子,如果我只是使用 fork 就是这种情况。我怎样才能做到这一点?换句话说,即使进程 A 被杀死,我也希望进程 B 继续执行。
答案 0 :(得分:7)
您可以使用setsid()函数。
或者,正如你已经标记了你的问题“linux”,也许你想使用daemon()而不是fork()+ setsid()。
答案 1 :(得分:4)
如果 B 是 A 是 A 的孩子,为什么你认为 B 会在 A 被杀后继续执行STRONG>?那不是真的。
但如果您仍然希望 B 不是 A 的孩子,那么您可以fork()
两次执行此操作:一次创建一个孩子< strong>A½,一次创建 B 。 B是A½的孩子, A 的孙子。然后立即退出A½。 B 将由init
继承,并且与 A 没有任何进一步的关系。
如果您担心响应于广播到整个前台进程组的Control-C按键等事件而生成的SIGHUP
和SIGINT
等信号,请参阅cnicutar的答案。
答案 2 :(得分:2)
#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;
}
如果您没有发送signal()
,那么在父母完成执行(并退出)之后,子进程将被称为僵尸进程。为了更好地理解,请执行以下程序。
#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;
}
答案 3 :(得分:1)
我看到的唯一方法是让孩子孤儿(然后由init采用)。 这可以通过在孩子之前终止父进程来实现(但只是处理信号传播)。
可能会找到一些不错的样本here