You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:30:00