了解信号阻塞和信号暂停

Understanding signal blocking and signal suspension

看了文档还是不太明白信号阻塞。如果您有一个屏蔽给定信号的掩码,您是否需要先取消屏蔽该信号以允许程序拦截它,或者信号屏蔽是否以不同的方式运行?

如果您使用 sigsuspend,您的程序是否会暂停,直到来自您作为参数传递的掩码的给定信号到达?

你使用sigsuspend时等待的信号是应该解封还是不需要?

顺便说一句,我正在使用 C 和 pthread 库来编写我的程序

If you have a mask that blocks a given signal, do you need to unblock that signal first to allow the program to intercept it or does signal blocking behave in a different way?

信号永远不会传递给任何被阻塞的线程。如果为一个进程发出信号,而该进程的所有线程都已将其阻塞,则它会保持挂起状态,直到至少有一个线程解除阻塞,或者进程终止。

If you use sigsuspend, does your program get suspended until a given signal from the mask you pass as an argument arrives?

没有。您传递给 sigsuspend 的信号掩码与您传递给(例如)sigprocmask() 的信号掩码具有相同的含义:它指定了一整套应该被阻止的信号。此掩码不得包含您希望线程能够接收的任何信号。通常,传递 sigsuspend() 在前面的 sigprocmask() 调用之前生效的掩码是合适的,如果您需要,后一个函数会提供给您。

Should the signal you wait for when using sigsuspend be unblocked or is it not necessary

在任何时候,您都应该确保您希望线程能够接收的任何信号都是畅通的,反之,线程不能接收的任何信号都是阻塞的。这就是为什么 sigsuspend() 为您提供了一种方法来指定在通话期间有效的不同信号掩码。