非常非常怪异的进程异常问题!调用exit(1)后进程只休眠。
在Linux下,我写了一个C程序,启动后有一个父进程 和 n个子进程,程序运行很久后,子进程调用exit(1)后无法退出,搞的一堆子进程顽固地生成着,而查看进程状态变成休眠了!我用kill -SIGABRT pid来杀掉这个子进程,用以生成core文件,但进程死掉了,父进程收到子进程异常退出,但core文件没有生成,core生成配置已经配好,其他程序都可以正常生成core文件,就算使用killall -SIGABRT name,还是无法生成一个core文件。重启整个程序后,子进程可以使用exit(1)来退出,一切正常。
抓狂啊,为什么程序运行久了,就会出现这样的状态,百度,google都没有找到原因,希望哪个大神能帮我。就算提供一下线索也可。不胜感激!
[解决办法]
exit 应该会让系统清理进程的资源,不知道是不是处理资源的时候出的问题
看看是不是资源使用的有问题
[解决办法]
父进程通过什么函数来检测子进程?
这个函数调用是不是有问题?
用gdb调试一下
[解决办法]
《Windows编程启示录》
19.6 为什么有些进程在被终止之后还停留在任务管理器中
当某个进程结束时(可能是正常结束,也可能是因为调用了像TerminateProcess之类的函数),这个进程的用户态模块将被删除。但内核态模块只有在与线程相关的所有驱动程序执行完成之后才会被删除。
例如,如果某个线程正处于I/O操作中,那么将会给负责I/O的驱动程序发送一个内核信号来取消这个操作。
如果驱动程序的行为是良好的,那么它将清除与这个未完成I/O相关的一些信息并且释放线程。
如果驱动程序的行为是不好的(可能是因为驱动程序管理的硬件表现出奇怪的行为),那么可能需要花很长的时间来清除这个未完成的I/O。在这段时间里,驱动程序将不会释放这个线程(以及这个线程所在的进程)。实际的情况要更复杂一些,但这里的简单模型对于我们的讨论已经足够。
……
换句话说,如果你终止了某个进程后还能在任务管理器中看到这个进程,那么实际上这个进程已经停止运行了,只不过还有些残留的信息保留在系统中,只有当与这个进程相关的所有驱动程序都完成了清除操作并且指向这个进程的句柄都已经关闭,进程才会完全消失。