sigvec(3) - Linux 手册页
名称
sigvec, sigblock, sigsetmask, siggetmask, sigmask - BSD 信号 API
概要
#include <signal.h>
int sigvec(int sig, struct sigvec *vec, struct sigvec *ovec);
int sigmask(int signum);
int sigblock(int mask);
int sigsetmask(int mask);
int siggetmask(void);
glibc 的功能测试宏要求(参见 feature_test_macros(7))
- 以上所有函数:_BSD_SOURCE
描述
这些函数在 glibc 中提供,作为兼容接口,用于使用历史 BSD 信号 API 的程序。此 API 已过时:新的应用程序应使用 POSIX 信号 API(sigaction(2),sigprocmask(2) 等)。
sigvec() 函数设置和/或获取信号 sig 的处理方式(类似于 POSIX sigaction(2))。如果 vec 不为 NULL,则它指向一个 sigvec 结构,该结构定义了 sig 的新的处理方式。如果 ovec 不为 NULL,则它指向一个 sigvec 结构,用于返回 sig 的先前处理方式。要获取 sig 的当前处理方式而不更改它,请为 vec 指定 NULL,并为 ovec 指定非 NULL 指针。
SIGKILL 和 SIGSTOP 的处理方式无法更改。
sigvec 结构具有以下形式
-
struct sigvec { void (*sv_handler)(int); /* Signal disposition */ int sv_mask; /* Signals to be blocked in handler */ int sv_flags; /* Flags */ }; - sv_handler 字段指定信号的处理方式,可以是:信号处理程序函数的地址;SIG_DFL,表示信号采用默认处理方式;或者 SIG_IGN,表示忽略该信号。
如果 sv_handler 指定信号处理程序的地址,则 sv_mask 指定在处理程序执行期间要屏蔽的信号掩码。此外,发出处理程序的信号也会被屏蔽。尝试屏蔽 SIGKILL 或 SIGSTOP 会被静默忽略。
如果 sv_handler 指定信号处理程序的地址,则 sv_flags 字段指定调用处理程序时发生的事情的标志。该字段可以包含以下零个或多个标志
- SV_INTERRUPT
- 如果信号处理程序中断了阻塞系统调用,则从处理程序返回时,系统调用将不会重新启动:而是会以错误 EINTR 失败。如果未指定此标志,则系统调用默认情况下会重新启动。
- SV_RESETHAND
- 在调用信号处理程序之前,将信号的处理方式重置为默认值。如果未指定此标志,则处理程序将保持建立状态,直到稍后通过调用 sigvec() 或直到进程执行 execve(2) 明确删除为止。
- SV_ONSTACK
- 在备用信号堆栈上处理信号(历史上在 BSD 中使用过时的 sigstack() 函数建立;POSIX 替代方案是 sigaltstack(2))。
- sigmask() 函数构造并返回 signum 的“信号掩码”。例如,我们可以使用以下代码初始化传递给 sigvec() 的 vec.sv_mask 字段
vec.sv_mask = sigmask(SIGQUIT) | sigpause(SIGABRT); /* Block SIGQUIT and SIGABRT during handler execution */sigblock() 函数将 mask 中的信号添加到进程的信号掩码中(类似于 POSIX sigprocmask(SIG_BLOCK)),并返回进程的先前信号掩码。尝试屏蔽 SIGKILL 或 SIGSTOP 会被静默忽略。sigsetmask() 函数将进程的信号掩码设置为 mask 中给定的值(类似于 POSIX sigprocmask(SIG_SETMASK)),并返回进程的先前信号掩码。
siggetmask() 函数返回进程的当前信号掩码。此调用等效于 sigblock(0)。
返回值
sigvec() 函数成功时返回 0;出错时返回 -1 并设置 errno 以指示错误。
sigblock() 和 sigsetmask() 函数返回先前的信号掩码。
sigmask() 函数返回 signum 的信号掩码。
错误
请参阅 sigaction(2) 和 sigprocmask(2) 下的 ERRORS。
符合
除了 siggetmask() 之外,所有这些函数都存在于 4.3BSD 中,其起源尚不清楚。这些函数已过时:不要在新的程序中使用它们。
说明
在 4.3BSD 上,signal() 函数提供了可靠的语义(就像使用 vec.sv_mask 等于 0 调用 sigvec() 时一样)。在 System V 上,signal() 提供了不可靠的语义。POSIX.1-2001 未指定 signal() 的这些方面。有关更多详细信息,请参阅 signal(2)。
为了等待信号,BSD 和 System V 都提供了一个名为 sigpause(3) 的函数,但该函数在两个系统上具有不同的参数。有关详细信息,请参阅 sigpause(3)。
参见
kill(2), pause(2), sigaction(2), signal(2), sigprocmask(2), raise(3), sigpause(3), sigset(3), signal(7)