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

C 分叉过程中的不同输出

C 分叉过程中的不同输出,c,linux,process,fork,pid,C,Linux,Process,Fork,Pid,我在下面附加的代码中得到了不同数量的输出。有时打印6个PID,有时打印8个PID所需输出为7个PID。虽然有时我能得到7个PID 流程树: A / | \ B C D / \ | E F G #include <stdio.h> void main() { int pidb=-1; if(fork()==0) pidb=getpid(); fork(); if(get

我在下面附加的代码中得到了不同数量的输出。有时打印6个PID,有时打印8个PID所需输出为7个PID。虽然有时我能得到7个PID

流程树:

          A
       /  |  \
      B   C   D
     / \  |
    E   F G
#include <stdio.h>

void main()
{
    int pidb=-1;
    if(fork()==0) pidb=getpid();
    fork();
    if(getppid()!=pidb) fork(); 
    printf("%d\n",getpid());
}
我的代码:

          A
       /  |  \
      B   C   D
     / \  |
    E   F G
#include <stdio.h>

void main()
{
    int pidb=-1;
    if(fork()==0) pidb=getpid();
    fork();
    if(getppid()!=pidb) fork(); 
    printf("%d\n",getpid());
}
#包括
void main()
{
int-pidb=-1;
如果(fork()==0)pidb=getpid();
fork();
if(getppid()!=pidb)fork();
printf(“%d\n”,getpid());
}
注意:假设fork调用将成功

[更新]


我们需要使用3个fork调用来实现它。

您忘记了包含所需的头文件。要使用
fork()
,您需要

   #include <sys/types.h>
   #include <unistd.h>
#包括
#包括
有了这个,我就能得到预期的输出

也就是说,在您的代码中,似乎并不等待子进程的完成

您需要在父进程中调用以等待子进程完成执行


另外,它不是
voidmain()
,实际上是
intmain(void)
。最后返回0是一种很好的做法。

你能详细说明一下吗?为什么即使有“if”语句,它也会打印8个输出。有什么必要包括wait()调用???@sidkamaria如果您不在主进程中等待,那么当您的子进程正在进行且主进程终止时,其子进程也将终止,因此您的打印消息将不会出现pid定义为“pid_t”,不作为int。在子进程仍在运行时退出父进程可能会产生子进程的僵尸进程,因此执行“fork()”的每个进程都需要等待其“子进程”退出。getppid()和getpid()以及fork()系统调用需要#include和#include,而不需要这些#include,编译器将假定所有值和返回类型都是“int”,如果没有这些#includes,编译器(您正在启用所有警告,是的)将抱怨使用这些默认参数和返回类型
#include <stdio.h>

    void main()
    {
        int pidb=-1;
        if(fork()==0) pidb=getpid();
        fork();
        if(getppid()!=pidb) fork();
        wait(NULL);  // Wait for all child process
        printf("%d\n",getpid());
    }