SIGVEC - Linux手册页

时间:2019-08-20 18:01:19  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-08-13

名称

sigvec,sigblock,sigsetmask,siggetmask,sigmask-BSD信号API

语法

#包括

int sigvec(int sig,const struct sigvec * vec,struct sigvec * ovec);

int sigmask(int signum);

int sigblock(int掩码);

int sigsetmask(int掩码);

int siggetmask(无效);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

上面显示的所有功能:
从glibc 2.19开始:
_DEFAULT_SOURCE
Glibc 2.19及更早版本:
_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()宏构造并返回信号的"信号掩码"。例如,我们可以使用以下代码初始化为sigvec()提供的vec.sv_mask字段:

vec.sv_mask = sigmask(SIGQUIT) | sigmask(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;否则返回0。如果出错,则返回-1并将errno设置为错误。

sigblock()和sigsetmask()函数返回前一个信号掩码。

sigmask()宏返回信号的信号掩码。

错误说明

请参见sigaction(2)和sigprocmask(2)下的错误。

版本

从2.21版开始,GNU C库不再将sigvec()函数导出为ABI的一部分。 (为确保向后兼容,glibc符号版本控制方案继续将接口导出到与库的旧版本链接的二进制文件。)

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
sigvec(),sigmask(),sigblock(),sigsetmask(),siggetmask()Thread safetyMT-Safe

遵循规范

所有这些功能都在4.3BSD中,但siggetmask()的起源尚不清楚。这些功能已过时:请勿在新程序中使用它们。

备注

在4.3BSD上,signal()函数提供了可靠的语义(例如,当vec.sv_mask等于0调用sigvec()时)。在系统V上,signal()提供了不可靠的语义。 POSIX.1未指定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)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/