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 )某个信号。被阻塞的信号产生时将保持在未决状态 ,直到进程解除对此信号的阻塞 ,
才 执行递达的动作。 注意, 阻塞和忽略是不同的 ,只要信号被阻塞就不会递达 ,而忽略是在递
达之后 可选的一种处理动作。信号在内核中的表示可以看作是这样的 :
函数:
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 执行该信号的,默认处理动作
3 提供一个信号处理函数 ,要求内核在处理该信号时切换到用户态执行这个处理函数 ,这种方 式称为捕捉 (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