Linux中,子进程应结束,但父进程无法将其结束,则此进程处于僵尸状态,这时STAT为Z,COMMAND为defunct
发布网友
发布时间:2022-04-26 09:11
我来回答
共2个回答
热心网友
时间:2023-10-09 04:17
错,子进程结束后,父进程没有用wait来收集子进程的退出状态,子进程的信息就会一直留在进程表中,成为zombie, 我下面的例子给你演示了如何让子进程成为僵尸,然后又如何让子进程结束这个状态。
我的例子中,子进程打印一句话后就结束了,而父进程忽略了 SIGCHLD (子进程结束运行)的信号,并且不停的打印 parent loop xxxx 长达20秒,在这20秒内,你可以用 ps 看到 子进程状态是 Z, defunct。 20秒后,父进程调用 wait来收集子进程的退出状态,这样子进程就被从进程表中清除掉了,然后再等20秒,这个时候你再ps就看不到僵尸子进程了。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sig_handler(int sig)
{
if (sig == SIGCHLD)
{
printf("SIGCHLD is ignored by parent!\n");
}
}
int main()
{
int pid, i;
pid = fork();
if (pid == 0)
{
printf("This is child process!\n");
sleep(1);
printf("child process quit\n");
return 0;
}
else
{
signal(SIGCHLD, sig_handler);
printf("Arm SIGCHLD handler OK.\n");
sleep(2);
printf("this is parent process...\n");
for (i = 0; i < 10; i++)
{
sleep(2);
printf("Parent process loop %d times\n", i);
}
wait(0);
for (i = 0; i < 10; i++)
{
sleep(2);
printf("after wait\n");
}
}
return 0;
}
热心网友
时间:2023-10-09 04:17
还有上百度来文这种问题的。。。
应该上专业论坛嘛。。。推荐CSDN阿