分叉过程中的不同输出
Different outputs while forking process
我在下面的附加代码中得到了不同数量的输出。有时它打印 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());
}
注意:假设fork调用成功。
[更新]
我们需要使用 3 个 fork 调用来实现它。
您忘记包含所需的头文件。要使用 fork()
,您需要
#include <sys/types.h>
#include <unistd.h>
有了这个,我就能得到预期的输出。
也就是说,在您的代码中,您似乎没有等待子进程完成。
您需要在父进程中调用 wait()
以等待子进程完成执行。
此外,它不是 void main()
,实际上是 int main(void)
。最后的 return 0
是个好习惯。
#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());
}
这就是你想要的。
这将打印这 7 个进程的 7 个 pid
最终的流程树是这样的
A (First fork)
/ \
B c (2nd fork)
/ \ / \
D E F G (3rd fork)
/ \ / \ /\ |
1 2 3 4 5 6 7
我在下面的附加代码中得到了不同数量的输出。有时它打印 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());
}
注意:假设fork调用成功。
[更新]
我们需要使用 3 个 fork 调用来实现它。
您忘记包含所需的头文件。要使用 fork()
,您需要
#include <sys/types.h>
#include <unistd.h>
有了这个,我就能得到预期的输出。
也就是说,在您的代码中,您似乎没有等待子进程完成。
您需要在父进程中调用 wait()
以等待子进程完成执行。
此外,它不是 void main()
,实际上是 int main(void)
。最后的 return 0
是个好习惯。
#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());
}
这就是你想要的。 这将打印这 7 个进程的 7 个 pid
最终的流程树是这样的
A (First fork)
/ \
B c (2nd fork)
/ \ / \
D E F G (3rd fork)
/ \ / \ /\ |
1 2 3 4 5 6 7