我在Linux下使用pthread库来创建线程,我对这些应用程序中的信号处理有两个问题。
我知道信号处理程序是进程范围的,这意味着如果我在进程中设置处理程序,每个线程都会有这个信号处理程序,我也知道有pthread_kill
函数用于向特定线程发送信号。 / p>
我有一个关于使用例如shell kill
命令发送信号的问题,据我所知,如果我输入例如kill -INT PID
我会发送SIGINT
来处理PID
{1}},如果这是多线程程序,则信号将在此过程中传递给其中一个线程。
第一个问题,我不能保证这个信号将被传送到哪个线程,我只能确定它会在没有信号掩码信号的情况下被传送到一个线程吗?
如果是这样,那么传递给特定线程的信号很少,比如'SIGFPE','SIGSEGV',如果我将使用kill
shell命令发送它们,它们将被传递到随机线程或将被传递到创建其他线程的线程?
答案 0 :(得分:12)
POSIX.1区分了作为整体指向进程的信号的概念和指向各个线程的信号。根据POSIX.1,过程导向信号(例如使用kill(2)发送)应该由进程内任意选择的一个线程处理。
在glibc 2.2及更早版本的Linux中存在一些问题(linuxthreads被用作pthread实现);但是由于glibc 2.3-2.4有NPTL,它在POSIX中对信号的一致性更准确。
我只能确定它会在信号掩码中没有此信号的情况下传送到一个线程吗?
如果你正在使用杀人 - 是的;到随机线程,不阻止此信号。
如果是这样的话,几乎没有传递给特定线程的信号,比如'SIGFPE','SIGSEGV',
只有在CPU /内核生成时(通过某些上下文中的特定指令),才会将它们传递给特定的线程;不是kill
实用程序与PID参数
如果我使用kill shell命令发送它们,它们将被传递给随机线程,还是会被传递给创建其他线程的线程?
它们将被传递给随机线程的进程,kill通常会发送进程范围的信号。但是如果信号是致命的,那么正在处理的所有线程都将被破坏。
PS:http://www.linuxprogrammingblog.com/all-about-linux-signals?page=11