信号的定义
在计算机科学中,信号是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。
信号的作用
- 进程间通信:进程可以通过向其他进程发送信号的方式进行通信,例如某个进程在完成了某项工作之后,可以向另一个进程发送 SIGUSR1 信号,通知其进行下一步的操作。
- 处理异常:信号可以被用来处理程序中的异常情况,例如当一个进程尝试访问未分配的内存或者除以 0 时,系统会向该进程发送 SIGSEGV 或 SIGFPE 信号,用于处理这些异常情况。
- 系统调试:信号可以用于程序的调试,例如在程序运行时,可以向该进程发送 SIGUSR2 信号,用于打印程序的状态信息等。
信号的分类和编号
在 Linux 中,信号被分类为标准信号和实时信号,每个信号都有一个唯一的编号。标准信号是最基本的信号类型,由整数编号表示,编号范围是 1 到 31。实时信号是 Linux 中的扩展信号类型,由整数编号表示,编号范围是 32 到 64。
下面是常见的信号编号和对应的信号名称:
信号编号 信号名称 描述
1 SIGHUP 控制终端挂起或者断开连接
2 SIGINT 中断信号,通常由 Ctrl+C 发送
3 SIGQUIT 退出信号,通常由 Ctrl+\ 发送
4 SIGILL 非法指令信号
5 SIGTRAP 跟踪异常信号
6 SIGABRT 中止信号
7 SIGBUS 总线错误信号
8 SIGFPE 浮点错误信号
9 SIGKILL 强制退出信号
10 SIGUSR1 用户定义信号1
11 SIGSEGV 段错误信号
12 SIGUSR2 用户定义信号2
13 SIGPIPE 管道破裂信号
14 SIGALRM 闹钟信号
15 SIGTERM 终止信号
16 SIGSTKFLT 协处理器栈错误信号
17 SIGCHLD 子进程状态改变信号
18 SIGCONT 继续执行信号
19 SIGSTOP 暂停进程信号
20 SIGTSTP 终端停止信号
21 SIGTTIN 后台进程尝试读取终端输入信号
22 SIGTTOU 后台进程尝试写入终端输出信号
23 SIGURG 套接字上的紧急数据可读信号
24 SIGXCPU 超时信号
25 SIGXFSZ 文件大小限制超出信号
26 SIGVTALRM 虚拟定时器信号
27 SIGPROF 分析器定时器信号
28 SIGWINCH 窗口大小变化信号
29 SIGIO 文件描述符上就绪信号
30 SIGPWR 电源失效信号
31 SIGSYS 非法系统调用信号
32 SIGRTMIN 实时信号最小编号
... ... ...
64 SIGRTMAX 实时信号最大编号
kill -l可以查看操作系统拥有的信号
信号的产生
1. kill 命令
kill 命令是 Linux 中最常用的发送信号的命令,语法如下:
kill [-signal] PID
其中,-signal 可选参数表示要发送的信号类型,如果省略该参数,则默认发送 SIGTERM 信号。PID 表示接收信号的进程 ID。kill -9 就是指 发送SIGKILL命令。
2. kill 函数
除了使用 kill 命令,程序中也可以通过 kill 函数来发送信号。kill 函数的原型如下:
int kill(pid_t pid, int sig);
其中,pid 表示接收信号的进程 ID,sig 表示要发送的信号类型。如果函数调用成功,则返回 0,否则返回 -1 并设置 errno。
3.raise 函数
raise 函数是一个简单的发送信号的函数,可以用来向当前进程发送信号。raise 函数的原型如下:
int raise(int sig);
其中,sig 表示要发送的信号类型。如果函数调用成功,则返回 0,否则返回 -1 并设置 errno。
4. pthread_kill 函数
如果在多线程程序中需要向另一个线程发送信号,可以使用 pthread_kill 函数。pthread_kill 函数的原型如下:
int pthread_kill(pthread_t thread, int sig);
其中,thread 表示接收信号的线程 ID,sig 表示要发送的信号类型。如果函数调用成功,则返回 0,否则返回错误码。
参考:
https://blog.csdn.net/qq_45358642/article/details/129758736
https://baike.baidu.com/item/%E4%BF%A1%E5%8F%B7/7927794