linux信号相关内容

并发编程把我整崩溃了。这篇文章把相关内容捋一下。

1. 异常类型:中断、陷阱、故障、终止。中断是异步,其他三个是同步。中断一般是来自io,陷阱用来调用内核指令。

linux有256种异常,前32种是intel定义的。每个异常有异常号。

2. Unix系统级函数遇到错误时,通常返回-1,并设置全局整数变量errno来表示出什么错了。

创建进程用fork,加载用evecve。

进程有三个状态,运行、停止、终止。

3. waitpid,用来回收进程。

pid_t waitpid(pid_t pid, int *statusp, int options).

pid>0,等待特定进程,-1表示所有子进程

statusp如果非空,*statusp=导致返回的子进程的状态信息。status不能直接读,需要用宏解释:

WIFEXITED(status):exit或者return正常返回结束的子进程。

WEXITSTATUS(status)、WIFSIGNALED(status)、WTERMSIG(status)、WIFSTOPPED(status)、WSTOPSIG(status)、WIFCONTINUED(status)

options, 默认0,挂起调用进程,直到回收一个子进程。可选参数:WNOHANG、WUNTRACED、WCONTINUED。

如果没有子进程,返回-1,并设置errno为ECHILD。如果被信号中断,返回-1,设置errno为EINTR。

wait相当于waitpid(-1, int *statusp, 0)

4. kill是终止或发送信号给进程。

信号发送产生原因有两种:内核检测到错误,或者进程调用kill。

接收信号处理方式3种:ignore、handler、终止。

信号被阻塞,可被接收,只是不被处理。

发送信号基于进程组。int kill(pid_t pid, int sig), pid为负时,发送给进程组。

unsigned int alarm(unsigned int secs), 发送SIGALRM信号给自己。alarm(0)查看之前的alarm还剩几秒,alarm(n)重新定个闹钟并返回之前的闹钟剩几秒。

5. 前面讲进程对信号有三种处理方式:ignore、handler、终止。这里讲handler默认有:终止、停止直到被SIGCONT信号重启、ignore。

sighandler_t signal(int signum, sighandler_t handler)把处理函数挂到信号上。handler可以为SIG_IGN、SIG_DFL。

6. 编写安全处理handler原则:

尽可能简单、只调用异步信号安全的函数、保存和回复errno、阻塞所有信号、用volatile声明全局变量、用sig_atomic_t声明标志。

7. 因为信号处理因操作系统而异,有一个Signal函数封装,可以跨系统。注意S是大写的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值