在Linux中,信号是由内核产生并发送给进程的一种异步通知机制。信号可以由以下几种方式产生:
- 用户在终端按键入产生信号(如Ctrl+C产生SIGINT)。
- 硬件异常产生信号,如整数除以零(SIGFPE)、无效内存访问(SIGSEGV)。
- 软件异常产生信号,如定时器到期(SIGALRM)。
- 进程调用
kill()
函数发送信号给其他进程。 - 用户在终端执行
kill
命令发送信号给其他进程。 - 当系统发生某个事件时,如文件描述符就绪(如可读数据),会发送信号给注册该事件的进程。
以下是一个简单的示例,演示如何发送信号给进程:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
void handler(int sig) {
printf("Caught signal %d\n", sig);
exit(0);
}
int main() {
// 注册信号处理函数
signal(SIGINT, handler);
// 让进程暂停执行,等待信号
pause();
return 0;
}
在上面的代码中,signal()
函数用于注册信号处理函数handler
。当用户按下Ctrl+C
时,会产生一个SIGINT信号,由handler
函数处理,打印出信号值并退出程序。