Linux信号概述
2016-02-28 20:54
429 查看
Linux信号概述
信号是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。发送信号
Linux下,一个进程给其他进程发送信号的API是kill函数。其定义如下:#include <signal.h> int kill(pid_t pid, int sig);
该函数把信号sig发送给目标进程;目标进程由pid参数指定,其可能的取值及含义如下表所示:
pid参数 | 含义 |
---|---|
pid>0 | 信号发送给PID为pid的进程 |
pid=0 | 信号发送给本进程组内的其他进程 |
pid=-1 | 信号发送给除init进程外的所有进程,但发送者需要拥有对目标进程发送信号的权限 |
pid<-1 | 信号发送给组ID为-pid的进程组中的所有成员 |
该函数成功时返回0,失败时返回-1并设置errno。几种可能的errno如下表:
errno | 含义 |
---|---|
EINVAL | 无效的信号 |
EPERM | 该进程没有权限发送信号给任何一个目标进程 |
ESRCH | 目标进程或进程组不存在 |
信号处理方式
目标进程在收到信号时,需要定义一个接收函数来处理之。信号处理函数的原型如下:#include <signal.h> typedef void (*sighandler_t)(int);
信号处理函数只带有一个整型参数,该参数用来指示信号类型。信号处理函数应该是可重入的,否则很容易引发一些竞态条件。所以在信号处理函数中严禁调用一些不安全的函数。
除了用户自定义信号处理函数外,bits/signum.h头文件中还定义了信号的两种其他处理方式——SIG_IGN和SIG_DFL:
#include <bits/signum.h> #define SIG_DFL ((__sighandler_t) 0) /* Default action. */ #define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
SIG_IGN表示忽略目标信号,SIG_DFL表示使用信号的默认处理方式。信号的默认处理方式有如下几种:结束进程(Term)、忽略信号(Ign)、结束进程并生成核心转储文件(Core)、暂停进程(Stop)、以及继续进程(Cont)。
中断系统调用
如果程序在执行处于阻塞状态的系统调用时接收到信号,并且我们为该信号设置了信号处理函数,则默认情况下系统调用将被中断,并且errno被设置为EINTR。我们可以使用sigaction函数为信号设置SA_RESTART标志以自动重启被该信号中断的系统调用。对于默认行为是暂停进程的信号(比如SIGSTOP、SIGTTIN),如果我们没有为它们设置信号处理函数,则它们也可以中断某些系统调用(比如connect、epoll_wait)。POSIX没有规定这种行为,这是Linux独有的。
相关文章推荐
- linux精讲——su切换用户
- MOOC《Linux内核分析》第一课
- 《Linux内核 》MOOC 课程
- 《Linux内核 》MOOC 课程
- linux下使用ifconfig和route设置临时ip地址和子网掩码以及默认网关
- win10和Ubuntu14.04双系统恢复Linux引导
- Linux磁盘编号
- Linux基础:对文件打包压缩
- Linux精讲——修改密码passwd
- Linux内核和用户空间通信的方式(一)— proc文件和mmap共享内存
- Linux精讲——usermod命令
- Linux入门(三)文件权限
- CentOS中设置系统级代理
- linux 根目录扩容
- alarm()闹钟函数
- [MEMO] Linux Kernel Debugging Training 琐碎(补充ing)
- Linux内核分析——x86汇编基础
- linux系统资源监控实践
- 在linux上安装NumPy,Matplotlib,SciPy和IPython
- VMware虚拟机中扩大Linux硬盘空间