ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言 NOTE31

2020-02-05 12:36:58  阅读:268  来源: 互联网

标签:信号处理 C语言 参数 信号 signum NOTE31 sigaction sa


系统编程之信号


自定义信号处理方式函数带传参数和不带参数形式:

  • 不带参数形式:
signal ( 设置信号处理方式 )
  • 头文件 #include <signal.h>
  • 定义函数
 void (*signal(int signum, void(* handler)(int)))(int);
  • 函数说明
    signal()会依参数 signum 指定的信号编号来设置该信号的处理函数. 当指定的信号到达时就会跳转到参数 handler 指定的函数执行. 如果参数 handler 不是函数指针, 则必须是下列两个常数之一:
    SIG_IGN 忽略参数 signum 指定的信号.
    SIG_DFL 将参数 signum 指定的信号重设为核心预设的信号处理方式.
    关于信号的编号和说明, 请参考附录 D
  • 返回值 返
    回先前的信号处理函数指针, 如果有错误则返回 SIG_ERR(-1).
    附加说明 在信号发生跳转到自定的 handler 处理函数执行后, 系统会自动将此处理函数换回原来系统预设的处理方式, 如果要改变此操作请改用 sigaction().

  • 带传参数的形式
  • sigaction (查询或设置信号处理方式)
    相关函数 signal, sigprocmask, sigpending, sigsuspend
  • 头文件
    #include <signal.h>
  • 定义函数
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
  • 函数说明
    sigaction()会依参数 signum 指定的信号编号来设置该信号的处理函数. 参数 signum 可以指定 SIGKILL 和 SIGSTOP 以外的所有信号.
  • 如参数结构 sigaction 定义如下:
struct sigaction
{
	void (*sa_handler) (int);
	sigset_t sa_mask;
	int sa_flags;
	void (*sa_restorer) (void);
}
参数 意义
sa_handler 此参数和 signal()的参数 handler 相同, 代表新的信号处理函数, 其他意义请参考signal().
sa_mask 用来设置在处理该信号时暂时将 sa_mask 指定的信号搁置.
sa_restorer 此参数没有使用.
sa_flags 用来设置信号处理的其他相关操作, 下列的数值可用.OR 运算 组合
A_NOCLDSTOP: 如果参数 signum 为 SIGCHLD, 则当子进程暂停时并不会通知父进程
SA_ONESHOT/SA_RESETHAND: 当调用新的信号处理函数前, 将此信号处理方式改为系统预设的方式.
SA_RESTART: 被信号中断的系统调用会自行重启
SA_NOMASK/SA_NODEFER: 在处理此信号未结束前不理会此信号的再次到来. 如果参数oldact 不是 NULL 指针, 则原来的信号处理方式会由此结构 sigaction 返回.
SA_SIGINFO
  • 返回值
    执行成功则返回 0, 如果有错误则返回-1.
    错误代码 EINVAL 参数 signum 不合法, 或是企图拦截 SIGKILL/SIGSTOPSIGKILL 信号EFAULT 参数 act, oldact 指针地址无法存取.EINTR 此调用被中断
weixin_42191545 发布了44 篇原创文章 · 获赞 0 · 访问量 1121 私信 关注

标签:信号处理,C语言,参数,信号,signum,NOTE31,sigaction,sa
来源: https://blog.csdn.net/weixin_42191545/article/details/104180613

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有