【Linux】对信号产生的内核级理解
信号是进程间通信的一种简单方式,它将有限的信息量传递给进程。在Linux中,信号是由内核产生并发送给进程的。
以下是一些常见的信号:
- SIGHUP:当终端断开时,用户会话头挂断信号。
- SIGINT:当用户按下
Ctrl+C
时,程序会接收到中断信号。 - SIGKILL:无法被处理、忽略或者阻塞,通常用于强制终止进程。
- SIGTERM:程序结束(terminate)信号,默认行为是结束进程。
- SIGCHLD:当子进程改变状态时,父进程会收到这个信号。
内核如何产生信号:
- 硬件异常产生信号:如除以0、无效的内存访问。
- 软件中断产生信号:如
alarm
定时器到时,会产生SIGALRM
信号。 - 进程运行错误产生信号:如一个进程调用了
kill
函数,向其他进程发送信号。 - 用户态程序请求产生信号:如
kill
命令。
如果你想要在内核中理解信号的产生和处理,你可以查看内核源代码中的signal.c
或者sigqueue.c
文件。这些文件包含了信号的初始化代码和处理函数。
以下是一个简单的用户空间代码示例,用于捕获并处理信号:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void handle_sigint(int sig) {
printf("Caught SIGINT, signum = %d\n", sig);
}
int main() {
struct sigaction sa;
sa.sa_handler = &handle_sigint;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
sigaction(SIGINT, &sa, NULL);
while(1) {
printf("Waiting for SIGINT...\n");
pause(); // 暂停进程直到信号到来
}
return 0;
}
这段代码设置了一个信号处理函数handle_sigint
来处理SIGINT
信号(当用户按下Ctrl+C
时产生)。程序会一直循环等待这个信号,一旦信号到来,就会调用handle_sigint
函数来处理。
评论已关闭