在计算机科学中,信号是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。
在 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