1. 什么是信号?
网上给出的定义是:在计算机科学中,信号(英语:Signals)是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。
简单的理解信号就是一种Linux环境下进程通讯的一种机制。
2. 信号怎么产生的?
信号一般是有以下3个方面产生:
- 通过终端按键产生信号
- 调用系统函数产生信号
- 软件产生的信号
1>终端按键就是我们在Linux中写程序是想要终止某个程序,就会按ctrl+c按键,还有类似ctrl+d、ctrl+\、ctrl+z等。
2>调用系统函数可以产生信号,比如
这里我们将一个死循环的进程放在后台,而我们可以使用一个kill 命令向该进程发送信号。
int kill(pid_t pid, int sig);
int raise(int sig);
//返回值:成功为0,失败为-1;
在上面的图上我们可以看到一个进程可以调用系统函数来发送信号。
3>有软件产生的信号,我们在管道的时候,有一个管道产生的信号SIGPIPE,这个就是软件信号。
还有我们的alarm函数,相当于定一个闹钟,时间到了会发送一个SIGALRM信号。
unsigned int alarm(unsigned int seconds);
//返回值:0或者是当前还剩余的秒数。
如图:
扩展:Core Dump(核心转储)
定义为:核心转储(core dump),在汉语中有时戏称为吐核,是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。这种信息往往用于调试。
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)