C 分叉过程中的不同输出
我在下面附加的代码中得到了不同数量的输出。有时打印6个PID,有时打印8个PID所需输出为7个PID。虽然有时我能得到7个PID 流程树: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
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());
}