前言
提示:要解决以下疑问:
- 实时信号和可靠信号是一个概念吗?
- . 实时信号解决了标准信号的什么问题?
- 实时信号的处理
一. 实时信号和可靠信号是一个概念吗?
Linux中信号分两种:
- 不可靠信号: [1~31]均为不可靠信号
- 可靠信号:[32~63]为可靠信号或者叫实时信号
二、实时信号解决了标准信号的什么问题
实时信号比标准信号的优势是:
-
实时信号的范围有所扩大,可以应用于应用程序的自定义信号中。而标准信号提供给应用程序随意使用的信号只有两个:SIGUSER1和SIGUSER2
-
对实时信号采取了队列管理。如果同一实时信号实例多次传递到进程,实时信号会多次传递。而标准信号只会传递一次。
-
对实时信号的传递顺序得到了保障。如果进程中有多个不同的实时信号处于未决状态,则会按照信号编号的大小升序传递。也就说信号编号越小,越被优先传递,优先级越高。如果多个同一类型的实时信号,传递顺序和他们的到达顺序一致。而非实时信号的处理时乱序的。
-
当发送一个实时信号时,可为信号指定伴随数据,共接收进程的信号处理器获取。
-
进程会优先处理实时信号,顺序传递,而非实时时乱序的
代码一
#include <stdio.h> #include <signal.h> #include <sys/types.h> #include <unistd.h> void handler(int sig) { if (sig < 34) printf("|"); else printf("&"); fprintf(stderr, "catch sig:%d\n",sig); } int main(int argc, char **argv) { int i,k; sigset_t set; sigemptyset(&set); for (i = SIGHUP; i <= SIGRTMAX; i++){ if (i == SIGKILL || i == SIGSTOP) continue; signal(i,handler); sigaddset(&set,i); } printf("%d\n",getpid()); sigprocmask(SIG_BLOCK,&set, NULL); for (k = 0; k < 20; k++){ write(1,"*",1); sleep(1); } write(1,"\n",1); sleep(5); sigprocmask(SIG_UNBLOCK, &set, NULL); return 0; }
代码二(给代码一的进程发送信号)
#include <stdio.h> #include <signal.h> #include <sys/types.h> #include <stdlib.h> int main(int argc, char **argv) { int i; for(i = SIGHUP; i <= SIGRTMAX;i++) { if(i == SIGKILL || i == SIGSTOP || i ==32 || i == 33) continue; kill(atoi(argv[1]), i); } exit(0); }
>>> a.out 108146 ******************** catch sig:64 catch sig:63 catch sig:62 catch sig:61 catch sig:60 catch sig:59 catch sig:58 catch sig:57 catch sig:56 catch sig:55 catch sig:54 catch sig:53 catch sig:52 catch sig:51 catch sig:50 catch sig:49 catch sig:48 catch sig:47 catch sig:46 catch sig:45 catch sig:44 catch sig:43 catch sig:42 catch sig:41 catch sig:40 catch sig:39 catch sig:38 catch sig:37 catch sig:36 catch sig:35 catch sig:34 catch sig:30 catch sig:29 catch sig:28 catch sig:27 catch sig:26 catch sig:25 catch sig:24 catch sig:23 catch sig:22 catch sig:21 catch sig:20 catch sig:17 catch sig:16 catch sig:15 catch sig:14 catch sig:13 catch sig:12 catch sig:10 catch sig:6 catch sig:3 catch sig:2 catch sig:1 catch sig:31 catch sig:11 catch sig:8 catch sig:7 catch sig:5 catch sig:4 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&||||||||||||||||||||||||||||