TerminateProcess会导致子进程挂起吗

luoyunfeng1980 2017-12-20 10:33:14
目前遇到个奇怪的问题,有个主进程A,会不停的创建一些子线程,这些子线程会调用CreateProcess创建一个子进程,子进程进行一些操作后会创建一个文本文件写入内容,子线程WaitForSingleObject等待它创建的子进程结束,等待时间最长1分钟,然后获取子进程创建的文本,如果子进程在1分钟没有返回,就会在子线程中调用TerminateProcess终止它,子进程的操作一定不会阻塞,理论上,即使主进程A结束了,它的子线程创建的那些子进程也会自行结束,但是现在的问题是,某个时刻调用了TerminateProcess结束主进程A,那些子进程就挂起了,问题不是必现,出现的几率也不高,但见过几次。难道TerminateProcess方式会导致子进程挂起?有没有什么好办法保证A进程被Kill后,所有的子进程也退出?
...全文
342 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoyunfeng1980 2017-12-28
  • 打赏
  • 举报
回复
引用 2 楼 zara 的回复:
子进程的操作一定不会阻塞,但它有时确实是超过了预想的 1分钟的最大的执行时间;我觉得应该对这样状态的进程 attatch 进去看看,它这时处在什么问题,它是怎么用掉了 1分钟的,能不能解决了。
我的现象不像是超时的问题,进程在列表中显示的时间远远超过了1分钟(观察结果是过了一整夜还在),这个子进程有一个写文本的操作,大概会写50M的样子,按照赵4老师的说法“如果驱动程序的行为是不好的(可能是因为驱动程序管理的硬件表现出奇怪的行为),那么可能需要花很长的时间来清除这个未完成的I/O。”,可能就是“驱动程序的行为是不好的”,先继续观察这个现象会不会复现。感谢zara和zhao4zhong1
zara 2017-12-22
  • 打赏
  • 举报
回复
子进程的操作一定不会阻塞,但它有时确实是超过了预想的 1分钟的最大的执行时间;我觉得应该对这样状态的进程 attatch 进去看看,它这时处在什么问题,它是怎么用掉了 1分钟的,能不能解决了。
赵4老师 2017-12-21
  • 打赏
  • 举报
回复
《Windows编程启示录》 19.6 为什么有些进程在被终止之后还停留在任务管理器中 当某个进程结束时(可能是正常结束,也可能是因为调用了像TerminateProcess之类的函数),这个进程的用户态模块将被删除。但内核态模块只有在与线程相关的所有驱动程序执行完成之后才会被删除。 例如,如果某个线程正处于I/O操作中,那么将会给负责I/O的驱动程序发送一个内核信号来取消这个操作。 如果驱动程序的行为是良好的,那么它将清除与这个未完成I/O相关的一些信息并且释放线程。 如果驱动程序的行为是不好的(可能是因为驱动程序管理的硬件表现出奇怪的行为),那么可能需要花很长的时间来清除这个未完成的I/O。在这段时间里,驱动程序将不会释放这个线程(以及这个线程所在的进程)。实际的情况要更复杂一些,但这里的简单模型对于我们的讨论已经足够。 …… 换句话说,如果你终止了某个进程后还能在任务管理器中看到这个进程,那么实际上这个进程已经停止运行了,只不过还有些残留的信息保留在系统中,只有当与这个进程相关的所有驱动程序都完成了清除操作并且指向这个进程的句柄都已经关闭,进程才会完全消失。

18,124

社区成员

发帖
与我相关
我的任务
社区描述
Windows客户端使用相关问题交流社区
社区管理员
  • Windows客户端使用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧