进程c语言,不是说父历程wait会给子进程收尸吗?为什么还是僵尸进程..."/>
结束僵尸进程c语言,不是说父历程wait会给子进程收尸吗?为什么还是僵尸进程...
不是说父进程wait会给子进程收尸吗?为什么还是僵尸进程?
不是说父进程wait会给子进程收尸吗?为什么此时子进程还是僵尸进程?
如下代码:
#include
#include
int main()
{
pid_t P = fork();
if( P == 0)
{
printf("子进程...\n");
exit(0);
}
wait();
printf("父进程在等待...\n");
sleep(50);
return 0;
}
在程序结束之前,也就是父进程wait之后sleep的时候,进程状态如下:
pbate 4117 0.0 0.0 3212 316 pts/12 S+ 10:57 0:00 ./ZZZ
pbate 4118 0.0 0.0 0 0 pts/12 Z+ 10:57 0:00 [ZZZ]
此时已经wait了,为什么子进程还是僵尸进程?
------解决方案--------------------
我表示没有问题
#include
#include
#include
#include
int main()
{
pid_t Pid = fork();
if( Pid == 0)
{
//sleep(1);
printf("子进程...\n");
exit(0);
}
printf("wait before.............\n");
wait(NULL);
printf("wait after..............\n");
sleep(50);
return 0;
}
至于出现出入不同,以前在红帽5下也遇到过,可能是内核版本问题
------解决方案--------------------
重启下电脑,或者换个系统,换个电脑试试,
------解决方案--------------------
引用:引用:重启下电脑,或者换个系统,换个电脑试试,
确实哦。 我换了一个系统,用centos测试了一下,发现就没有那个问题了。
但是两个都是linux,内核都是2.6,小版本不一样。 为什么处理的结果会不一样呢 ?
这个和什么操作系统,内核版本无关。
完全是进程调度和你加的printf造成的时间延时的结果。
------解决方案--------------------
聋子打岔一下:
《Windows编程启示录》
19.6 为什么有些进程在被终止之后还停留在任务管理器中
当某个进程结束时(可能是正常结束,也可能是因为调用了像TerminateProcess之类的函数),这个进程的用户态模块将被删除。但内核态模块只有在与线程相关的所有驱动程序执行完成之后才会被删除。
例如,如果某个线程正处于I/O操作中,那么将会给负责I/O的驱动程序发送一个内核信号来取消这个操作。
如果驱动程序的行为是良好的,那么它将清除与这个未完成I/O相关的一些信息并且释放线程。
如果驱动程序的行为是不好的(可能是因为驱动程序管理的硬件表现出奇怪的行为),那么可能需要花很长的时间来清除这个未完成的I/O。在这段时间里,驱动程序将不会释放这个线程(以及这个线程所在的进程)。实际的情况要更复杂一些,但这里的简单模型对于我们的讨论已经足够。
……
换句话说,如果你终止了某个进程后还能在任务管理器中看到这个进程,那么实际上这个进程已经停止运行了,只不过还有些残留的信息保留在系统中,只有当与这个进程相关的所有驱动程序都完成了清除操作并且指向这个进程的句柄都已经关闭,进程才会完全消失。
------解决方案--------------------
引用:引用:LZ的wait()可以编译过?
C/C++ code?123456789101112131415161718192021# include # include # include # include # include ……
更多推荐
结束僵尸进程c语言,不是说父历程wait会给子进程收尸吗?为什么还是僵尸进程...
发布评论