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

循环中调用fork是否生成并行进程?代码及wait调用相关疑问

关于fork机制的代码执行逻辑解答

首先贴出你提供的代码:

void error(char* s){
    perror(s);
    exit(errno);
}

int main(int argc,char *argv[]){
    for(int i = 0;i<5;i++){
        int reason;
    
        int f = fork();
            switch(f){
                case -1:
                error("fork");
                case 0:
                execl("/bin/echo","echo","y",NULL);
                break;
                default:
                printf("over");
            }
        }
}

1. 这段代码是否会创建并行进程?

是的,它会创建5个并行运行的子进程。

  • 循环执行5次fork(),每次调用都会生成一个独立的子进程,子进程通过execl执行echo y命令,执行完成后退出。
  • 父进程在每次fork成功后直接进入default分支打印over,不会等待子进程结束,所以所有子进程会和父进程、其他子进程同时运行,输出的y和over顺序可能是混乱的(取决于系统调度)。

2. 在父进程中添加wait调用是否转为串行执行?

这取决于wait的放置位置:

  • 如果将wait()放在循环内的default分支中(每次创建子进程后立刻等待):
    父进程会在创建一个子进程后,暂停等待该子进程执行完毕,才会进入下一次循环创建下一个子进程。此时子进程会逐个串行执行,输出的y会按顺序出现,over也会在每个y之后打印。
  • 如果将wait()放在循环外部(比如循环结束后调用wait(NULL)五次):
    所有子进程依然会被并行创建并运行,父进程只是在最后等待所有子进程全部结束,子进程的执行顺序还是由系统调度决定,属于并行执行。

原代码的一处不规范点

switch的case -1分支后没有添加break,虽然error函数里有exit不会继续执行后续代码,但这是不良编码习惯,建议在case -1后加上break,避免逻辑隐患。


内容的提问来源于stack exchange,提问作者Motcho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:40:40