今天我们来说一下进程间通信的第二种方式:信号。信号是用户和内核之间进行通信的一种方式。
1.如何查看所有信号
在终端输入 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
2. 特殊的信号
(1)可以从中端输入的信号
-
SIGINT (ctrl+c)
-
SIGQUIT (ctrl+\)
-
SIGSTP (ctrl+z)
(2)9号和19号信号
-
9号信号SIGKILL ——>进程结束
-
19号信号SIGSTOP——>进程挂起
(3)
SIGSEGV:表示内核操作内存错误
SIGUSR1:用户可以使用该信号实现通信
SIGCHLD:表示该进程有一个子进程结束了
SIGPIPE:表示管道破裂
SIGIO:表示IO事件发生
3.信号的处理方式
4.函数接口
(1) single <切换信号的处理方式>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
(2) 定时器alarm <间隔seconds秒后给进程发送SIGALRM信号>
unsigned int alarm(unsigned int seconds);
(3) kill <向进程发送信号>
int kill(pid_t pid, int sig);
5.同步和异步
所谓同步,就是会阻塞等待对方发送消息,如线程一般,可实现同步通信;
所谓异步,就是不知道对方啥时候发消息,所以不会阻塞等待,会执行自己的程序,如果收到对方消息才会执行相应程序;
今天就到这里啦!