C语言 NOTE31

系统编程之管道


在这里插入图片描述

系统编程之信号


在这里插入图片描述

信号响应特点
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 此调用被中断
发布了52 篇原创文章 · 获赞 2 · 访问量 1995

猜你喜欢

转载自blog.csdn.net/weixin_42191545/article/details/104180613