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; }
正确验证步骤
- 编译代码:执行
gcc zombie.c -o zombie - 运行程序:执行
./zombie,程序会打印父子进程PID - 不要等程序运行结束,在同一个终端内立刻执行
ps -l,就能找到STAT列为Z+的僵尸子进程 - 如果要全局过滤所有僵尸进程,可以执行
ps aux | grep Z,直接筛选出所有状态为僵尸的进程
说明:僵尸进程不占用CPU、内存等运行资源,仅在系统进程表中保留一个退出状态条目等待父进程调用
wait()/waitpid()回收,所以查询时它的CPU占用率永远为0,属于正常现象。如果父进程一直不回收子进程就退出,僵尸进程会立刻被1号进程接管回收,不会永久残留在系统中。
内容的提问来源于stack exchange,提问作者Dev. Mahmoud
相关产品推荐
相关产品推荐

