进程初步已经结束,不过有关进程的知识点还有太多太多,有关进程的其它知识暂且往后挪。你也知道,你已经不止一次遇到信号这个陌生又熟悉的词语了。而且信号和进程,本来就是相互掺和在一起。所以,从这一篇开始,我们对信号说 hello.
1. hello signal 程序
如同你第一次学习 hello world 一样,这里写一个简单的 hello signal 程序。我的目的是希望借助 hello signal 程序来观察它对信号的反馈。
- 代码
// hellosignal.c
#include <stdio.h>
#include <unistd.h>
int main() {
printf("hello signal! I'm %d\n", getpid());
while(1) {
write(STDOUT_FILENO, ".", 1);
sleep(10);
}
return 0;
}
这段代码启动后先打印自己的进程 id 号。接下来就每隔 10 秒的往屏幕打点号,非常简单。
- 编译
$ gcc hellosignal.c -o hellosignal
- 运行
$ ./hellosignal
屏幕打印:
hello signal! I'm 3514
.....
接下来,hellosignal 先在屏幕上输出它的 id 号,然后就开始十分缓慢的打点了。这得多无聊,我们得继续搞事才行。
2. 向 hello signal 发信号
2.1 使用 kill 命令
如果你还记得前面的 kill 命令的话,你一定记得怎么发信号。
再启动一个终端,然后键入 kill -11 3514
(你的进程号和我的可能会不同,自己调整即可)。看看你的 hellosignal 是如何做出反映的。我的 hellosignal 报告结果如下:
hello signal! I'm 3514
.....段错误 (核心已转储)
然后 hellosignal 就退出了。。。
接下来,你可以逐一发送信号 1,2,3,4,5,⋯,31 给你的hellosignal,看看它做出什么反映?
如果你发送了某个信号(比如信号 19)导致 hellosignal 并没有结束,而是暂停了,你可以给它发送信号 18 让它重新恢复执行。
2.2 使用键盘快捷键
上面是通过 kill 向 hellosignal 发信号,你也可以使用键盘快捷键来给 hellosignal 发信号,不过这种方式只能发送给“前台进程”(第一次听说哦)。
键盘快捷键主要有 3 种:
- Ctrl + C (相当于发送信号 2, SIGINT)
- Ctrl + Z (相当于发送信号 20, SIGTSTP)
- Ctrl + \ (相当于发送信号 3,SIGQUIT)
2.3 使用 linux 系统调用
当然啦,你也可以通过编写程序向 hellosignal 发信号。这样的函数有很多,比如 kill
函数,除此之外还有 alarm
函数等等。这些内容以后会慢慢详细讲解,这里就此略过。
3. 不堪一击的 hellosignal
我们的 hellosignal 太弱了,几乎一收到信号就挂。不过这没什么事,以后我们会想办法解决。今天你要做的事就是把所有信号挨个给 hellosignal 发一遍。
4. 总结
- 了解发送信号的 3 种方式
- 了解进程收到不同信号做出的默认行为
kill -l
命令查看信号