Linux进程间通信——信号

概念什么是信号?

  • 信号是Linux系统中一种常用的通信机制 , A给B发送信号 , B在收到信号之前执行自己的代码 , 收到信号后 , 不管执行什么程序 , 都暂停运行 , 去处理信号 , 处理完毕后再继续执行原来的程序 , 是一种软中断 。
特点
  • 由于信号是通过软件方法实现的 , 具有很强的延时性 , 对用户来讲 , 时间非常短 , 不易察觉
  • 每个进程收到的所有信号 , 都是由内核负责发送 , 内核处理
与信号相关的事件或者名词产生信号的基本方法
  • 系统调用当前进程的某些函数
  • 通过命令产生 , 如kill指令
  • 硬件异常、段错误、内存出错、总线错误
  • 软件条件产生 , 如alarm定时器
  • 硬件产生 , 如ctrl+c按键
信号分类及信号一览表1.可靠信号与不可靠信号
  • 不可靠信号Linux信号机制基本上是从Unix系统中继承过来的 。 早期Unix系统中的信号机制比较简单和原始 , 信号值小于SIGRTMIN的信号都是不可靠信号 , 它的主要问题是信号可能丢失 。
  • 可靠信号随着时间的发展 , 实践证明了有必要对信号的原始机制加以改进和扩充 。 由于原来定义的信号已有许多应用 , 不好再做改动 , 最终只好又新增加了一些信号 , 并在一开始就把它们定义为可靠信号 , 这些信号支持排队 , 不会丢失
2.指令kill -l 查看所有信号
  • 信号的名称是在头文件 里定义的
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX
  • Linux提供两个特殊信号:9号和19号信号 , 无法修改 , 提供终止进程的手段
  • 写信号时最好使用信号宏名称 , 因为不同系统下宏的数值可能是不同的 , 如下有些信号宏可能有多个数值

Linux进程间通信——信号文章插图
递达【Linux进程间通信——信号】从信号产生 , 会先发送给内核 , 通过内核处理再发送到进程 , 进程再处理信号这一过程称为递达
未决信号集从信号产生 , 还未递达至进程 , 信号没有被处理掉 , 这过程中会有一个未决信号集存贮这些信号
阻塞信号集也叫做信号屏蔽字 , 每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集 , 该信号集中的所有信号在递送到进程后都将被阻塞 。
Linux进程间通信——信号文章插图
假设发送第三个信号 , 若阻塞信号集第三位为1 , 那么进程就不会收到该信号 , 因此未决信号集中第三位将保持状态为1
Linuxc/c++服务器开发高阶视频 , 电子书学习资料后台私信【架构】获取内容包括C/C++ , Linux , Nginx , ZeroMQ , MySQL , Redis , MongoDB , ZK , 流媒体 , P2P , K8S , Docker , TCP/IP , 协程 , DPDK多个高级知识点
Linux进程间通信——信号文章插图
Linux进程间通信——信号文章插图
信号处理方式
  • 系统默认动作 , 例如ctrl+c将进程杀死
  • 忽略(丢弃)该信号 , 就象没有收到该信号似的继续运行
  • 捕捉信号 , 自定义动作
信号相关函数头文件