信号是软中断,信号提供了一种异步处理事件的方法
概念
信号都被定义为正整数常量,在头文件signal.h中定义.
不存在编号为0的信号信号产生
- 用户按某些终端键时,引发终端产生的信号。(ctrl+c产生SIGINT信号)
- 硬件异常产生信号(除数为0,无效的内存访问(产生SIGSEGV信号)等),这些条件有硬件检测到,并通知内核。然后内核为该条件发生时正在运行的进程产生适当的信号。
- 进程调用kill函数可以将任意信号发送给另一个进程或进程组。(接收信号的进程和发送信号的进程的所有者必须相同,或发送信号进程的所有者必须是超级用户)
- kill命令发送信号,常用于终止一个失去控制的后台进程
- 当检测到某种软件条件已经发生,并应将其通知有关进程时也产生信号。(如:SIGURG:在网络连接上传来带外的数据;SIGPIPE:(在管道的读进程终止后,一个进程写此管道);SIGALARM:(进程所设置的定时器已经超时))
信号产生时的处理
- 忽略 大多数信号可使用这种方式处理,但有2种信号不允许忽略处理(SIGKILL和SIGSTOP)
- 执行系统默认动作 大多数信号的系统默认动作是终止进程
- 捕捉处理 SIGKILL和SIGSTOP不能被捕捉
信号列举
信号 | 说明 | 描述 | 默认动作 |
---|---|---|---|
SIGABRT | 异常终止(abort) | 调用abort()函数,进程异常终止 | 终止+core |
SIGALRM | 定时器超时(alarm) | alarm()函数或者setitimer()函数超时 | 终止 |
SIGBUS | 硬件故障 | 终止+core | |
SIGCANCEL | 线程库内部使用 | 忽略(linux无此信号) | |
SIGCHLD | 子进程状态改变 | 忽略 | |
SIGCONT | 使暂停进程继续 | 继续/忽略 | |
SIGEMT | 硬件故障 | 终止+core | |
SIGFPE | 算术异常 | 终止+core | |
SIGHUP | 连接点断开 | 终止 | |
SIGILL | 非法硬件指令 | 终止+core | |
SIGINT | 终端终端符 | 终止 | |
SIGIO | 异步IO | 终止/忽略 | |
SIGIOT | 硬件故障 | 终止+core | |
SIGKILL | 终止 | 终止 | |
SIGPIPE | 写至无读进程的管道 | 终止 | |
SIGPOLL | 可轮询事件(poll) | 终止 | |
SIGPROF | 梗概时间超时(setitimer) | 终止 | |
SIGPWR | 电源失效/重启 | 终止/忽略 | |
SIGQUIT | 终端退出符 | 终止+core | |
SIGSEGV | 无效内存访问 | 终止+core | |
SIGSTKFLT | 协处理器栈故障 | 终止+core | |
SITSTOP | 停止 | 停止进程 | |
SIGSYS | 无效系统调用 | 终止+core | |
SIGTERM | 终止 | 终止 | |
SIGTRAP | 硬件故障 | 终止+core | |
SIGTSTP | 终端停止符 | 停止进程 | |
SIGTTIN | 后台读控制tty | 停止进程 | |
SIGTTOU | 后台写向控制tty | 停止进程 | |
SIGURG | 紧急情况(套接字) | 忽略 | |
SIGUSR1 | 用户定义信号 | 终止 | |
SIGUSR2 | 用户定义信号 | 终止 | |
SIGVTALRM | 虚拟时间闹钟 | 终止 | |
SIGWINCH | 窗口大小改变 | 忽略 | |
SIGXCPU | 超过cpu限制(setrlimit) | 终止+core | |
SIGXFSZ | 超过文件长度限制(setrlimit) | 终止+core | |
SIGXRES | 超过资源限制 | 忽略 |