linux的信号的基本概念

来源:互联网 发布:学籍照片采集软件 编辑:程序博客网 时间:2024/05/29 23:24

     信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。

     进程之间可以互相通过系统调用kill发送软中断信号。

     内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。

     注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

     看看这么一个场景:

     1.用户在shell上启动一个进程在前台运行;

     2.用户想要放弃该进程执行,按下Ctrl-C,此时硬盘驱动会产生一个中断给linux内核;

     3.如果当前cpu在运行前台进程,则收到该中断后,linux内核会暂停进程运行,进入内核态;

     4.这个中断被翻译成SIGINT信号,记录到该进程的PCB中(称为内核向进程发送了一个SIGINT信号);

     5.当内核要回到该进程前,会先查询该进程的PCB,发现里面有个信号SIGINT,而该信号的默认处理是终止进程,于是内核调度就不再返回该进程了,而是终止该进程。

     在linux shell上执行kill -l命令:

 kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

列出的就是linux系统信号值。

    一个进程收到系统信号有3种处理方式:

    1.按照进程自定义方式处理:提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(catch)一个信号,SIGKILL和SIGSTOP信号不能被catch

    2.按照默认处理方式处理:对大部分的信号的缺省操作是使得进程终止;

    3.忽略信号:但是有两个信号不能忽略SIGKILL和SIGSTOP。

       关于这点,我想多说下,联系到我们写daemon程序里的代码

        signal(SIGINT,  SIG_IGN);
        signal(SIGHUP,  SIG_IGN);
        signal(SIGQUIT, SIG_IGN);
        signal(SIGPIPE, SIG_IGN);
        signal(SIGTTOU, SIG_IGN);
        signal(SIGTTIN, SIG_IGN);
        signal(SIGCHLD, SIG_IGN);

      这段代码就是表示daemon进程忽略这些信号。

    在进程表的表项中有一个软中断信号域,该域中每一位对应一个信号,当有信号发送给进程时,对应位置位。由此可以看出,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个。


    信号与中断的相似点:
   1)采用了相同的异步通信方式;
   2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;
   3)都在处理完毕后返回到原来的断点;
   4)对信号或中断都可进行屏蔽。
    信号与中断的区别:
   1)中断有优先级,而信号没有优先级,所有的信号都是平等的;
   2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;
   3)中断响应是及时的,而信号响应通常都有较大的时间延迟。