线程杀死其父进程是不是安全?
Posted
技术标签:
【中文标题】线程杀死其父进程是不是安全?【英文标题】:Is it safe for a thread to kill its parent process?线程杀死其父进程是否安全? 【发布时间】:2015-05-25 06:46:06 【问题描述】:好吧,我没有具体的例子可以分享,但问题仍然存在。
假设我有一个创建线程的主进程Main
,也就是Thread
。
Thread
操作如下(只是一个例子):
-
遍历正在运行的进程列表
找到“某个进程”
杀死它。
问题
如果“某个进程”是 Main
并且 Thread
杀死它怎么办?
注意
杀死进程的方法可能不同:
TerminateProcess
PostMessage
【问题讨论】:
PostMessage 用于关闭 Windows 应用程序,这属于不同的上下文(这是一种优雅的终止请求,通常可能会引发诸如“您是否要保存更改”之类的问题) . @buttifulbuttefly 安全 = 健壮、良好的做法、没有 BUG 等。 @marom,10 倍。刚刚提到这解释了进程如何被线程杀死。或许答案会因击杀方式而异。 【参考方案1】:调用TerminateProcess()
将终止目标进程(或失败,例如没有足够的权限)。从与初始线程不同的线程调用它的事实是无关紧要的。如果它杀死了调用它的同一进程,则该进程被杀死,没有特殊情况。
【讨论】:
【参考方案2】:安全 = 稳健、良好实践、无 BUG 等。
它始终是“安全的”,因为它对您来说是健壮的并且具有明确定义的行为(成功或失败),并且几乎没有错误的空间,但对于TerminateProcess
,它仍然非常不建议。
向主线程或另一个进程的线程发布退出消息可能会或可能不会立即工作,或者根本不工作。然而,这是一种要求进程退出的优雅、干净的方式。它可能会也可能不会尊重该请求,它可能会在保留所有用户数据并将所有内容保持在明确定义的状态(在其结束时)的同时这样做。
调用TerminateProcess
将假设它没有失败,只会导致操作系统不再为该进程分配任何 CPU 时间(包括您自己的,如果那是您终止的那个),关闭由持有的所有句柄进程,将私有内存页面标记为未使用等。
当您自己的进程被终止时,它会以同样的方式工作,并且由于您在调用 TerminateProcess
时预期会发生这种情况,因此不会发生任何坏事,至少在调用线程的末端是这样。
终止进程意味着进程不会写入任何保存的数据,例如在 C 标准库或类似的缓冲区中(来自进程中的任何线程,任何“用户空间”都只是 poof)。 该程序没有有机会将它可能拥有的任何半完整数据文件带入一致状态。您以这种方式杀死的另一个(您不知道的)进程可能会在一组注册表更改的中间终止,这些更改现在将不一致。
此外,您不能严格保证要写入并仍由 Windows 缓冲的数据实际上会被写入(实际上这是通过它的实现方式来保证的,但您也没有正式的保证到系统缓冲区的副本可能是部分的,程序无法再对失败条件作出反应)。
【讨论】:
以上是关于线程杀死其父进程是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章