信号产生
对信号的概念进行一定的理解后,就可以从时间维度上讲解信号产生的话题。
信号产生方式
键盘产生
- Ctrl+C (SIGINT):已验证,不再重复。
- Ctrl+\(SIGQUIT):发送终止信号并生成 core dump 文件,用于事后调试。
- Ctrl+Z(SIGTSTP):发送停止信号,将当前前台进程挂起到后台。
至于键盘是如何产生信号的话题需要到后面进行揭晓。
kill 命令产生
我们之前演示过用 Kill 命令的 9 号信号可以杀死进程。这里让每一个信号都有自己的捕捉方式或者忽视该信号,验证每一个信号是否都会调用自定义函数。
#include <iostream>
#include <csignal>
#include <unistd.h>
void handler(int signo) {
std::cout << "我这个进程:" << getpid() << ",抓到了一个信号:" << signo << std::endl;
}
int main() {
for(int i = 1; i <= 31; i++) {
signal(i, handler);
}
while(true) {
std::cout << "我是一个进程:" << getpid() << std::endl;
sleep(1);
}
return 0;
}
验证后发现,有几个信号比较特别,9 号和 19 号信号不可被捕捉,不可被忽略。这是为了防止有人设置病毒,并且将每个信号都设置成自定义捕捉方法,导致无法杀掉该进程。
函数产生信号
kill 系统调用
kill 命令实际上底层一定调用了 kill 函数。kill 函数可以给一个指定的进程发送指定的信号。
int kill;


