线程杀死它的父进程安全吗?

Is it safe for a thread to kill its parent process?

本文关键字:进程 安全 线程      更新时间:2023-10-16

我没有一个具体的例子来分享,但是问题仍然存在。

假设我有一个主进程Main,它创建了一个线程,也就是Thread

Thread的操作如下(只是一个例子):

  1. 遍历正在运行的进程列表
  2. 发现"某些进程"
  3. 杀死它。

问题

如果"some process"MainThread能杀死它吗?

注意

终止进程的方法可能不同:

  1. TerminateProcess
  2. PostMessage

调用TerminateProcess()将终止目标进程(或者失败,例如没有足够的权限)。它是从与初始线程不同的线程调用的事实是无关的。如果它杀死了调用它的同一个进程,那么这个进程也会被杀死,没有特殊情况

safe =健壮、良好的实践、无BUG等

只要它在您的端是健壮的,并且具有良好定义的行为(成功或失败),并且几乎没有错误的空间,它总是"安全的",但是在TerminateProcess的情况下,它仍然是非常不可取的。

向主线程或其他进程的线程发送退出消息可能立即工作,也可能不立即工作,或者根本不工作。然而,这是要求进程退出的一种优雅、干净的方式。它可能会或可能不会尊重该请求,并且它可能会在保留所有用户数据并将所有内容保持在定义良好的状态(在其端)的情况下这样做。

调用TerminateProcess,假设它没有失败,只会导致操作系统不再为该进程分配任何CPU时间(包括你自己的进程,如果你终止了这个进程),关闭该进程持有的所有句柄,将私有内存页标记为未使用,等等。
当你自己的进程被终止时,它将以同样的方式工作,并且因为你在调用TerminateProcess时预期到了这一点,所以不会发生不好的事情,至少在调用线程的端。

终止一个进程意味着进程将不再写入任何保存在C标准库或类似缓冲区中的数据(从进程内的任何线程,任何属于"用户域"的数据都将删除)。
程序有机会将它可能拥有的任何半完整的数据文件带入一致状态。以这种方式终止的另一个(未知的)进程可能会在一组注册表更改中间终止,这些更改现在将是不一致的。

同样,你不能严格保证被Windows写入和缓冲的数据会被写入(实际上这是由它实现的方式保证的,但是你没有正式的保证,也拷贝到系统缓冲区可能是部分的,并且程序不能再对失败条件做出反应)。