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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • vim 关键字搜索_vim中查找某个字符命令

    vim 关键字搜索_vim中查找某个字符命令linux系统里的vim是编辑文本的命令,在vi里查找相应关键字的方法如下:例如搜索the写法:/the+回车/+关键字,回车即可。此为从文档当前位置向下查找关键字,按n键查找关键字下一个位置; ?+关键字,回车即可。此为从文档挡圈位置向上查找关键字,按n键向上查找关键字;…

  • c语言getchar()的用法_c=getchar()

    c语言getchar()的用法_c=getchar()文章目录getchar()函数定义函数返回值注意区分getchar和scanfgetchar的使用实例getchar()函数定义getchar()-字符输入函数,没有参数,从输入缓冲区里面读取一个字符-「一次只能读取一个字符」EOF(-1)-endoffile文件结束标志-键盘上用ctrl+z实现先查一下文档函数返回值该函数以无符号char强制转换为int的形式返回读取的字符,如果到达文件末尾或发生读取错误,则返回EOF(-1

    2022年10月18日
  • 如何制作微信小程序_制作微信GIF表情

    如何制作微信小程序_制作微信GIF表情作为一个小程序从业人员,我经常在公众号推荐各种好玩的软件和小程序。题特意整理了一下,从工具类、娱乐类、游戏类分享一些值得推荐的小程序,希望有所帮助。整理内容花了大半天,觉得有用的话求个赞。娱乐类1.头像小助手这是一款微信头像制作工具,方便一键定制各种个性头像,功能包含给微信头像加V、加字、加1、粉丝头像等功能,轻松制作个性微信头像。2.昵称工具一款昵称制作工具,可以一键生成各种花式昵称,包括空白…

  • 传感器尺寸与像素密度对相片分辨率的影响「建议收藏」

    传感器尺寸与像素密度对相片分辨率的影响「建议收藏」在人们日常生活摄影中,相机的传感器尺寸以及像素素往往决定了一幅图像的清晰度,当然,不同的镜头,不同的CMOS质量等等都会对相片的质量产生影响,今天就简单讨论讨论传感器尺寸和像素密度对图像分辨率的影响。当传感器尺寸一定时,像素越多,也就是像素密度越大,所能记录到的信息也就越多,当然,也不是没有上限的,当像素密度过大的时候,单个感光像素获取到的光线量无疑会变少,所以要提高感光度才能获取到和

  • java里的全局变量_全局变量的值会不会改变

    java里的全局变量_全局变量的值会不会改变在类定义(声明)了全局变量,没有对其赋值,利用类内的方法对其赋值,其值变成了方法给的值,无论是在方法内部还是方法外。(除非你定义了同名的局部变量)

发表回复

您的电子邮箱地址不会被公开。

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