信号是一种软中断,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。signal是ipc机制中唯一的异步通信机制。
信号事件的发生有两个来源:
硬件 比如键盘或者其他硬件故障。
软件 比如一些系统函数 kill raise alarm 或者其他一些非法运算等操作。
进程对信号的响应有三种方式:
1)忽略信号,注意SIGKILL和SIGSTOP不能被忽略。
2)捕捉信号,分发多对应的信号处理函数。
3)执行缺省操作,linux 对每种信号都规定了默认的操作。
发送信号的主要函数有:kill,raise, sigqueue, alarm, abort
函数原型为:
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
sample code:
- #include <stdlib.h>
- #include <stdio.h>
- #include <signal.h>
- void disposition(int num)
- {
- if (SIGQUIT == num)
- fprintf(stdout,"catch:SIGQUIT\n");
- else if (SIGINT == num)
- fprintf(stdout,"catch:SIGINT\n");
- return;
- }
- int main(int argc, char **argv)
- {
- int ret = 0;
- fprintf(stdout, "waitting for signal...\n");
- signal(SIGQUIT, disposition);
- signal(SIGINT, disposition);
- pause();
- return ret;
- }