sigaction信号处理

sigaction信号处理1.sigactionintsigaction(intsignum,conststructsigaction*act,structsigaction*oldact);signum:可以指定SIGKILL和SIGSTOP以外的所有信号2.structsigactionstructsigaction{void(*sa_handler)(int);

大家好,又见面了,我是你们的朋友全栈君。

1. sigaction

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

signum:可以指定SIGKILL和SIGSTOP以外的所有信号

2. struct sigaction

struct sigaction 
{
    void     (*sa_handler)(int);
    void     (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t   sa_mask;
    int        sa_flags;
    void     (*sa_restorer)(void);
};

sa_mask:设置在处理该信号时暂时将sa_mask 指定的信号集搁置
sa_flags:设置信号处理相关操作

  • SA_SIGINFO:如果设置,那么采用sa_sigaction;默认采用sa_handler
  • SA_RESETHAND:当调用信号处理函数时,将信号的处理函数重置为缺省值SIG_DFL
  • SA_RESTART:如果信号中断了进程的某个系统调用,则系统自动启动该系统调用
  • SA_NODEFER :一般情况下, 当信号处理函数运行时,内核将阻塞该给定信号。但是如果设置了 SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号

sa_restorer:此参数没有使用

3. siginfo_t

siginfo_t
{
    int      si_signo;  /* 信号值,对所有信号有意义*/
    int      si_errno;  /* errno值,对所有信号有意义*/
    int      si_code;   /* 信号产生的原因,对所有信号有意义*/
    int      si_trapno; /* Trap number that caused hardware-generated signal (unused on most architectures) */
    pid_t    si_pid;    /* 发送信号的进程ID,对kill(2),实时信号以及SIGCHLD有意义 */
    uid_t    si_uid;    /* 发送信号进程的真实用户ID,对kill(2),实时信号以及SIGCHLD有意义 */
    int      si_status; /* 退出状态,对SIGCHLD有意义*/
    clock_t  si_utime;  /* 用户消耗的时间,对SIGCHLD有意义 */
    clock_t  si_stime;  /* 内核消耗的时间,对SIGCHLD有意义 */
    sigval_t si_value;  /* 信号值,对所有实时有意义,是一个联合数据结构, 可以为一个整数(由si_int标示,也可以为一个指针,由si_ptr标示)*/
    int      si_int;    /* POSIX.1b signal */
    void    *si_ptr;    /* POSIX.1b signal */
    int      si_overrun;/* Timer overrun count; POSIX.1b timers */
    int      si_timerid;/* Timer ID; POSIX.1b timers */
    void *   si_addr;   /* 触发fault的内存地址,对SIGILL,SIGFPE,SIGSEGV,SIGBUS 信号有意义*/
    int      si_band;   /* 对SIGPOLL信号有意义 */
    int      si_fd;     /* 对SIGPOLL信号有意义 */
}

4. si_value
通过siginfo_t.si_value可以获得sigqueue(pid_t pid, int sig, const union sigval val)第三个参数传递过来的数据
如:siginfo_t.si_value.sival_int或siginfo_t.si_value.sival_ptr
其实siginfo_t.si_int直接与sigval.sival_int关联,siginfo_t.si_ptr直接与sigval.sival_ptr关联。所以也可同这种方式获得sigqueue发送过来的数据

si_value

5. sigqueue

int sigqueue(pid_t pid, int sig, const union sigval value);
union sigval 
{
    int   sival_int;
    void *sival_ptr;
};

6. 举例

struct sigaction act, oact;
act.sa_sigaction = sig_handler;
sigemptyset(&act.sa_mask); //清空此信号集
act.sa_flags = SA_SIGINFO; //信息传递开关
sigaction(SIGCHLD, &act, &oact);

//sigaction(SIGINT, &oact, NULL); //恢复成原始状态

union sigval var;
//var.sival_int = 3
var.sival_ptr = (void *)&val;
sigqueue(pid, SIGCHLD, var);

SIGCHLD信号被设置,sigaction主动发送一次信号;子进程退出,系统还会调用sig_handler信号处理,此时携带参数为0

参考:http://blog.csdn.net/wangpengqi/article/details/11632567

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141180.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 布隆过滤器的原理,使用场景和注意事项有哪些_布隆过滤器的基本工作原理

    布隆过滤器的原理,使用场景和注意事项有哪些_布隆过滤器的基本工作原理目录什么是布隆过滤器实现原理为啥不用HashMap的问题布隆过滤器数据结构支持删除么如何选择哈希函数个数和布隆过滤器长度最佳实践Redis大Value拆分参考资料什么是布隆过滤器本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilisticdatastructure),特点是高效地插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”。相比于传统的List、Set、Map等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。实现

    2022年9月1日
    2
  • Linux系统中修改文件内容「建议收藏」

    Linux系统中修改文件内容「建议收藏」1、进入文件:vim文件名vimcommon.js2、查找待修改内容位置:(1)按住shift输入“:”,使文件变成可查询状态(2)输入“/”+要修改的内容,回车(例如:要修改服务器地址和端口号)3、修改内容定位到要修改的位置后按i键变成可编辑状态,对要修改的内容进行修改4、退出按ESC键,退出修改状态5、保存(不保存)修改:保存修改:(1)按住shift输入“:”,使文件变成可查询状态(2)输入…

    2022年7月26日
    6
  • 向量的内积和外积「建议收藏」

    向量的内积和外积「建议收藏」本文参考:https://www.cnblogs.com/gxcdream/p/7597865.html 一、向量的内积 1.1向量内积的定义 概括地说,向量的内积(点乘/点积/数量积)就是对两个向量执行点乘运算,即对这两个向量对应位一一相乘之后求和的操作,如下所示,对于向量a和向量b:…

    2022年9月13日
    0
  • asp.net dropdownlist绑定省份_droplist

    asp.net dropdownlist绑定省份_droplistASP.NETDropDownList绑定

    2022年10月8日
    0
  • wireshark过滤语法总结[通俗易懂]

    wireshark过滤语法总结[通俗易懂]做应用识别这一块经常要对应用产生的数据流量进行分析。抓包采用wireshark,提取特征时,要对session进行过滤,找到关键的stream,这里总结了wireshark过滤的基本语法,供自己以后参考。(脑子记不住东西)wireshark进行过滤时,按照过滤的语法可分为协议过滤和内容过滤。对标准协议,既支持粗粒度的过滤如HTTP,也支持细粒度的、依据协议属性值进行的过滤如tc

    2022年7月13日
    19
  • 集成环境哪个好?四大PHP集成开发环境比较

    集成环境哪个好?四大PHP集成开发环境比较http://www.5icool.org/a/201505/a11537.html专注了这么些年技术,没有养成记录和积累的习惯。如今乐于开源和分享经验,却停笔踌躇,不知该从何处说起。开通博客也有一段时间了,也没能写出一篇像样的文章,想了很久,觉得还是应该循序渐进,从搭建和配置开发、调试环境开始。主流的PHP集成开发环境(IntegratedDevelopmentEnvironment…

    2022年6月28日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号