Linux进程间通信——信号
概念什么是信号?
- 信号是Linux系统中一种常用的通信机制 , A给B发送信号 , B在收到信号之前执行自己的代码 , 收到信号后 , 不管执行什么程序 , 都暂停运行 , 去处理信号 , 处理完毕后再继续执行原来的程序 , 是一种软中断 。
- 由于信号是通过软件方法实现的 , 具有很强的延时性 , 对用户来讲 , 时间非常短 , 不易察觉
- 每个进程收到的所有信号 , 都是由内核负责发送 , 内核处理
- 系统调用当前进程的某些函数
- 通过命令产生 , 如kill指令
- 硬件异常、段错误、内存出错、总线错误
- 软件条件产生 , 如alarm定时器
- 硬件产生 , 如ctrl+c按键
- 不可靠信号Linux信号机制基本上是从Unix系统中继承过来的 。 早期Unix系统中的信号机制比较简单和原始 , 信号值小于SIGRTMIN的信号都是不可靠信号 , 它的主要问题是信号可能丢失 。
- 可靠信号随着时间的发展 , 实践证明了有必要对信号的原始机制加以改进和扩充 。 由于原来定义的信号已有许多应用 , 不好再做改动 , 最终只好又新增加了一些信号 , 并在一开始就把它们定义为可靠信号 , 这些信号支持排队 , 不会丢失
- 信号的名称是在头文件 里定义的
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进程间通信——信号】从信号产生 , 会先发送给内核 , 通过内核处理再发送到进程 , 进程再处理信号这一过程称为递达
未决信号集从信号产生 , 还未递达至进程 , 信号没有被处理掉 , 这过程中会有一个未决信号集存贮这些信号
阻塞信号集也叫做信号屏蔽字 , 每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集 , 该信号集中的所有信号在递送到进程后都将被阻塞 。
文章插图假设发送第三个信号 , 若阻塞信号集第三位为1 , 那么进程就不会收到该信号 , 因此未决信号集中第三位将保持状态为1
Linuxc/c++服务器开发高阶视频 , 电子书学习资料后台私信【架构】获取内容包括C/C++ , Linux , Nginx , ZeroMQ , MySQL , Redis , MongoDB , ZK , 流媒体 , P2P , K8S , Docker , TCP/IP , 协程 , DPDK多个高级知识点
文章插图
文章插图信号处理方式
- 系统默认动作 , 例如ctrl+c将进程杀死
- 忽略(丢弃)该信号 , 就象没有收到该信号似的继续运行
- 捕捉信号 , 自定义动作
- signal函数函数原型:typedef void (*sighandler_t)(int);//返回类型为空的函数指针 , 整型参数sighandler_t signal(int signum, sighandler_t handler)功能:接收某个信号sig(第一个参数) , 使程序接收到信号时执行对应函数func(第二个参数) , func这个函数必须有一个int类型的参数(即接收到的信号)func也可以是下面两个特殊值:SIG_IGN 屏蔽该信号SIG_DFL 恢复默认行为
- int kill(pid_t pid, int sig);功能:给指定进程发送信号(不一定杀死) , 第一个参数是进程ID , 第二个参数是发送信号的类别 , 返回值:成功返回0 ,失败返回-1
- 星期一|亚马逊:黑五与网络星期一期间 第三方卖家销售额达到48亿美元
- 空间|垃圾文件正在吞噬你的C盘空间用这四种方法,还你一个干净的C盘
- 广告点击|广告效果评估:30天的广告时间评估最全面
- 要来|折叠屏iPhone终于要来了!可惜发布的时间有点晚,你愿意等吗?
- 智能手机品|越南手机悄然崛起!创立短短2年时间,在当地接连击退苹果、小米
- 科技|短视频行业领先 云想科技成长空间广阔
- 黑色|亚马逊黑色星期五及网购星期一期间全球第三方卖家销售额超48亿美元
- 移植|开发者将移植ARM Mac的Linux系统 但需要得到资金支持
- 网间|新外观专利陆续曝光 徐起和网间透露realme极致性能新机将至
- Android|索尼Android 11更新时间表公布 最早本月开始
