Linux信号来源和捕获处理以及signal函数简介

来源:互联网 发布:签署淘宝图片空间协议 编辑:程序博客网 时间:2024/04/24 16:30

1、信号是什么?信号本质是什么?

      日常生活中,绿灯是一个信号,停止标牌是一个信号,裁判手势也是一个信号。

      信号本质(计算机):软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。

2、信号的来源

       信号来自内核, 生成信号的请求来自以下3个地方。

     (1)用户

           用户可以通过输入Ctrl-C, Ctrl-\等命令,或是终端驱动程序分配给信号控制字符的其他任何键来请求内核产生信号。

     (2)内核

           当进程执行出错时, 内核给进程发送一个信号。 例如,非法段存取,浮点数溢出,亦或是一个非法指令,内核也利用信号通知进程特定事件发生。

     (3)进程

         一个进程可以通过系统调用kill给另外一个进程发送信号, 一个进程可以和另一个进程通过信号通信。

3、信号类型

     

4、信号捕获处理

       进程能够通过系统调用signal告诉内核, 它要如何处理信号, 进程有3个选择。

     (1)接收默认处理(通常是消亡)

             SIGINT的默认处理是消亡, 进程并不一定要使用signal接收默认处理,但是进程能够通过以下调用来恢复默认处理。

             signal(SIGINT, SIG_DFL);

           (2)忽略信号

                     程序可以通过以下调用来告诉内核, 它需要忽略SIGINT。

            signal(SIGINT, SIG_IGN);

           (3)信号处理函数

                     程序能够告诉内核,当程序到来时应该调用哪个函数。

            signal(signum, functionname);

            

5、信号处理例子

      (1)默认处理信号

#include<stdio.h>#include<signal.h>          int main(){                     signal(SIGINT,SIG_DFL);         int i;        for( i = 0; i<10;++i)        {                printf("hello world\n");                sleep(1);         }        return 0;}   


       

(2)忽略信号

#include<stdio.h>#include<signal.h>          int main(){                  signal(SIGINT,SIG_IGN);         int i;        for( i = 0; i<10;++i)        {                printf("hello world\n");                sleep(1);         }        return 0;} 

   

  (3)使用信号处理处理函数

#include<stdio.h>#include<signal.h>          int main(){                 void f(int);              signal(SIGINT,f);         int i;        for( i = 0; i<10;++i)        {                printf("hello world\n");                sleep(1);         }        return 0;}       void f(int signum){           printf("SIGINT\n");}




原创粉丝点击