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 指针。

SIGKILLSIGSTOP 的处理方式无法更改。

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 指定在处理程序执行期间要屏蔽的信号掩码。此外,发出处理程序的信号也会被屏蔽。尝试屏蔽 SIGKILLSIGSTOP 会被静默忽略。

如果 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)),并返回进程的先前信号掩码。尝试屏蔽 SIGKILLSIGSTOP 会被静默忽略。

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)