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

C语言创建僵尸进程及ps -l无对应进程显示问题咨询

问题根因

你的代码逻辑本身符合僵尸进程的生成规则,执行ps -l看不到对应进程通常是两个原因:

  • 执行ps -l的时机不对:子进程退出后保持僵尸状态的窗口只有父进程sleep(60)的60秒,等父进程休眠结束退出后,失去父进程的僵尸子进程会被系统1号进程(init/systemd)自动回收,此时再查ps自然看不到
  • ps -l默认仅列出当前终端关联的同会话进程,如果你是把程序放后台运行、或者新开终端执行ps命令,默认参数不会捕获其他会话的进程。僵尸进程在ps输出中的STAT列标识为Z,进程名后会带<defunct>标记。
可直接验证的修正代码

你可以在代码里增加PID打印逻辑,方便你精准定位进程,同时增加提示信息提醒你在有效时间窗口内执行查询:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    pid_t pid = fork();
    // 父进程分支
    if (pid > 0) {
        printf("父进程PID: %d,生成的子进程PID: %d\n", getpid(), pid);
        printf("60秒休眠窗口内可执行ps命令查看僵尸进程,超时后进程会被自动回收\n");
        sleep(60);
    }
    // 子进程分支
    else if (pid == 0) {
        exit(0);
    }
    // fork异常分支
    else {
        perror("fork调用失败");
        return 1;
    }
    return 0;
}
正确验证步骤
  1. 编译代码:执行gcc zombie.c -o zombie
  2. 运行程序:执行./zombie,程序会打印父子进程PID
  3. 不要等程序运行结束,在同一个终端内立刻执行ps -l,就能找到STAT列为Z+的僵尸子进程
  4. 如果要全局过滤所有僵尸进程,可以执行ps aux | grep Z,直接筛选出所有状态为僵尸的进程

说明:僵尸进程不占用CPU、内存等运行资源,仅在系统进程表中保留一个退出状态条目等待父进程调用wait()/waitpid()回收,所以查询时它的CPU占用率永远为0,属于正常现象。如果父进程一直不回收子进程就退出,僵尸进程会立刻被1号进程接管回收,不会永久残留在系统中。

内容的提问来源于stack exchange,提问作者Dev. Mahmoud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.07 15:03:22