操作系统课程C语言作业问题:父进程创建两子进程实现指定输出
进程创建与等待的代码实现方案
你的核心问题是没区分父进程和两个子进程的执行逻辑,导致所有进程都执行了相同的打印,且父进程没有完成等待子进程的要求。先拆解需求,再修正代码:
需求回顾
- 父进程创建两个子进程
- 每个子进程退出前打印自身PID和PPID
- 父进程创建完子进程后调用
wait()等待,所有子进程退出后打印自身PID
现有代码的问题
- 未区分进程角色:父进程和两个子进程都执行了相同的
printf,无法实现各自的打印需求 - 父进程未执行等待逻辑:导致父进程可能先于子进程退出,子进程的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
相关产品推荐
相关产品推荐

