Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 创建的流程不是创建该流程的流程的子流程_C_Linux_Gcc_Fork - Fatal编程技术网

C 创建的流程不是创建该流程的流程的子流程

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被杀死后不会

我想从进程a创建一个进程B。但是,我不希望B成为A的孩子,如果我只是使用fork,情况就是这样。我怎样才能做到这一点?换句话说,我希望进程B继续执行,即使进程A被终止。

您可以使用setsid()函数


或者,正如您已经将问题标记为“linux”一样,您可能希望使用daemon()而不是fork()+setsid()

我看到的唯一方法是让孤儿(然后被init收养)。 这可以通过在子进程之前终止父进程来实现(但只需注意信号传播)


可能会发现一些不错的样本

如果BA的孩子,你为什么认为BA被杀死后不会继续执行?那不是真的

但是,如果您仍然希望B不是a的子对象,那么您可以通过
fork()
两次执行此操作:一次创建子对象,一次创建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;
}