【发布时间】:2019-07-17 20:30:20
【问题描述】:
我最近遇到了这段代码,并没有完全理解它。
- 什么情况会导致pid == 0?
- 为什么 wait(NULL) 会导致程序进入 if(pid == 0)
基本上我不完全理解下面的输出。任何帮助,将不胜感激。谢谢。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // standard POSIX header file
#include <sys/wait.h> // POSIX header file for 'wait' function
int main(void)
{
int i = -1;
int pid;
pid = getpid();
fprintf(stdout, "parent pid = %d\n", pid);
pid = fork();
if (pid == 0)
{
for (i = 0; i < 10; ++i)
{
fprintf(stdout, "child process: %d\n", i);
sleep(1);
}
exit(0);
}
else
{
fprintf(stdout, "child pid = %d\n", pid);
fprintf(stdout, "waiting for child\n");
wait(NULL);
fprintf(stdout, "child terminated\n");
}
fprintf(stdout, "parent terminating\n");
return 0;
}
输出:
parent pid = 2896
child pid = 5840
waiting for child
child process: 0
child process: 1
child process: 2
child process: 3
child process: 4
child process: 5
child process: 6
child process: 7
child process: 8
child process: 9
child terminated
parent terminating
【问题讨论】:
-
父进程在
fork()之后收到子进程的pid,子进程和父进程都开始并发执行。现在,持有 pid 的父变量拥有孩子的 pid,而孩子中的同一个变量持有 0。 -
请记住,成功的
fork()会返回两次,分别在两个单独的进程中返回一次。在子(新)进程中,返回值始终为0。在父(旧)进程中,返回值是新(子)进程的PID。如果fork()失败了,那么父进程会得到-1的返回值,就不用担心子进程了。 -
你的代码应该调用fflush(3),就像
fflush(NULL);之前fork -
wait(NULL),强制父进程等待子进程,直到子进程完成工作。 stackoverflow.com/a/45762189/7508077