在一个单进程中,信号会打断进程的执行,并且递送到进程中处理,而对于多线程环境,信号会递送给其中的一个线程,这个被递送的线程是不确定的。每个线程存在自己的信号屏蔽字,可以通过如下函数设置:
int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
该函数设置线程对应的信号屏蔽字,被屏蔽的信号会被挂起从而无法递送到对应的线程。这里有一点需要特别注意,线程的信号屏蔽字是可以向下继承的,主线程设置的信号屏蔽字可以被后续创建的线程继承。
信号的阻塞
进程环境中sigprocmask可以用来阻塞进程中信号的递送,而pthread_sigmask可以阻塞线程中的信号递送,阻塞信号的可以阻塞几乎所有的信号,但是有两个信号除外:SIGKILL和SIGSTOP。
另外为了保证程序的健壮性,一些必要的错误信号最好在程序编写时也不要阻塞,比如:
TSIGFPE,SIGILL,SIGSEGV,SIGBUS
这些信号的到来都表示此进程已经处于不可控的状态,比如算术运算错误或者内存引用错误,或者是硬件错误等。
————————————————
版权声明:本文为CSDN博主「程序猿Ricky的日常干货」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/rikeyone/article/details/89203836