在运行一个线程程序并使用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创建了一个“主线程”。 这个主线程做了各种各样的事情,其中之一就是试图确保所有线程在进程退出时(无论出于何种原因)都被终止。
所以,如果你使用Linuxthreads,可能不是。
其他线程可能不会立即退出,或者甚至完全退出。
但是,无论使用哪个线程库,分叉的子进程都会继续(如果它们仍处于同一进程组中,可能会收到信号,但可以自由忽略)