关于C语言fork()、sleep()、wait()多进程执行逻辑的疑问
现有代码执行逻辑梳理
- 父进程启动后首先进入5次的for循环,每次循环调用
fork()创建新的子进程:- 对于
fork()返回值为0的子进程,会直接进入childProcess()执行,循环5次打印自身PID和指定内容,每次打印后调用sleep(1)挂起1秒,执行完所有循环后调用exit(0)主动退出 - 对于父进程,
fork()会返回新创建子进程的PID,父进程不会进入子进程逻辑,直接继续下一轮循环创建下一个子进程
- 对于
- 5个子进程全部创建完成后,父进程进入
wait()循环,阻塞等待所有子进程退出 - 所有子进程是并行调度执行的,5个子进程的打印顺序由操作系统调度决定,无固定先后,整体执行时长约为5秒,而非串行的25秒
- 现有代码的父进程仅做等待操作,未处理
wait()的返回值,因此不会打印退出子进程的PID信息
父进程打印退出子进程PID的实现方案
wait()函数的返回值就是已正常退出的子进程的PID,仅当所有子进程都已退出时wait()会返回-1,因此只需修改父进程的等待逻辑,捕获wait()的返回值并打印即可,修改后代码如下:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> void childProcess(void); void childProcess(void) { for(int i = 0; i < 5; i++) { printf("pid: %d email: myemail\n", getpid()); sleep(1); } } int main(int argc, char *argv[]) { for (int i = 0; i < 5; i++) { pid_t childpid; if ((childpid = fork()) == 0) { childProcess(); exit(0); } } int status; pid_t exit_pid; while ((exit_pid = wait(&status)) > 0) { printf("子进程 %d 已执行完毕退出\n", exit_pid); } return 0; }
修改后每次有子进程退出,父进程都会立刻打印对应子进程的PID,打印顺序和子进程的退出顺序一致,与创建顺序无必然关联。
内容的提问来源于stack exchange,提问作者mixalis petros
相关产品推荐
相关产品推荐

