如何用pstree展示C语言中32个子进程的进程树?附代码验证
代码正确性分析
咱们先拆解你的代码逻辑:核心思路是没问题的——父进程循环32次调用fork()生成子进程,每个子进程睡眠5秒后退出,父进程最后通过waitpid()等待所有子进程结束。不过有几个细节需要完善:
- 缺少必要头文件:要让
fork()、sleep()、waitpid()这些系统调用正常编译,必须包含<stdio.h>、<unistd.h>、<sys/wait.h>,如果要处理错误退出,还需要<stdlib.h>。 - 变量声明兼容性:如果你的编译器遵循C89标准,
for循环内直接声明int i是不允许的(C89要求变量声明在代码块最开头),不过现在GCC、Clang这些主流编译器默认支持C99,这个问题不大,但如果要兼容老环境,最好把i的声明移到main函数开头。 - 未处理
fork()失败场景:当系统资源不足时,fork()会返回-1,这时候父进程会继续循环,但最终还是会执行32次waitpid(),可能出现无意义的等待(因为实际生成的子进程不足32个)。如果要更严谨,可以在fork()后判断返回值,做错误处理。
修正后的参考代码如下:
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <stdlib.h> int main() { int i; for(i = 0; i < 32; ++i) { pid_t pid = fork(); if(pid == -1) { perror("fork failed"); exit(EXIT_FAILURE); } else if(pid == 0) { sleep(5); return 0; } // 父进程继续生成下一个子进程 } // 等待所有子进程结束 for(i = 0; i < 32; ++i) { waitpid(-1, NULL, 0); } return 0; }
用
pstree查看进程树的方法 因为子进程会睡眠5秒,你有足够时间查看进程树,步骤如下:
- 先编译代码:
gcc your_code.c -o proc_demo(把your_code.c换成你的源文件名) - 运行程序并放到后台:
./proc_demo &- 终端会输出类似
[1] 12345的内容,其中12345就是父进程的PID
- 终端会输出类似
- 使用
pstree查看:- 直接查看指定父进程的进程树:
pstree -p 12345,-p参数会显示每个进程的PID,方便你确认子进程数量是否为32 - 如果想在全局进程中快速定位:
pstree -p | grep proc_demo - 或者直接运行
pstree,找到你的父进程名称,就能看到它下面挂着32个子进程
- 直接查看指定父进程的进程树:
示例输出大概是这样:
proc_demo(12345)─┬─proc_demo(12346) ├─proc_demo(12347) ├─proc_demo(12348) ... └─proc_demo(12377)
内容的提问来源于stack exchange,提问作者axel_87
相关产品推荐
相关产品推荐

