sigaction函数

sigaction函数是设置信号处理的接口。比signal函数更健壮

       #include <signal.h>

       int sigaction(int signum, const struct sigaction *act,
                     struct sigaction *oldact);

  signum指除了SIGKILL 和 SIGSTOP之外,要捕获的信号。struct sigaction *act是要安装的信号。结构题定义为:

/* Structure describing the action to be taken when a signal arrives.  */
struct sigaction
  {
    /* Signal handler.  */
#if defined __USE_POSIX199309 || defined __USE_XOPEN_EXTENDED
    union
      {
    /* Used if SA_SIGINFO is not set.  */
    __sighandler_t sa_handler;
    /* Used if SA_SIGINFO is set.  */
    void (*sa_sigaction) (int, siginfo_t *, void *);
      }
    __sigaction_handler;
# define sa_handler __sigaction_handler.sa_handler
# define sa_sigaction   __sigaction_handler.sa_sigaction
#else
    __sighandler_t sa_handler;
#endif

    /* Additional set of signals to be blocked.  */
    __sigset_t sa_mask;

    /* Special flags.  */
    int sa_flags;

    /* Restore handler.  */
    void (*sa_restorer) (void);
  };  

其中,sa_handler为信号的处理函数。sa_mask设置在进程原有信号掩码基础上增加信号掩码,来过滤信号,指定哪些信号不能发送给本进程。sa_mask是信号集sigset_t类型,定义在x86_64-linux-gnu/bits/types/__sigset_t.h文件:

#define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
typedef struct
{
  unsigned long int __val[_SIGSET_NWORDS];
} __sigset_t;

  sa_flags用来设置程序收到信号时的行为,和struct sigaction一样,在x86_64-linux-gnu/bits/sigaction.h文件中定义

关于信号集sigset_t类型,signal.h文件中定义了一些函数来操作信号集,包括:

       #include <signal.h>

       int sigemptyset(sigset_t *set);

       int sigfillset(sigset_t *set);

       int sigaddset(sigset_t *set, int signum);

       int sigdelset(sigset_t *set, int signum);

       int sigismember(const sigset_t *set, int signum);

  

拿来《linux高性能服务器编程》中的捕捉信号函数:

void addsig(int sig, void (*sig_handler)(int))
{
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = sig_handler;
    sa.sa_flags |= SA_RESTART;
    sigfillset(&sa.sa_mask);
    assert(sigaction(sig, &sa, NULL) != -1);
}

  

原文地址:https://www.cnblogs.com/zuofaqi/p/9594945.html

时间: 2024-11-09 06:29:30

sigaction函数的相关文章

使用 sigaction 函数实现可靠信号

前言 在前文中,讲述了一个可靠信号的示例.它分成几个步骤组成( 请参考前文 ).在 Linux 系统编程中,有个方法可以将这些步骤给集成起来,让我们使用起来更加的方便.那就是调用 sigaction 函数. sigaction 函数 原型:int sigaction (int signo, const struct sigaction * restrict act, struct sigaction *restrict oact) 作用:将信号及其处理函数关联起来,但这个注册函数中,信号处理函数

10.14 sigaction函数

函数sigaction允许我们获取或者是修改(或者获取并修改)与特定信号相关联的处理函数,该函数替代了早期的UNIX系统发布版中的函数signal,实际上,在本节末尾,我们将会使用sigaction来实现一个signal函数. #include <signal.h> int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact); Returns: 0 if OK,

UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数

lienhua342014-11-05 sigaction 函数跟 signal 函数一样,用于设置信号处理函数.此函数是用于取代 UNIX 早期版本使用的 signal 函数.UNIX 早期版本的 signal 函数在捕获到一个信号之后,就会自动将该信号的处理动作恢复为默认处理动作.于是,如果我们希望注册的信号处理函数长期生效,则需要在信号处理程序中再次调用 signal 函数注册一次.这样的操作太麻烦,而且在信号处理函数中再次调用 signal 注册信号处理函数之前可能又会产生该信号,而这个

Linux C--信号 sigaction函数

使用 sigaction 函数: signal 函数的使用方法简单,但并不属于 POSIX 标准,在各类 UNIX 平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX 标准定义的信号处理接口是 sigaction 函数,其接口头文件及原型如下: #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); ◆ signum:要操作的信号.

linux sigaction函数(注册信号)使用

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作). 参数说明: signum : 要操作的信号 act : 要设置的对信号的新处理方式 oldact : 原来对信号的处理方式 返回值: 成功返回0,失败返回-1,并设置errno struct sigaction 结构体原型: struct siga

sigaction 函数

本文主要参考<unix环境高级编程> sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作). int sigaction(int signo,const struct sigaction *restrict act,               struct sigaction *restrict oact); 结构sigaction定义如下: struct sigaction{  void (*sa_handler)(int);  sigset_t sa_ma

sigaction函数的使用

sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作). 他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口) 给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact int sigaction(int signo,const struct sigaction *restrict act, struct sigaction *restrict oact);

signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定的进程相联系的.因此,首 先要建立其信号和进程的对应关系,这就是信号的安装登记. Linux 主要有两个函数实现信号的安装登记:signal和sigaction.其中signal在系统调用的基础上实现,是库函数.它只有两个参数,不支持信号 传递信息,主要是用于前32个非实时信号的安装:而sigact

linux sigaction 函数 用法释义

使用 sigaction 函数: signal 函数的使用方法简单,但并不属于 POSIX 标准,在各类 UNIX 平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX 标准定义的信号处理接口是 sigaction 函数,其接口头文件及原型如下: #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); ◆ signum:要操作的信号.