信号是Linux下一种常见的IPC机制。信号机制也是UINX系统最早使用的进程间通信机制之一,主要用于向一个或多个进程发送异步事件信号。信号既可以由硬件产生(如按键下键盘亦或者复位键),也可以由软件产生(如访问虚拟内存中不存在的地址)。
常见的预定义信号可以在系统中通过kill -l命令查看,不同的平台结果可能不同。Linux使用存储在每个进程的task_struct结构中的信息实现信号机制,其受限于处理器字长,32位处理器则只支持32信号,64位处理器可以支持到64种信号。下面是在某64位平台上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
关于信号的可靠性,信号值小于SIGRTMIN的信号是可能丢失的。原因在于,同种信号进程无法区分信号的数量,例如收到1个还是多个SIGUSR1信号,信号处理函数在执行过程中所有相同信号都将合并成一个信号进行处理。信号值在SIGRTMIN和SIGRTMAX之间的信号则是可靠的,其支持排队。
常见的信号发送函数有kill、sigqueue、alarm、setitimer等,信号安装函数signal(不带参数)、sigaction(可带参数,与sigqueue配合使用)。下面对这几个函数做简要介绍。
a、kil函数原型:
int kill(pid_t pid, int sig);
pid > 0 向pid指定的进程发送sig指定的信号
返回值:成功返回0; 错误返回-1,并且errno会被设置相应的值
b、sigqueue函数原型:
int sigqueue(pid_t pid, int sig, const union sigval value);
将sig信号发送到指定的PID进程中ÿ