10

我在 Linux 下使用 pthread 库来创建线程,我对此类应用程序中的信号处理有两个问题。

我知道信号处理程序是进程范围的,这意味着如果我在进程中设置处理程序,每个线程都会有这个信号处理程序,我也知道有pthread_kill向特定线程发送信号的功能。

我有一个关于使用例如 shellkill命令发送信号的问题,据我了解,如果我输入例如,kill -INT PID我将使用这个发送SIGINT到进程PID,如果这是多线程程序,则信号将被传递到这个进程中的一个线程.

第一个问题,我不能保证这个信号将被传递到哪个线程,我只能确定它会被传递到一个线程,而信号掩码中没有这个信号?

如果是这样的话,传递给特定线程的少数信号怎么样,比如'SIGFPE','SIGSEGV',如果我将使用killshell 命令发送它们,它们将被传递给随机线程,还是被传递给创建其他线程的线程?

4

1 回答 1

12

引用man pthreads

POSIX.1 区分了指向整个进程的信号和指向单个线程的信号的概念。根据 POSIX.1,进程导向的信号(例如,使用 kill(2) 发送)应该由进程中的一个任意选择的线程处理。

在 glibc 2.2 和更早的版本(使用 linuxthreads 作为 pthread 实现)时,Linux 中存在一些问题;但由于 glibc 2.3-2.4 有 NPTL,它在关于信号的 POSIX 一致性方面更准确。

我只能确定它会在信号掩码中没有这个信号的情况下被传递到一个线程吗?

如果您使用的是 kill - 是的;到不阻塞此信号的随机线程。

如果是这样,那么传递给特定线程的少数信号呢,例如'SIGFPE','SIGSEGV',

它们仅在由 CPU/内核(在某些上下文中通过特定指令)生成时才交付给特定线程;不是由kill带有 PID 参数的实用程序

如果我将使用 kill shell 命令发送它们,它们将被传递到随机线程还是将它们传递到创建其他线程的线程?

它们将被传递到进程的随机线程,kill 通常发送进程范围的信号。但是如果信号是致命的,进程中的所有线程都将被销毁。

PS:http ://www.linuxprogrammingblog.com/all-about-linux-signals?page=11

于 2012-05-31T12:26:39.847 回答