在运行一个线程程序并使用Ctrl + C
反复查杀主程序时,我在第二次运行中看到了意外的结果。但是,如果我让程序运行并自愿退出,则没有问题。Ctrl + C:它是否与主进程一起杀死线程?
那么,我的疑问是,是否Ctrl + C
,杀死线程还有主进程?
在此先感谢。
在运行一个线程程序并使用Ctrl + C
反复查杀主程序时,我在第二次运行中看到了意外的结果。但是,如果我让程序运行并自愿退出,则没有问题。Ctrl + C:它是否与主进程一起杀死线程?
那么,我的疑问是,是否Ctrl + C
,杀死线程还有主进程?
在此先感谢。
那么,Ctrl + C
所做的唯一的事情就是发送SIGINT
到一个线程在过程中没有屏蔽信号。信号可以被处理或忽略。
如果程序的确如此句柄Ctrl+C
,通常的行为是自行终止,但是再一次,它可以用于其他任何事情。
在你的情况下,SIGINT
正在收到一个线程,它可能会自杀,但不会杀死其他人。
在多线程编程中,信号被传递到单个线程(通常在没有阻塞特定信号的线程之间进行不可预测的选择)。但是,并不意味着,其默认操作是终止一个线程的信号。其实,没有办法杀死单个线程而不杀整个进程。
只要你离开SIGINT
以其终止进程的默认动作,只要至少有一个线程离开SIGINT
解锁,就会这样做。只要至少有一个线程解锁就可以了,因此创建应用程序后面线程的库代码在调用pthread_create
之前应始终阻止所有信号,然后在调用线程中恢复信号掩码。
感谢“R”这是有用的。 – kingsmasher1 2011-04-30 14:34:56
在Linux 2.6下使用NPTL线程:我假设进程使用默认信号处理程序,或者调用exit():是的。 C库exit()调用映射到exit_group系统调用,立即退出所有线程;默认的信号处理程序调用这个或类似的东西。
在Linux 2.4下使用Linuxthreads(或使用2.6,如果你的应用仍然使用Linuxthreads出于某种奇怪的原因):不一定。
Linuxthreads库使用clone()实现线程,创建一个恰好与父级共享其地址空间的新进程。当父母死亡时,这不一定会死。为了解决这个问题,pthreads创建了一个“主线程”。这个主线程做了各种各样的事情,其中之一是尝试确保当进程退出时(无论出于何种原因)所有线程都被终止。
所以,如果你使用Linuxthreads,可能不是。
其他线程可能不会立即退出,或者根本不退出。
然而,无论你用的,派生的子进程将继续什么的线程库(如果他们仍然是相同的过程组中,他们可能会收到信号,但可以自由地忽略它)
感谢您的回答,它是有用的信息。 – kingsmasher1 2011-04-30 14:35:52
@Heandel:任何关键你知道杀死进程+线程的组合吗? – kingsmasher1 2011-04-29 07:48:51
@Heandel:我知道,事实上我认为所有Linux用户:)我有兴趣知道关键组合。 – kingsmasher1 2011-04-29 07:54:01
@Hanandel:谢谢,你有没有相应的网页链接?如果是的话,它不仅对我而且对所有用户都非常有用。 – kingsmasher1 2011-04-29 08:03:00