Linux 信号(上)


kill -l

[bozi@localhost test_20160723]$ kill -l

 1) SIGHUP     2) SIGINT 【进程中断】    3) SIGQUIT     4) SIGILL     5) SIGTRAP

 6) SIGABRT     7) SIGBUS     8) SIGFPE 【除0异常】    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 

【--这没有那两个32 和33(共62个)   前面的1-31为普通信号  后面的34以上实时信号--】  

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  

信号在内核中的表示

以上我们讨论了信号产生 (Generation )的各种原因 ,而 实际执行信号的处理动作称为信号递

(Delivery), 信号从产生到递达之间的状态 ,称为信号未决(Pending)。进程可以选择阻塞

(Block )某个信号。被阻塞的信号产生时将保持在未决状态 ,直到进程解除对此信号的阻塞 ,

才 执行递达的动作。 注意, 阻塞和忽略是不同的 ,只要信号被阻塞就不会递达 ,而忽略是在递

达之后 可选的一种处理动作。信号在内核中的表示可以看作是这样的 :

wKiom1eYtXjCp_OUAACsPKsxduU158.png

函数:
        typedef void (*sighandler_t)(int);  【给对用的信号 注册接收到对用信号时的处理函数 注意9号信号不能起效 接收到9号信号 直接进程终止】
       sighandler_t signal(int signum, sighandler_t handler); 注册用户自定义函数handler到相应的信号 实现捕捉过程
       int kill(pid_t pid, int sig); 该某个pid进程发送sig信号
       int raise(int sig);   自己给自己发信号
   
        void abort(void); 使得自己接收到一个SIGABRT(流产)信号 而 异常终止

发信号:

ctrl+2 给当前进程pid发送2号中断信号

kill -2 对应的pid   同样也是向进程号为pid的进程发送2号中断信号

进程报错过程:

     进程出发异常(如除以2、越界访问等), 操作系统捕捉到这个异常给进程发送相应的信号,进程相应相应的信号,这样就出现相应的错误提示 如 段错误

进程收到一个信号后,进程对信号的处理不一定立即的,先保存到PCB中

进程收到信号大部分是立即退出

进程处理信号的可选动作有3种:

1 忽略此信号

2 执行该信号的,默认处理动作

提供一个信号处理函数 ,要求内核在处理该信号时切换到用户态执行这个处理函数 ,这种方 式称为捕捉 (Catch)一个信号。


信号的产生(4种):

1 键盘

2 系统函数

      kill函数

      abort函数使当前进程接收到SIGABRT信号而异常终止。

      raise函数可 以给当前进程发送指定的信号 (自给自发信号 )

          alarm函数 设置闹钟

3 操作系统硬件异常

4 kill 命令行命令 


练习程序:

(1) 命令行kill发信号

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
        printf("pid is :%d\n", getpid());
        while (1);
        return 0;
}
执行命令行 [root@localhost test_20160723]# kill 2 30467 给pid为30467的进程发送2号信号

[bozi@localhost signal_test]$ ./signal_test
pid is :30467
已终止

(2)kill函数发信号

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>

int main()
{
        printf("pid is :%d\n", getpid());
        sleep(3);
        kill(getpid(),8);
        while (1);
        return 0;
}
运行结果:
[bozi@localhost signal_test]$ ./signal_test
pid is :30602
浮点数例外 (core dumped)

(3)abort()

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

int main()
{
        printf("pid is :%d\n", getpid());
        sleep(3);
        //kill(getpid(),8);
        abort();
        while (1);
        return 0;
}
运行结果:
[bozi@localhost signal_test]$ ./signal_test
pid is :30653
已放弃 (core dumped)

(4)raise()

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

int main()
{
        printf("pid is :%d\n", getpid());
        sleep(3);
        //kill(getpid(),8);
//        abort();
        raise(9);
        while (1);
        return 0;
}
运行结果:
[bozi@localhost signal_test]$ ./signal_test
pid is :30697
已杀死

(5)ala

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值