理解fork(),sleep()和进程stream量

一直与这些系统调用练习,但我stucked到这个代码:

#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> main() { pid_t pid; switch(pid = fork()) { case -1: printf("fork failed"); break; case 0: //first child printf("\ni'm the first child, my pid is %d", getpid()); fflush(stdout); break; default: //parent sleep(5); /** sleep is generating problems **/ printf("\ni'm the parent process, my pid is %d", getpid()); printf("\ngenerating a new child"); fflush(stdout); switch(pid = fork()) { case -1: printf("fork failed"); break; case 0: //second child printf("\nhere i am, the second child, my pid is %d", getpid()); break; default: //parent wait((int *)0); printf("\nback to parent, my pid is %d", getpid()); } } return 0; } 

我得到的输出是:

 我是第一个孩子,我的pid是6203
我是父母的过程,我的pid是6202
生成一个新的孩子
回到父母,我的pid是6202
进程返回0(0x0)执行时间:5.004秒
按ENTER继续

在这里,我是第二个孩子,我的pid是6204 

我正在尝试的是通过sleep()pipe理这些时间的简单打印。 我不明白为什么该程序在打印第二个子消息之前返回。 默认情况下(第二个分叉后面的那个)在其子(第二)作用于输出之前被打印,就像他忽略了wait() 。 因此,它的孩子在过程返回后被打印出来。

我无法弄清楚是什么问题。 我标记了sleep()函数,因为如果用wait((int *)0);replace它, 过程stream量正在如何devise(无论如何,没有任何时间)。 在这一点上,我不再确定过程stream量,或睡眠()使用(手册页没有那么有用,太简单,说实话)。

其实,你的电话等待工作。 它检测到第一个子进程的结束,然后继续。 如果你连续两次调用wait(),你将会得到正确的行为。

更新测试代码:

 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> main() { pid_t pid; int status; switch(pid = fork()) { case -1: printf("fork failed"); break; case 0: //first child printf("\ni'm the first child, my pid is %d", getpid()); fflush(stdout); break; default: //parent sleep(5); /** sleep is generating problems **/ printf("\ni'm the parent process, my pid is %d", getpid()); printf("\ngenerating a new child"); fflush(stdout); switch(pid = fork()) { case -1: printf("fork failed"); break; case 0: //second child printf("\nhere i am, the second child, my pid is %d", getpid()); break; default: //parent pid = wait(&status); printf("\nParent detects process %d was done", pid); pid = wait(&status); printf("\nParent detects process %d was done", pid); printf("\nback to parent, my pid is %d", getpid()); } } return 0; } 

输出:

 i'm the first child, my pid is 30897 i'm the parent process, my pid is 30896 generating a new child here i am, the second child, my pid is 30940 Parent detects process 30897 was done Parent detects process 30940 was done back to parent, my pid is 30896 

等待的手册页面如下:

wait()函数应暂停调用线程的执行,直到调用进程的一个已终止的子进程的状态信息可用,或者直到传递一个信号,该信号的动作是执行信号捕获功能或终止处理。 如果多个线程挂起在wait()或waitpid()等待同一个进程终止,那么只有一个线程会在目标进程终止时返回进程状态。

等第一个孩子回来。