信号及信号处理

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
#include
#include

//父进程每隔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);
           }
}

你可能感兴趣的:(linux,LINUX)