You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:39:00