信号通信的理解
信号的英文名字为signal,是一种进程间异步通信机制,同时也是Linux系统中非常常用的通信机制,许多人都把信号与中断类比,因为中断也是硬件触发CPU响应从而调用所设置的中断服务处理的一种事件。
事件相当于一个软中断,进程不需要具体知道该信号什么时候到达,操作系统同样会中断对应接受消息的进程,然后去执行消息的处理,当然也可以忽略,所以跟中断时非常类似的。
信号的来源
根据信号的产生原因大致分为:硬件信号和软件信号
硬件信号
-
比如键盘的按键按下等等一些外部硬件发生了。
-
由于运算过程中执行了一些非法的指令、除零、访问无效内存等等。
一旦硬件检测到此类信号便会通知Linux内核,Linux内核通知相应的进厂处理该信号。
软件信号
-
比如终端或者另外一个进程向当前进程发送停止信号,比如说kill命令
-
进程中调用一些常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数等等。
比如我们不小心把shell给卡死,使用组合键ctrl+c,即可终止当前进程,注意的是ctrl+c只能终止前台进程。
查看信号
通过kill -l可以查看
-VirtualBox:/media/sf_1/demo/pipe$ 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
前31种是标准信号,后面是实时信号Real-time signals。
值得注意的是 : Linux标准信号为传统UNIX所支持的信号,同时也是不可靠信号,而31以后的信号是新添加的,为可靠信号,不可靠信号与可靠信号的区别在于当向进程连续发送该信号可能由于异常反应造成信号的丢失,设计上的区别是前者不支持消息队列,而后者支持。
可以使用man 7 signal来查看每个信号的具体解释
Signal Value Action Comment
──────────────────────────────────────────────────────────────────────
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGCONT 19,18,25 Cont Continue if stopped
SIGSTOP 17,19,23 Stop Stop process
ps:man的使用
man 1 xxx:可执行程序或shell命令
man 2 xxx:系统调用(内核提供的函数)
man 3 xxx:库调用(程序库中的函数)
man 4 xxx:特殊文件(通常在/dev中找到)
man 5 xxx:文件格式和约定(如/etc/passwd)
man 6 xxx:游戏(过去的有趣程序章节)
man 7 xxx:其他(包括宏包和约定),例如man(7), groff(7)
man 8 xxx:系统管理命令(通常只针对根用户)
man 9 xxx:Linux 内核API(内核调用)
信号处理
信号的处理大概可以分为三种方式 :
1、忽略该信号 但是注意信号SIGKILL和SIGSTOP既不能被捕捉,也不能被忽略。
2、捕捉该信号 即用户自定义的信号处理函数来处理该信号
3、执行系统默认 根据每个信号类型的不同,系统会提供默认的处理机制。