说明:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
QQ 群 号:513683159 【相互学习】
内容来源:
《Linux系统编程》、《Linux网络编程》、《Unix环境高级编程》
一、概念:
1️⃣信号概念:
软件中断,用于在一个或多个进程之间传递异步信号,即通知进程已发生某种情况的一种技术。
Linux系统中定义了一系列的信号,可由内核产生,也可由系统中的其他进程产生,只要这些进程有足够的权限。
2️⃣进程处理信号的三种选择:
①忽略该信号。(除SIGKILL
和SIGSTOP
信号外)
②按系统默认方式处理(除0以外默认终止+core)。详细可看:Unix系统信号表
③捕捉信号调用回调函数。
3️⃣键盘产生信号方式:
①中断键:Ctrl+C
或 Delete
②退出键:Ctrl+\
4️⃣信号集
用于表示多个信号,数据类型:sigset_t
5️⃣信号屏蔽字
无法决定信号什么时候来,但可通过信号屏蔽字决定什么时候可以被响应。
即:一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。
二、 查看所有信号:
Shell 命令 :kill -l
, 列出所有的信号,如下所示:
xsndz@Linux:~$ 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
0️⃣不存在编号0的信号,常称为空信号。
1️⃣ 1) ~ 33)
为标准信号,SIG+专用名
。
2️⃣34) ~ 64)
为实时信号,SIG+RTMIN+数字 或 SIG + RTMAX+数字
。
PS:
进程可以屏蔽掉大多数的信号,除了SIGSTOP
和SIGKILL
。
①SIGSTOP
信号:使一个正在运行的进程暂停,
②SIGKILL
信号:使正在运行的进程退出。
进程可选择系统的默认方式处理信号,也可选择自己的方式处理产生的信号。
信号之间不存在相对的优先权,系统也无法处理同时产生的多个同种的信号,也就是说,进程不能分辨它收到的是1个或者是42个SIGCONT
信号。
三、信号说明:
四、相关函数函数:
【Linux】函数简介篇——信号相关函数
signal()
——信号截取【man 2 signal】
kill()
——将信号发送给进程/进程组【man 2 kill】
raise()
——允许向进程自身发送信号【man 3 raise】
alarm()
——向当前进程发送SIGALRM信号【man 2 alarm】
pause()
——挂起等待信号打断【man 2 pause】
abort()
——人为制造异常【man 3 abort】
【Linux】函数简介篇——信号集
sigemptyset()
—— 将一个信号集的内容清空
sigfillset()
——将一个信号集的置为全集
sigaddset()
——在某集合中添加某个信号
sigdelset()
——在某集合中删除某个信号
sigismember()
——在某集合中是否存在某个信号
sigprocmask()
——检测或更改其信号屏蔽字
sigpending()
——取出pending集状态
sigaction()
—— 检查或更改信号动作
sigsetjmp()、siglongjmp()
—— 信号处理程序中进行非局部转移
sigsuspend()
——等待信号
五、示例实践:
【Linux】函数示例篇——signal(附前后台切换)
【Linux】函数示例篇——alarm()与pause()
【Linux】函数示例篇——信号集相关函数