1.信号的概念
信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,是系统资源消耗最小的进程间通信方式。Linux下所有的异常退出都是因为信号。在shell下输入kill_l可显示Linux系统支持的全部信号
2.信号的来源:
(1)硬件的方式
用户在中端按下某些键时,如Ctrl+c;
硬件异常产生某些信号,如除数为0、无效的存储空间等;
(2)软件方式
进程调用kill或sigqueue函数发送信号
由alarm或settime设置的定时器超时时将产生SIGALRM信号
3.信号的分类:
可靠信号(实时信号):信号33~64号,信号在未决信号队列里面排队,信号可被递送多次
不可靠信号:1~31号:不支持排队
4.进程对信号的响应:
(1)捕捉信号
(2)忽略信号。(注意SIGKILL和SIGSTOP信号不能被忽略也不能被捕获和阻塞)
(3)系统默认方式处理(多数默认操作是终止)
5.信号的处理:
(1)signal(int signum,sighandler_t handler);捕捉
(2)int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact));检查或设置进程在接收到信号时的动作
(3)int pause(void);函数使调用进程挂起直到捕捉到一个信号。
(4)int kill(pid_t pid,int sig);用来发送信号给直到的进程
(5)int raise(int sig);给调用它的进程发送信号
(6)sigqueue();发送信号
(7)alarm/getitimer/settimer 用来设置定时器
(8)abort()向进程发送SIGABORT信号
有关信号的举例:
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
//父进程每隔5S发送一个SIGQUIT给子进程 KILL 子进程 未收到信号 1S输出“”XXXDHR“
//收到信号输出 HELLO
void haha(int signum)
{
printf("hello");
}
void main()
{
pid_t pid=1;
//int signum=SIGQUIT;
pid=fork();
if(-1==pid)
{
return -1;
}
else if(0==pid)
{
signal(SIGQUIT,haha);
while(1)
{
printf("LCDHR");
sleep(1);
printf(" ");
}
}
else
while(1)
{
printf("yuio");
sleep(5);
kill(pid,SIGQUIT);
}
}