系统编程之管道、系统编程之信号、使用kill -l:查看信号编号

系统编程之管道


在这里插入图片描述

系统编程之信号


在这里插入图片描述

信号响应特点
1.同时响应时,实时信号存在优先级,数值越大的先响应,非实时信号随机响应
如何验证:使用sigprocmask将所有信号阻塞后,发送所有信号给该进程,然后解除阻塞就可以观察信号响应顺序。
2.信号存在先后响应,先响应的响应,后来的信号可以嵌套响应,注意:非实时信号仅能嵌套一次,实时信号可以嵌套多次,因为实时信号内核会保存多次的差异。


使用kill -l:查看信号编号

在这里插入图片描述


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

  • 不带参数形式:
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 此调用被中断
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值