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

如何用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秒,你有足够时间查看进程树,步骤如下:

  1. 先编译代码:gcc your_code.c -o proc_demo(把your_code.c换成你的源文件名)
  2. 运行程序并放到后台:./proc_demo &
    • 终端会输出类似[1] 12345的内容,其中12345就是父进程的PID
  3. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:32:51