【问题标题】:thread behaviour when not joined and main process killed未加入且主进程终止时的线程行为
【发布时间】:2016-01-28 05:13:23
【问题描述】:

我有一个进程,它创建了一个 pthread,但这个线程没有加入到主线程。这个线程有一个无限循环。进程启动的时候这个线程也启动了,但是如果进程被SIGKILL杀死,这个线程会自动被杀死还是会变成僵尸线程?

谢谢,

罗希特

【问题讨论】:

    标签: c++ c linux unix pthreads


    【解决方案1】:

    SIGKILL 信号强制终止整个进程,无论它有多少线程以及这些线程在做什么。无法捕获或忽略此信号。

    如果发生这种情况时进程的父进程还活着,则进程将处于僵尸状态,直到父进程调用wait 或其变体。

    【讨论】:

    • 如果进程 A(pid-1234) 启动 pthread ptA[ptA 运行无限循环],并且我们向 A(pid-1234) 发出 sigkill,ptA 是否也停止/杀死了?
    • @user1254554 是的,如果一个进程被杀死,那么该进程中的所有线程都会被杀死。没有进程,线程就无法存在。
    【解决方案2】:

    SIGKILL 不能被任何进程忽略/处理。 当主线程返回时,它终止整个进程。这包括进程中的所有其他线程。当您从任何线程调用 exit 时,也会发生同样的事情。

    对于 Linux,进程和线程之间没有这种“显式”的区别。 它们中的每一个都由内核中的task_struct 表示,并且它们被链接在一起。

    每个 Process 主线程都有一个 pid 和任务组 id(tgid)。所以,所有线程也有相同的 pid 或 tgid。

    当一个进程被清理时,所有的都是child processes,not threads are reparented

    更多的是关于语义:

    一个线程与其父级共享它的资源,这基本上意味着内存映射、文件描述符等。

    当进程本身不存在时,线程将与谁共享资源?

    您不能将它们重新分配给其他进程,因为它们需要访问它的资源。

    所以,简而言之,一个子进程可以重新设置父进程,因为它没有 共享任何资源,其中作为子线程不能重新设置父线程

    .

    如果您想深入挖掘,可以从这里开始: makelinux

    【讨论】:

    • "当你从主线程调用 exit 时会发生同样的事情。" 实际上,当从 any 线程调用 exit() 时,进程会结束。
    • 相应地改变了:)
    猜你喜欢
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多