线程杀死它的父进程安全吗?
Is it safe for a thread to kill its parent process?
我没有一个具体的例子来分享,但是问题仍然存在。
假设我有一个主进程Main
,它创建了一个线程,也就是Thread
。
Thread
的操作如下(只是一个例子):
- 遍历正在运行的进程列表
- 发现"某些进程"
- 杀死它。
如果"some process"Main
和Thread
能杀死它吗?
注意
终止进程的方法可能不同:
-
TerminateProcess
-
PostMessage
调用TerminateProcess()
将终止目标进程(或者失败,例如没有足够的权限)。它是从与初始线程不同的线程调用的事实是无关的。如果它杀死了调用它的同一个进程,那么这个进程也会被杀死,没有特殊情况
safe =健壮、良好的实践、无BUG等
只要它在您的端是健壮的,并且具有良好定义的行为(成功或失败),并且几乎没有错误的空间,它总是"安全的",但是在TerminateProcess
的情况下,它仍然是非常不可取的。
向主线程或其他进程的线程发送退出消息可能立即工作,也可能不立即工作,或者根本不工作。然而,这是要求进程退出的一种优雅、干净的方式。它可能会或可能不会尊重该请求,并且它可能会在保留所有用户数据并将所有内容保持在定义良好的状态(在其端)的情况下这样做。
调用TerminateProcess
,假设它没有失败,只会导致操作系统不再为该进程分配任何CPU时间(包括你自己的进程,如果你终止了这个进程),关闭该进程持有的所有句柄,将私有内存页标记为未使用,等等。
当你自己的进程被终止时,它将以同样的方式工作,并且因为你在调用TerminateProcess
时预期到了这一点,所以不会发生不好的事情,至少在调用线程的端。
终止一个进程意味着进程将不再写入任何保存在C标准库或类似缓冲区中的数据(从进程内的任何线程,任何属于"用户域"的数据都将删除)。
程序不有机会将它可能拥有的任何半完整的数据文件带入一致状态。以这种方式终止的另一个(未知的)进程可能会在一组注册表更改中间终止,这些更改现在将是不一致的。
同样,你不能严格保证被Windows写入和缓冲的数据会被写入(实际上这是由它实现的方式保证的,但是你没有正式的保证,也拷贝到系统缓冲区可能是部分的,并且程序不能再对失败条件做出反应)。
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- boost::进程间消息队列引发错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- boost消息队列线程安全和进程安全吗?
- 在进程间内存中使用boost::可选是否安全
- 为特定于进程的安全描述符创建访问令牌
- 在另一个进程提供的指针上使用 typeid 是否安全,该进程由同一编译器编译
- 我知道 pantheios 是线程安全的,但它是进程间安全的吗?
- 在同一进程中使用的两个模块中具有同步对象的通用名称是否安全
- IsDebuggerPresent()函数是停止调试进程的安全方法吗
- 从两个进程安全访问文件
- 是boost::进程间线程安全的
- 创建读取面向互联网的套接字的守护进程有什么安全问题?
- 内存是进程安全的
- 如果使用system用户令牌启动登录用户进程,是否会危及系统安全
- 对于进程间COM对象,不使用QueryInterface,将IDispatch*转换为IUnknown*是否安全?
- 线程杀死它的父进程安全吗?