多进程Fork:父进程如何创建两组子进程分别执行不同函数
如何让父进程创建两组执行不同函数的子进程
嘿,这个问题其实很好解决~核心要抓住一个关键点:只有父进程负责创建所有子进程,子进程执行完自己的任务就立刻退出,别跟着跑父进程后续的代码。
你原来的代码已经能正确创建一组子进程执行function(),那要加另一组执行另一个函数(比如function2()),只需要在第一个fork循环结束后,再写一个逻辑完全类似的循环就行。
完整代码示例
#include <unistd.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> // 第一组子进程要执行的函数 void function() { printf("Child %d: Running function()\n", getpid()); } // 第二组子进程要执行的函数 void function2() { printf("Child %d: Running function2()\n", getpid()); } int main() { pid_t pid; int first_group_count = 3; // 第一组子进程的数量 int second_group_count = 2; // 第二组子进程的数量 int i; // ===== 创建第一组子进程 ===== for (i = 0; i < first_group_count; ++i) { if ((pid = fork()) < 0) { perror("Failed to fork for first group"); continue; // 出错了也继续尝试创建剩下的子进程 } else if (pid == 0) { // 子进程:执行函数后立刻退出 function(); exit(EXIT_SUCCESS); } // 父进程:啥也不用做,继续循环创建下一个子进程 } // ===== 创建第二组子进程 ===== for (i = 0; i < second_group_count; ++i) { if ((pid = fork()) < 0) { perror("Failed to fork for second group"); continue; } else if (pid == 0) { function2(); exit(EXIT_SUCCESS); } } // ===== 父进程等待所有子进程结束 ===== int status; // 循环等待,直到所有子进程都退出(wait返回-1时表示没有子进程了) while (wait(&status) > 0) { // 可以在这里处理子进程的退出状态,比如判断是否正常退出 if (WIFEXITED(status)) { printf("Child exited with status %d\n", WEXITSTATUS(status)); } } printf("All children have finished. Parent process exiting.\n"); return EXIT_SUCCESS; }
关键逻辑解释
- 子进程必须退出:每个子进程执行完目标函数后立刻调用
exit(),这样就不会进入后续的循环(比如第二组的fork循环),避免子进程再创建额外的子进程,导致混乱。 - 父进程持续创建:父进程在每次fork后,拿到子进程的PID,直接继续下一次循环,完成第一组的创建后,再进入第二组的循环,继续创建另一批子进程。
- 等待所有子进程:最后的
while(wait(&status) > 0)会等待所有子进程退出,不管是哪一组的,这样能避免僵尸进程的产生。如果需要单独等待某一组的子进程,可以提前保存每个子进程的PID,然后用waitpid()逐个等待,但大多数场景下,统一等待所有子进程就足够了。
额外提醒
- 错误处理部分可以根据你的需求调整,比如如果fork失败,是否要终止整个程序,还是继续创建剩下的子进程。
- 如果两组子进程需要有不同的执行逻辑(比如传递不同的参数),只需要在子进程里调用函数时传入对应的参数即可,核心的fork逻辑不变。
内容的提问来源于stack exchange,提问作者Jordan C
相关产品推荐
相关产品推荐

