这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」
一、Linux下信号介绍
Linux下进行应用编程时,信号的处理必不可少。信号可以用于多进程间通信,查看当前系统支持的所有信号: kill -l
1 | cpp复制代码[wbyq@wbyq linux_c]$ kill -l |
几个比较常用的信号:
- SIGINT 当用户按下了<Ctrl+C>时,用户终端向当前正在运行的进程发出此信号,默认动作为是终止当前进程。
- SIGQUIT 快捷键是<Ctrl+>,和SIGINT 一样默认动作结束当前进程.
- SIGSEGV 访问非法内存产生的信号,也就是经常遇到的
段错误
- SIGALRM 定时器超时信号,比如闹钟的时间到达就会产生该信号.
- SIGIO 数据可读写信号,一般与驱动程序交互时,设备有数据可读,就会产生该信号,通知进程去读取数据。
Linux下应用层的信号与单片机裸机程序里中断类似,都可以设置处理函数.中断服务函数
。
如果进程里不想使用信号的默认处理方式,可以自己捕获信号,然后再做相关处理。
比如: 当用户按下了<Ctrl+C>时,不想立即终止进程,可能还需要做一些善后工作,那么就可以自己捕获SIGINT信号,处理了内存释放、文件关闭、等等一些退出之前的清理工作之后,再退出。
信号的捕获函数如下:
1 | cpp复制代码#include <signal.h> |
二、信号捕获、发送 案例
2.1 捕获Ctrl+C的信号
1 | cpp复制代码#include <stdio.h> |
2.2 捕获段错误信号
1 | cpp复制代码#include <stdio.h> |
2.3 通过kill命令给指定的进程发送信号
语法:
1 | cpp复制代码kill -s <信号名称> <进程的PID号> |
示例:
1 | cpp复制代码[wbyq@wbyq linux_c]$ kill -s SIGINT 18365 |
查看当前进程的PID
1 | cpp复制代码查看后台运行的所有进程: |
2.4 通过代码给指定的进程发送信号
函数的用法与命令一样。
1 | cpp复制代码#include <sys/types.h> |
本文转载自: 掘金