如何改写forkexetest.c创建两个执行childtest的子进程(子进程不超3个)
改写forkexetest.c实现双进程exec并控制进程总数
要实现创建两个子进程且均通过exec调用childtest,同时保证总进程数不超过3(父进程+2个子进程),只需对原forkexetest.c做如下修改:
改写后的完整代码
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <wait.h> int main(void){ int pid, cpid; int status; int i; // 循环创建2个子进程 for(i = 0; i < 2; i++){ pid = fork(); if(pid == -1){ perror("fork error"); exit(-1); } if(pid == 0){ // 子进程直接执行childtest,替换当前进程映像,不会再创建新进程 execl("./childtest", "childtest", (char *)NULL); perror("exec error"); exit(-1); } // 父进程继续循环创建下一个子进程 } // 父进程执行自身逻辑 printf("[parent] process pid=%d...\n", getpid()); for(i = 0; i < 5; i++){ printf("[parent] %d\n", i); sleep(1); } // 等待所有子进程结束,避免僵尸进程 for(i = 0; i < 2; i++){ cpid = wait(&status); if(cpid == -1){ perror("wait error"); exit(-1); } printf("[parent] child process(%d) status %d\n", cpid, status>>8); } printf("[parent] process finished\n"); return 0; }
关键改动说明
- 循环创建两个子进程:通过
for循环执行两次fork,父进程每次fork后继续创建下一个子进程,子进程则立即调用execl执行childtest,替换自身进程映像,不会产生额外进程。 - 等待所有子进程退出:新增循环调用
wait,确保父进程等待两个子进程都结束后再退出,避免僵尸进程残留。 - 保证进程总数不超过3:每个子进程在
fork后直接执行exec,不会再创建新进程;父进程仅创建两个子进程,因此总进程数始终为父进程+2个子进程,共3个,符合要求。
注意事项
编译时需确保childtest已编译生成可执行文件,且与forkexetest在同一目录下,或在execl中指定完整路径。
内容的提问来源于stack exchange,提问作者nico
相关产品推荐
相关产品推荐

