C进程编程:如何确保子进程结束消息先于父进程输出?
解决父子进程输出顺序同步问题
要实现子进程的第二条消息始终在父进程第二条消息之前输出,核心是让父进程等待子进程完成所有输出后,再执行自己的最后一条输出。默认情况下父子进程是并发执行的,操作系统调度顺序不确定,所以需要用进程同步机制,最直接简单的方式就是用waitpid(或wait)让父进程阻塞等待子进程终止。
完整代码实现
#include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> int main() { // 创建子进程 pid_t pid = fork(); // 处理fork失败的情况 if (pid == -1) { perror("fork failed"); exit(EXIT_FAILURE); } // 子进程分支 else if (pid == 0) { printf("I am the child\n"); printf("The child is done\n"); // 子进程完成任务后退出 exit(EXIT_SUCCESS); } // 父进程分支 else { printf("I am the parent\n"); // 等待指定的子进程终止,阻塞父进程 waitpid(pid, NULL, 0); // 子进程终止后,父进程再输出最后一条消息 printf("The parent is done\n"); } return 0; }
代码解释
fork():创建一个新的子进程,返回值在父进程中是子进程的PID,在子进程中是0,失败则返回-1。- 子进程逻辑:直接输出两条消息后调用
exit退出,确保所有输出操作在子进程终止前完成(注意printf带\n会自动刷新缓冲区,避免输出延迟)。 - 父进程逻辑:先输出第一条消息,然后调用
waitpid(pid, NULL, 0)——这个函数会让父进程暂停执行,直到PID为pid的子进程完全终止。等子进程结束后,父进程才会继续执行,输出第二条消息,这样就严格保证了子进程的第二条消息在父进程之前出现。
其他可选方案(拓展)
如果你需要更精细的同步(比如不需要等子进程完全退出,只需要等它输出第二条消息后父进程再输出),还可以用管道或信号机制:
- 管道:子进程输出第二条消息后向管道写一个标记,父进程读取到标记后再输出自己的第二条消息。
- 信号:子进程输出第二条消息后向父进程发送一个自定义信号,父进程收到信号后再输出最后一条消息。
不过对于你的需求来说,waitpid是最简洁且可靠的方案,不需要额外的复杂逻辑。
内容的提问来源于stack exchange,提问作者VKS543
相关产品推荐
相关产品推荐

