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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 计算机错误代码0X000000be,Win7系统出现蓝屏代码0x000000BE的解决方法「建议收藏」

    计算机错误代码0X000000be,Win7系统出现蓝屏代码0x000000BE的解决方法「建议收藏」蓝屏是我们日常使用电脑的时候经常会碰到的故障,这不就有很多win732位系统用户反映说电脑出现蓝屏错误代码0x000000BE,该怎么解决这样的问题呢,接下来给大家讲解一下Win7系统出现蓝屏代码0x000000BE的解决方法吧。原因分析:0x000000BE错误表示硬件设备的驱动程序试图向只读内存错误地写入数据。这个错误一般是因为硬件设备驱动程序存在BUG或安装不正确引起的。解决方法:按开机按…

    2022年10月8日
    3
  • nlp 关键词提取_nlp信息抽取

    nlp 关键词提取_nlp信息抽取目录一、关键词提取概述二、TF-IDF关键词提取算法及实现三、TextRank关键词提取算法实现四、LDA主题模型关键词提取算法及实现五、Word2Vec词聚类的关键词提取算法及实现六、信息增益关键词提取算法及实现七、互信息关键词提取算法及实现八、卡方检验关键词提取算法及实现九、基于树模型的关键词提取算法及实现十、总结一、关键词提取概述关键词是能够表…

    2022年9月15日
    2
  • 让王老吉崛起的三大营销战役「建议收藏」

    让王老吉崛起的三大营销战役「建议收藏」一个存在了百年的区域市场老品牌,在短短5年时间内崛起,迅速成长为具有全国影响力的饮料销售冠军,而且博得了良好的社会美誉,这其中有什么不为人知的营销实践?又有着怎样的成长秘诀?梳理王老吉的发展史,我们注意到,有三大营销战役决定了这个品牌的崛起。撷取这三次营销个案,不但可以让我们知道王老吉的崛起密码,还可以了解到网络营销、品牌定位、产品延伸等营销前沿思想的现实实践。一个“网络营销”的经典案例?如

    2025年7月27日
    4
  • kitti数据集介绍_cifar10数据集下载

    kitti数据集介绍_cifar10数据集下载KITTI数据集下载及解析版本更新时间更新内容作者1V1.0xxx完成主体内容W.Xiao2文章目录KITTIDataset1简介1.1数据采集平台1.2坐标系2数据解析2.1image文件2.2velodyne文件2.3calib文件2.4label文件3KITTI可视…

    2022年10月10日
    2
  • 【橙子笔记】.NetMvc–关于MVC中跳转请求的几种常用方式[通俗易懂]

    【橙子笔记】.NetMvc–关于MVC中跳转请求的几种常用方式[通俗易懂]作者的话:所有加了【橙子笔记】的前缀,都真的是笔记真的一些非常有用的总结这并不是一个真正的项目只是给新人一个很好的总结后端到前端1.控制器跳转对应的视图请求:returnView();2.控制器跳转前端弹窗提示,并跳转到后端:returnContent(“<script>alert(‘用户不存在!’);window.location.href=’../Login/index’;</script>”);前端到后端1.前端通过链接跳转控制器:@H

    2022年7月12日
    29
  • Ubuntu 安装企业版微信

    Ubuntu 安装企业版微信下面就直接讲讲在 ubuntu 环境下如何安装企业版微信 第一步 gitclonehttp gitee com wszqkzqk deepin wine for ubuntu git 第二步 cd 到 deepin wine for ubuntu 文件夹下面 执行下列命令 install sh 第三步 在 home 目录下新建一个文件夹 我命名的是 softwares 然后 cd 进入 softwares 执行如下命令 wgethttp mirrors aliyun com

    2025年10月7日
    0

发表回复

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

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