【发布时间】:2016-01-28 05:13:23
【问题描述】:
我有一个进程,它创建了一个 pthread,但这个线程没有加入到主线程。这个线程有一个无限循环。进程启动的时候这个线程也启动了,但是如果进程被SIGKILL杀死,这个线程会自动被杀死还是会变成僵尸线程?
谢谢,
罗希特
【问题讨论】:
我有一个进程,它创建了一个 pthread,但这个线程没有加入到主线程。这个线程有一个无限循环。进程启动的时候这个线程也启动了,但是如果进程被SIGKILL杀死,这个线程会自动被杀死还是会变成僵尸线程?
谢谢,
罗希特
【问题讨论】:
SIGKILL 信号强制终止整个进程,无论它有多少线程以及这些线程在做什么。无法捕获或忽略此信号。
如果发生这种情况时进程的父进程还活着,则进程将处于僵尸状态,直到父进程调用wait 或其变体。
【讨论】:
SIGKILL 不能被任何进程忽略/处理。 当主线程返回时,它终止整个进程。这包括进程中的所有其他线程。当您从任何线程调用 exit 时,也会发生同样的事情。
对于 Linux,进程和线程之间没有这种“显式”的区别。
它们中的每一个都由内核中的task_struct 表示,并且它们被链接在一起。
每个 Process 主线程都有一个 pid 和任务组 id(tgid)。所以,所有线程也有相同的 pid 或 tgid。
当一个进程被清理时,所有的都是child processes,not threads are reparented。
更多的是关于语义:
一个线程与其父级共享它的资源,这基本上意味着内存映射、文件描述符等。
当进程本身不存在时,线程将与谁共享资源?
您不能将它们重新分配给其他进程,因为它们需要访问它的资源。
所以,简而言之,一个子进程可以重新设置父进程,因为它没有 共享任何资源,其中作为子线程不能重新设置父线程
.
如果您想深入挖掘,可以从这里开始: makelinux
【讨论】:
exit() 时,进程会结束。