2011-04-29 44 views

回答

2

那么,Ctrl + C所做的唯一的事情就是发送SIGINT一个线程在过程中没有屏蔽信号。信号可以被处理或忽略。

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

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

+0

@Heandel:任何关键你知道杀死进程+线程的组合吗? – kingsmasher1 2011-04-29 07:48:51

+0

@Heandel:我知道,事实上我认为所有Linux用户:)我有兴趣知道关键组合。 – kingsmasher1 2011-04-29 07:54:01

+0

@Hanandel:谢谢,你有没有相应的网页链接?如果是的话,它不仅对我而且对所有用户都非常有用。 – kingsmasher1 2011-04-29 08:03:00

3

在多线程编程中,信号被传递到单个线程(通常在没有阻塞特定信号的线程之间进行不可预测的选择)。但是,并不意味着,其默认操作是终止一个线程的信号。其实,没有办法杀死单个线程而不杀整个进程。

只要你离开SIGINT以其终止进程的默认动作,只要至少有一个线程离开SIGINT解锁,就会这样做。只要至少有一个线程解锁就可以了,因此创建应用程序后面线程的库代码在调用pthread_create之前应始终阻止所有信号,然后在调用线程中恢复信号掩码。

+0

感谢“R”这是有用的。 – kingsmasher1 2011-04-30 14:34:56

1

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

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

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

  1. 它不一定成功
  2. 如果它成功,它不一定是直接的,特别是如果有大量的线程。

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

其他线程可能不会立即退出,或者根本不退出。

然而,无论你用的,派生的子进程将继续什么的线程库(如果他们仍然是相同的过程组中,他们可能会收到信号,但可以自由地忽略它)

+0

感谢您的回答,它是有用的信息。 – kingsmasher1 2011-04-30 14:35:52