写一个僵尸进程
wait.c
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/wait.h>
-
- int main(int argc, char **argv)
- {
- pid_t pid;
-
- pid = fork();
- if (pid == 0) { // child
- printf("child pid = %d\n", getpid());
- printf("in child...\r\n");
- sleep(2);
- } else if (pid > 0) { // father
- sleep(10); /* 子进程 2s 钟后提前结束,等待父进程回收其资源,在这期间,子进程处于僵尸状态 */
- wait(NULL);
- }
-
- return 0;
- }
-
- $ gcc wait.c -o wait.out
- $ ./wait.out
- child pid = 52322
- in child ...
- $ ps aux
- USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
- root 1 0.0 0.1 169028 12960 ? Ss 07:10 0:03 /sbin/init splash
- root 2 0.0 0.0 0 0 ? S 07:10 0:00 [kthreadd]
- ...
- liyongj+ 52321 0.0 0.0 2364 588 pts/3 S+ 21:39 0:00 ./wait.out
- liyongj+ 52322 0.0 0.0 2496 76 pts/3 S+ 21:39 0:00 ./wait.out
- liyongj+ 52323 0.0 0.0 14584 3316 pts/4 R+ 21:39 0:00 ps aux
-
在 wait.out 程序执行后立马使用 ps aux 查看进程信息,可以看到,wait.out 克隆出一个子进程,父子进程均处于 S(interruptible sleep, 可中断睡眠状态))状态。
2 秒钟之后再次运行 ps aux 查看进程状态
- $ ps aux
- USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
- root 1 0.0 0.1 169028 12960 ? Ss 07:10 0:03 /sbin/init splash
- root 2 0.0 0.0 0 0 ? S 07:10 0:00 [kthreadd]
- ...
- liyongj+ 52321 0.0 0.0 2364 588 pts/3 S+ 21:39 0:00 ./wait.out
- liyongj+ 52322 0.0 0.0 0 0 pts/3 Z+ 21:39 0:00 [wait.out] <defunct>
- liyongj+ 52324 0.0 0.0 14584 3312 pts/4 R+ 21:39 0:00 ps aux
-
可以看到子进程52322 已经变成 Z(僵尸状态)。
ps:对于进程状态不了解的可以参考这篇文章。