📅  最后修改于: 2023-12-03 15:22:38.078000             🧑  作者: Mango
在计算机领域,信号可以理解为异步通知事件。当某个事件发生时,它会向应用程序发送一个信号,应用程序可以通过注册信号处理函数来处理这个事件。信号在 UNIX 系统上被广泛使用,如 SIGTERM 表示终止进程、SIGINT 表示中断进程、SIGHUP 表示终端挂起等。
可以使用 kill 命令来向指定的进程发送信号,例如:
kill -TERM PID
这会向进程 ID 为 PID 的进程发送 SIGTERM 信号。
在应用程序中,可以使用 kill 函数来向指定进程或进程组发送信号:
#include <signal.h>
int kill(pid_t pid, int sig);
参数 pid 表示目标进程或进程组的进程 ID,参数 sig 表示要发送的信号。
在应用程序中,可以使用 signal 函数来注册信号处理函数:
#include <signal.h>
void (*signal(int sig, void (*handler)(int)))(int);
参数 sig 表示要注册的信号,handler 表示信号处理函数,当信号发生时会调用该函数。
例如,下面的代码注册了 SIGINT 信号处理函数:
#include <stdio.h>
#include <signal.h>
void signal_handler(int num) {
printf("Received signal %d\n", num);
}
int main() {
signal(SIGINT, signal_handler);
while (1) {}
return 0;
}
signal_handler 函数会在应用程序收到 SIGINT 信号时被调用,并输出收到的信号编号。在主函数中,我们使用了一个无限循环来等待信号的到来。
在 UNIX 系统上,有很多信号可以用来通知应用程序发生了什么事情。下面列出了一些常见的信号及其默认处理方式:
| 信号 | 含义 | 默认处理 | | ---- | --- | -------- | | SIGINT | 中断 | 终止进程 | | SIGTERM | 终止进程 | 终止进程 | | SIGKILL | 强制终止进程 | 终止进程 | | SIGHUP | 控制台挂起 | 终止进程 | | SIGUSR1 | 用户自定义信号1 | 终止进程 | | SIGUSR2 | 用户自定义信号2 | 终止进程 |
除了在应用程序中使用 signal 函数注册信号处理函数外,还可以使用一些工具来分析进程收到的信号。例如,strace 可以跟踪应用程序的系统调用并输出它收到的信号。
下面是一个使用 strace 的例子:
$ strace -p PID -e trace=signal
这会跟踪进程 ID 为 PID 的进程,并输出它收到的所有信号。
信号是 UNIX 系统中一种广泛使用的异步通知机制,可以用来通知应用程序发生了什么事情。程序员可以使用 signal 函数来注册信号处理函数来处理信号,也可以使用工具如 strace 来分析进程的信号。