使用fork()创建n个子进程并在全部创建及父进程执行完成后处理子进程
问题原因
你的代码中子进程被创建后会直接执行自身逻辑并退出,没有等待父进程完成全部子进程创建、以及父进程自身逻辑执行完毕的流程,所以会出现子进程提前运行的问题。
解决方案
我们可以通过信号通知机制实现需求:子进程创建后先阻塞等待父进程的通知信号,父进程完成所有子进程创建和自身逻辑后,再批量通知所有子进程开始执行。
修改后完整代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h> #define STRLONG 1024 // 空信号处理函数,仅用于捕获信号让pause()正常返回 void empty_handler(int sig) {} int main(int argc, char *argv[]) { char cadena[STRLONG]; pid_t pid; // 存储所有子进程PID,方便后续批量发通知信号 pid_t child_pids[5]; // 注册SIGUSR1信号的处理逻辑 signal(SIGUSR1, empty_handler); for(int i =0; i<5; i++){ pid = fork(); if(pid == -1){ perror("fork error"); exit(-1); } else if(pid == 0){ // 子进程阻塞挂起,等待父进程的通知信号 pause(); // 收到信号后再执行子进程业务逻辑 printf("I'm the child --> %d \n", getpid()); exit(0); } else { // 父进程保存刚创建的子进程PID child_pids[i] = pid; } } // 父进程自身逻辑执行 printf("I'm the parent, --> %d\n", getpid()); // 父进程给所有子进程发信号,通知它们可以开始执行 for(int i = 0; i<5; i++){ kill(child_pids[i], SIGUSR1); } // 等待所有子进程执行完毕退出 for(int i = 0; i<5; i++){ wait(NULL); } return 0; }
逻辑说明
- 提前定义数组存储所有子进程的PID,用于父进程后续批量发送通知信号
- 注册空的SIGUSR1信号处理函数,避免子进程收到信号后触发默认终止逻辑
- 子进程创建后先调用
pause()阻塞挂起,直到收到父进程的信号才会继续向下执行 - 父进程完成5个子进程的全部创建、执行完自身逻辑后,遍历PID数组给所有子进程发送SIGUSR1信号唤醒子进程
- 最后父进程等待所有子进程执行完毕后再退出
内容的提问来源于stack exchange,提问作者angel.bn
相关产品推荐
相关产品推荐

