Ctrl + C:它​​是否也与主进程一起杀死线程?

在运行一个线程程序并使用Ctrl + C重复杀死主程序时,我在第二次运行程序中看到意外的结果。 但是,如果我让程序运行并自愿退出,那就没有问题了。

所以,我的疑问是, Ctrl + C ,杀死线程还有主进程吗?

提前致谢。

那么, Ctrl + C所做的唯一事情就是将SIGINT发送到不掩蔽信号的进程中的一个线程。 信号可以被处理或忽略。

如果程序确实处理Ctrl+C ,通常的行为是自行终止,但是再一次,它可以用于其他任何事情。

在你的情况下, 一个线程正在接收SIGINT ,它可能会自杀,但不会杀死其他线程。

在多线程编程中,信号被传送到一个单独的线程(通常在没有被阻塞的特定信号的线程中被不可预测地选择)。 但是,这并不意味着一个信号的默认行为是终止一个线程。 事实上,没有杀死整个过程就没有办法杀死单个线程。

只要您将SIGINT以其终止进程的缺省操作离开,只要至少有一个线程离开SIGINT解锁,就会这样做。 只要至少有一个线程解锁就可以了,所以创建应用程序后面线程的库代码应该在调用pthread_create之前总是阻塞所有的信号,然后在调用线程中恢复信号掩码。

在Linux 2.6下使用NPTL线程:我假设进程使用默认的信号处理程序,或者调用exit():是的。 C库exit()调用映射到exit_group系统调用,立即退出所有线程; 默认的信号处理程序调用这个或类似的东西。

在Linux 2.4下使用Linuxthreads(或使用2.6,如果你的应用程序仍然使用Linuxthreads的一些奇怪的原因):不一定。

Linuxthreads库使用clone()实现线程,创建一个新的进程,恰好与父进程共享其地址空间。 当父母死亡时,这不一定会死亡。 为了解决这个问题,pthreads创建了一个“主线程”。 这个主线程做了各种各样的事情,其中​​之一就是试图确保所有线程在进程退出时(无论出于何种原因)都被终止。

  1. 它不一定成功
  2. 如果成功,则不一定立即执行,特别是如果有大量的线程。

所以,如果你使用Linuxthreads,可能不是。

其他线程可能不会立即退出,或者甚至完全退出。

但是,无论使用哪个线程库,分叉的子进程都会继续(如果它们仍处于同一进程组中,可能会收到信号,但可以自由忽略)