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

操作系统课程C语言作业问题:父进程创建两子进程实现指定输出

进程创建与等待的代码实现方案

你的核心问题是没区分父进程和两个子进程的执行逻辑,导致所有进程都执行了相同的打印,且父进程没有完成等待子进程的要求。先拆解需求,再修正代码:

需求回顾

  • 父进程创建两个子进程
  • 每个子进程退出前打印自身PID和PPID
  • 父进程创建完子进程后调用wait()等待,所有子进程退出后打印自身PID

现有代码的问题

  1. 未区分进程角色:父进程和两个子进程都执行了相同的printf,无法实现各自的打印需求
  2. 父进程未执行等待逻辑:导致父进程可能先于子进程退出,子进程的PPID变为1(init进程),且父进程没完成最终打印自身PID的要求

修正后的代码

#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>

int main(){
    int first_fork = fork();

    if (first_fork == 0) {
        // 第一个子进程:打印自身PID和PPID后退出
        printf("子进程 PID: %d, PPID: %d\n", getpid(), getppid());
        exit(0);
    } else if (first_fork > 0) {
        // 父进程:创建第二个子进程
        int second_fork = fork();
        if (second_fork == 0) {
            // 第二个子进程:打印自身PID和PPID后退出
            printf("子进程 PID: %d, PPID: %d\n", getpid(), getppid());
            exit(0);
        } else if (second_fork > 0) {
            // 父进程:等待两个子进程退出
            wait(NULL); // 等待第一个子进程
            wait(NULL); // 等待第二个子进程
            // 所有子进程退出后打印自身PID
            printf("父进程 PID: %d\n", getpid());
        } else {
            // 第二个fork失败
            perror("fork failed");
            exit(1);
        }
    } else {
        // 第一个fork失败
        perror("fork failed");
        exit(1);
    }

    return 0;
}

代码解释

  • 第一个子进程:first_fork == 0时进入,直接打印自身PID和PPID后退出
  • 父进程:first_fork > 0时进入,再次fork创建第二个子进程
    • 第二个子进程:second_fork == 0时进入,打印信息后退出
    • 父进程最终逻辑:两次调用wait(NULL)等待两个子进程全部退出,之后打印自身PID
  • 增加了fork()失败的错误处理,避免异常情况

预期运行结果示例

子进程 PID: 12345, PPID: 12344
子进程 PID: 12346, PPID: 12344
父进程 PID: 12344

内容的提问来源于stack exchange,提问作者Newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:35:23