1. 信号通信,其实就是内核向用户空间进程发送信号。只有内核才能发信号,用户空间进程不能发信号。
2. 通过命令 kill -l 可以查看内核可以发送的全部信号,linxu存在64种:
alex@alex-virtual-machine:/extra/process$ 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
3. 与管道通信类似,内核使用“信号”对象的进程间通信方式,称为信号通信。
内核中已经存在信号,不需要自己创建。
4. 调用kill 9 PID可以杀死进程。
5. 举例 kill进程mykill.c:
#include "sys/types.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
int main(int argc,char *argv[])
{
int sig;
int pid;
if(argc < 3)
{
printf("please input param\n");
return -1;
}
sig=atoi(argv[1]);
pid=atoi(argv[2]);
printf("sig=%d,pid=%d\n",sig,pid);
kill(pid,sig);
return 0;
}
测试:通过mykill 杀死 测试进程a.out
854 4005 4005 4005 ? -1 Ss 0 0:00 sshd: alex [priv]
4005 4043 4005 4005 ? -1 S 1000 0:00 sshd: alex@pts/5
4043 4044 4044 4044 pts/5 4170 Ss 1000 0:00 -bash
854 4078 4078 4078 ? -1 Ss 0 0:00 sshd: alex [priv]
4078 4116 4078 4078 ? -1 R 1000 0:00 sshd: alex@pts/6
4116 4117 4117 4117 pts/6 4176 Ss 1000 0:00 -bash
4044 4170 4170 4044 pts/5 4170 R+ 1000 0:22 ./a.out
4117 4176 4176 4117 pts/6 4176 R+ 1000 0:00 ps -ajx
alex@alex-virtual-machine:/extra/process/006$ sudo ./mykill 9 4170
sig=9,pid=4170
执行结果:
854 4005 4005 4005 ? -1 Ss 0 0:00 sshd: alex [priv]
4005 4043 4005 4005 ? -1 S 1000 0:00 sshd: alex@pts/5
4043 4044 4044 4044 pts/5 4044 Ss+ 1000 0:00 -bash
854 4078 4078 4078 ? -1 Ss 0 0:00 sshd: alex [priv]
4078 4116 4078 4078 ? -1 R 1000 0:00 sshd: alex@pts/6
4116 4117 4117 4117 pts/6 4182 Ss 1000 0:00 -bash
4117 4182 4182 4117 pts/6 4182 R+ 1000 0:00 ps -ajx
alex@alex-virtual-machine:/extra/process/006$