线程杀死其父进程是否安全?

时间:2015-05-25 06:46:06

标签: c++ multithreading winapi terminate

我没有一个特定的例子可以分享,但问题仍然存在。

假设我有一个创建线程的主进程Main,即AKA Thread

Thread如下操作(仅作为示例):

  1. 遍历正在运行的进程列表
  2. 找到“某个过程”
  3. 杀了它。
  4. 问题

    如果“某个流程”为MainThread会导致该怎么办?

    注意

    杀死过程可能因方法而异:

    1. TerminateProcess
    2. PostMessage

2 个答案:

答案 0 :(得分:2)

调用TerminateProcess()将终止目标进程(或失败,例如没有足够的权限)。从与初始线程不同的线程调用它的事实是无关紧要的。如果它杀死了从中调用的相同进程,则该进程被终止,没有特殊情况。

答案 1 :(得分:1)

  

安全=健壮,良好的做法,无BUG等。

它始终是“安全的”,因为它在您的最终是健壮的并且具有明确定义的行为(成功或失败),并且几乎没有错误的空间,但是在TerminateProcess的情况下它仍然是非常不可取。

向主线程或其他进程的线程发送退出消息可能会立即生效,也可能不会立即生效。然而,这是一种优雅,干净的方式来要求流程退出。它可能会也可能不会尊重该请求,它可能会在保留所有用户数据并将所有内容保持在明确定义的状态(最终)时这样做。

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

终止流程意味着流程不会写入任何数据,例如在C标准库或类似的缓冲区中(来自进程中的任何线程,任何“用户登陆”只是 poof )。
程序有机会将其可能具有的任何半完整数据文件带入一致状态。您以这种方式杀死的另一个(您不知道)进程可能会在一组注册表更改中终止,现在这些更改将不一致。

此外,您没有严格保证要写入和仍然由Windows缓存的数据实际上会被写入(几乎这是通过它实现的方式保证,但您没有正式的保证,也是复制到系统缓冲区可能是部分的,程序不能再对故障情况做出反应。)

相关问题