循环中调用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
相关产品推荐
相关产品推荐

