33-Hello signal

进程初步已经结束,不过有关进程的知识点还有太多太多,有关进程的其它知识暂且往后挪。你也知道,你已经不止一次遇到信号这个陌生又熟悉的词语了。而且信号和进程,本来就是相互掺和在一起。所以,从这一篇开始,我们对信号说 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 命令查看信号
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页