线程杀死其父进程是否安全?
Is it safe for a thread to kill its parent process?
嗯,我没有具体的例子可以分享,但问题仍然存在。
假设我有一个创建线程的主进程 Main
,又名 Thread
。
Thread
操作如下(只是一个例子):
- 遍历 运行 个进程的列表
- 找到“一些进程”
- 杀了它。
问题
如果“某个进程”是 Main
并且 Thread
终止了它怎么办?
备注
终止进程的方法可能有所不同:
TerminateProcess
PostMessage
调用TerminateProcess()
将终止目标进程(或失败,例如没有足够的权限)。它是从与初始线程不同的线程调用的事实无关紧要。如果它终止调用它的同一个进程,那么该进程将被终止,没有特殊情况。
safe = robust, good practice, BUG free, etc.
它始终是 "safe",因为它对您而言是健壮的并且具有明确定义的行为(成功或失败),并且几乎没有错误的余地,但是在 [=10= 的情况下] 不过还是很不可取的。
向主线程或其他进程的线程发布退出消息可能会立即生效,也可能不会立即生效,或者根本不会生效。然而,这是一种要求进程退出的优雅、干净的方式。它可能会或可能不会尊重该请求,并且它可能会这样做,同时保留所有用户数据并使所有内容都处于明确定义的状态(最后)。
调用 TerminateProcess
会,假设它没有失败,只会导致操作系统不再分配任何 CPU 时间给那个进程(包括你自己的,如果你是那个终止),关闭进程持有的所有句柄,将私有内存页标记为未使用等。
当您自己的进程被终止时,它将以相同的方式工作,并且由于您在调用 TerminateProcess
时预料到了这一点,所以不会发生任何坏事,至少在调用线程的末端是这样。
终止进程意味着进程不会写入任何保存的数据,例如在 C 标准库或类似的缓冲区中(从进程中的任何线程,任何 "user land" 都只是 poof)。
程序 没有机会 将它可能拥有的任何半完整数据文件带入一致状态。您以这种方式杀死的另一个(您不知道的)进程可能会在一组注册表更改的中间终止,这些更改现在将是不一致的。
此外,您不能严格保证 Windows 要写入并仍缓冲的数据将实际写入(实际上 这是由其实现方式保证的,但您没有正式的保证,复制到系统缓冲区的内容也可能是部分的,并且程序无法再对失败情况做出反应。
嗯,我没有具体的例子可以分享,但问题仍然存在。
假设我有一个创建线程的主进程 Main
,又名 Thread
。
Thread
操作如下(只是一个例子):
- 遍历 运行 个进程的列表
- 找到“一些进程”
- 杀了它。
问题
如果“某个进程”是 Main
并且 Thread
终止了它怎么办?
备注
终止进程的方法可能有所不同:
TerminateProcess
PostMessage
调用TerminateProcess()
将终止目标进程(或失败,例如没有足够的权限)。它是从与初始线程不同的线程调用的事实无关紧要。如果它终止调用它的同一个进程,那么该进程将被终止,没有特殊情况。
safe = robust, good practice, BUG free, etc.
它始终是 "safe",因为它对您而言是健壮的并且具有明确定义的行为(成功或失败),并且几乎没有错误的余地,但是在 [=10= 的情况下] 不过还是很不可取的。
向主线程或其他进程的线程发布退出消息可能会立即生效,也可能不会立即生效,或者根本不会生效。然而,这是一种要求进程退出的优雅、干净的方式。它可能会或可能不会尊重该请求,并且它可能会这样做,同时保留所有用户数据并使所有内容都处于明确定义的状态(最后)。
调用 TerminateProcess
会,假设它没有失败,只会导致操作系统不再分配任何 CPU 时间给那个进程(包括你自己的,如果你是那个终止),关闭进程持有的所有句柄,将私有内存页标记为未使用等。
当您自己的进程被终止时,它将以相同的方式工作,并且由于您在调用 TerminateProcess
时预料到了这一点,所以不会发生任何坏事,至少在调用线程的末端是这样。
终止进程意味着进程不会写入任何保存的数据,例如在 C 标准库或类似的缓冲区中(从进程中的任何线程,任何 "user land" 都只是 poof)。
程序 没有机会 将它可能拥有的任何半完整数据文件带入一致状态。您以这种方式杀死的另一个(您不知道的)进程可能会在一组注册表更改的中间终止,这些更改现在将是不一致的。
此外,您不能严格保证 Windows 要写入并仍缓冲的数据将实际写入(实际上 这是由其实现方式保证的,但您没有正式的保证,复制到系统缓冲区的内容也可能是部分的,并且程序无法再对失败情况做出反应。