Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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_Pthreads_Fork - Fatal编程技术网

C 如何以一种不让孩子收获的方式进行分叉过程';不必要

C 如何以一种不让孩子收获的方式进行分叉过程';不必要,c,linux,pthreads,fork,C,Linux,Pthreads,Fork,我似乎有一个模糊的记忆,Linux中存在着某种功能,它允许我们以这样一种方式来fork()一个进程,即系统自动获取子进程,而不会创建僵尸。这个机制是什么?还是我的内存有问题?实现这一点的便携式方法是使用双叉: pid = fork(); if (pid>0) { int status; while (waitpid(pid, &status, 0) && !WIFEXITED(status) && !WIFSIGNALED(statu

我似乎有一个模糊的记忆,Linux中存在着某种功能,它允许我们以这样一种方式来fork()一个进程,即系统自动获取子进程,而不会创建僵尸。这个机制是什么?还是我的内存有问题?

实现这一点的便携式方法是使用双叉:

pid = fork();
if (pid>0) {
    int status;
    while (waitpid(pid, &status, 0) && !WIFEXITED(status) && !WIFSIGNALED(status));
    if (WIFSIGNALED(status) || WEXITSTATUS(status)) goto error;
} else if (!pid) {
    pid = fork();
    if (pid) _exit(pid<0);
    else {
        // do child work here
        _exit(0);
    }
} else goto error;
pid=fork();
如果(pid>0){
智力状态;
while(waitpid(pid,&status,0)和&!WIFEXITED(status)和&!WIFSIGNALED(status));
if(WIFSIGNALED(status)| | WEXITSTATUS(status))转到错误;
}否则如果(!pid){
pid=fork();

if(pid)_exit(pid我在想Glib的方法,除非你指定你不想要默认行为,否则它会自动获取子对象。

你可以忽略SIGCHLD,这样它就不会创建僵尸;)

信号(信号,信号);


这里的文档:

这也可以通过

prctl(PR\u SET\u PDEATHSIG,SIGTERM);

插入到子进程中的上述行可以在父进程死机时导致其终止。这也可以在任何子进程死机时(在它们成为子进程的父进程之后)起作用,如果您需要杀死子进程实际上是父进程死机,则在
fork()之前存储父进程的
pid
并在子流程中检查它

if(getppid()!=parent\u-pid\u-befork)

退出(1);

:终止但未等待的子进程将成为“僵尸”……如果父进程终止,则其“僵尸”子进程(如果有)将被init(8)采用,init(8)将自动执行等待以删除僵尸。“你可以对孩子进行daemonize处理,使其立即失去父母。@kaylum谢谢。我知道僵尸的事。我想有一种方法可以分叉()不需要收割,因为你不关心孩子的返回码,让系统自动收割孩子,这样就不会产生僵尸。你的问题不清楚。但是,@KerrekSB描述道。我很感激你的回答。谢谢。我也看到了。但我读到,旧Linux内核不支持它?当然,我正在工作ng在内核非常旧的嵌入式Linux系统上使用。@Chimera这是正确的:在与C99(ISO/IEC 9899:1999
一致的
POSIX.1-2001
之前不支持它。如果你使用的是旧系统,这将不起作用。@DevNull你真的否决了这个!这不是一个错误的答案,天哪。他从来没有在他的问题中说他使用旧内核!这不是连续的否决。我很好奇,尽管被证明是完全错误的,但前几天你为什么如此激烈地为你对我答案的批评辩护,所以我调查了ot她回答了你的问题,因为我很好奇你是否在传播错误信息,所以:我是对的。此外,TC在上面的评论中指出,他/她使用的是旧内核。