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);
}

  

最新文章

  1. 列表边框column-rule
  2. location url 反向代理到来机的其它端口 gitlab
  3. hibernate 的 CascadeType 属性
  4. kali linux karmetasploit配置
  5. python centos上出现上下键和退格键均为乱码
  6. Linux功能-RPM命令详解
  7. Oracle 经典语法(一)
  8. ffmpeg关于aac解码
  9. 使用 Nuget打包类库
  10. yw info
  11. Vultr免费vps注册和使用简易教程
  12. MVC 树节点Table格式授权
  13. Webpack 2 视频教程 015 - Webpack 2 中的文件压缩
  14. 几个平台环境里视频编解码和图像scale的硬件加速的方法
  15. VS2010中使用Jquery调用Wcf服务读取数据库记录
  16. 转:Override vs Overload
  17. springBoot(5)---单元测试,全局异常
  18. 【NGINX】配置文件
  19. npm模块之http-proxy-middleware使用教程(译)
  20. HTML邮件注意事项(转)

热门文章

  1. Python常用模块(二)
  2. 微软RPC技术学习小结
  3. Struts2_用Action的属性接收参数
  4. HttpWebRequest Post请求webapi
  5. python_opencv应用系列1:图片读写
  6. 用户管理的设计--4.jquery的ajax实现登录名的校验
  7. hive数据仓库建设
  8. 笨办法学Python(二)
  9. jQuery获取Select选择的Text和Value[转载]
  10. Compass Card Sales(模拟)