Pthread线程和信号

And*_*dna 10 linux signals pthreads

我在Linux下使用pthread库来创建线程,我在这些应用程序中有两个关于信号处理的问题.

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

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

第一个问题,我不能保证这个信号将被传送到哪个线程,我只能确定它会在没有信号掩码信号的情况下被传送到一个线程吗?

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

osg*_*sgx 12

引用男人pthreads

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

在glibc 2.2及更早版本的Linux中存在一些问题(linuxthreads被用作pthread实现); 但是由于glibc 2.3-2.4有NPTL,它在POSIX中对信号的一致性更准确.

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

如果你正在使用kill - 是的; 到随机线程,不阻止此信号.

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

它们被传递到特定线程,仅在由CPU /内核生成时(通过某些上下文中的特定指令); 不是通过killPID参数的实用程序

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

它们将被传递给随机线程的进程,kill通常会发送进程范围的信号.但是如果信号是致命的,那么进程中的所有线程都将被破坏.

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

  • 感谢您的回答和文章. (2认同)