【发布时间】:2021-11-07 16:47:58
【问题描述】:
在这段代码中(在linux上运行):
void child_process()
{
int count=0;
for(;count<1000;count++)
{
printf("Child Process: %04d\n",count);
}
printf("Child's process id: %d\n",getpid());
}
void parent_process()
{
int count=0;
for(;count<1000;count++)
{
printf("Parent Process: %04d\n",count);
}
}
int main()
{
pid_t pid;
int status;
if((pid = fork()) < 0)
{
printf("unable to create child process\n");
exit(1);
}
if(pid == 0)
child_process();
if(pid > 0)
{
printf("Return value of wait: %d\n",wait();
parent_process();
}
return 0;
}
如果代码中不存在wait(),则其中一个进程(子进程或父进程)将完成它的执行,然后将控制权交给 linux 终端,最后剩下的进程(子进程或父进程)将跑步。这种情况的输出是:
Parent Process: 0998
Parent Process: 0999
guest@debian:~/c$ Child Process: 0645 //Control given to terminal & then child process is again picked for processing
Child Process: 0646
Child Process: 0647
如果代码中出现wait(),执行流程应该是什么?
当调用fork() 时,必须创建一个包含父进程和子进程的进程树。上述代码在子进程处理结束时,通过wait()系统调用通知父子僵尸进程死亡,但是父子进程是两个独立的进程,控制权是否必须通过子进程结束后直接到父进程?(根本没有控制权给其他进程,如终端) - 如果是,那么就像子进程是父进程的一部分(就像从另一个函数调用的函数) .
【问题讨论】:
-
捕获并打印来自系统调用的返回值(通过在代码中包含
getpid()的返回值来识别正在打印的进程。 -
@JonathanLeffler 谢谢,子进程的 PID 的返回值和
wait()的返回值是一样的,但是不清楚控制权是否直接从子进程转移到父进程,中间没有其他进程(如未使用wait()时的终端。 -
我相信没有 wait() 流程会跟随。 - 终端产生父进程,父进程产生子进程。子进程没有控制,它只能访问相同的标准输入和标准输出。一旦父进程完成,它就会退出,并将控制权返回给终端,而子进程在后台运行。使用wait:父进程产生子进程,然后执行wait,等待子进程完成。然后它执行剩下的代码结束退出。
-
没有这样的保证;其他进程可以随时运行。但在正常用例中,不会有任何其他进程甚至试图从该终端读取或写入。唯一可能的候选者是 shell,它本身就是
wait()ing 让父级终止,而不是执行终端 I/O。 -
fork()和wait()的主要应用是让孩子调用exec*函数之一,以运行另一个程序。您不能在子例程中执行此操作,因为exec*不会返回。这就是system()的工作方式,这也是 shell 首先运行程序的方式。
标签: c operating-system fork wait