Linux信号
作者:互联网
信号机制是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断。信号的本质是软件层次上对中断的一种模拟(软中断)。它是一种异步通信的处理机制,事实上,进程并不知道信号何时到来。通俗来讲,信号就是系统响应某些条件而产生的一个事件。
信号的产生
有以下几种方式:
- 用户按下某些终端按键后引发终端产生信号,如“CTRL+C”。
- 硬件产生的异常信号,如无效的内存访问, 这些信号通常由硬件检测并通知Linux内核,然后内核产生信号发送给相关进程。
- 进程使用系统调用函数kill给一个进程或进程组发送一个信号,
- 用户调用kill命令将信号发送给其他进程。
- 当检测到某些软件条件已经发生,并将其通知有关进程时也会发送信号。
信号的处理方式
- 对于需要处理的信号,指定处理函数,由该函数处理。
- 忽略某信号,对于该信号不做任何处理。
- 对该信号的处理保留系统默认值,这种缺省操作大多使得进程终止,进程通过系统调用signal函数来指定对于某个信号的处理行为。
改变信号响应方式
signal()函数可以为一个特定的信号(除了无法捕获的SIGKILL和SIGSTOP信号)注册相应的处理函数。
#include <signal.h>
void (*signal(int signum, void (*handler)(int)))(int);
参数signum表示所注册函数针对的信号名称,参数handler通常是指向调用函数的函数指针,即所谓的信号处理函数。handler可以是用户自定义函数,也可以是两个<signal.h>中定义的值:1、SIG_IGN:忽略signum指出的信号。2、SIG_DFL:调用系统定义的缺省信号处理。
注意:并非程序执行到signal调用时就立即对指定的信号进行操作,这个函数只是告诉程序在遇到这个信号时用什么函数来处理。
发送信号
kill函数
将信号发送给一个进程或进程组
#include <signal.h>
#include <sys/types.h>
int kill(pid_t pid, int sig);
其中pid参数的取值如下:
pid参数取值及其定义
pid | 含义 |
---|---|
pid > 0 | 将信号发送给进程号为pid的进程 |
pid = 0 | 将信号发送给与目前进程相同进程组的所有进程 |
pid < 0 && pid != -1 | 向进程组ID为pid绝对值的进程组中的所有进程发送信号 |
pid = -1 | 除发送给自身进程外,还向所有进程ID大于1的进程发送信号 |
sig参数对应的是信号编码,当其为0(即空信号)时,实际不发送任何信号,但照常进行错误检查。因此可用于检查目标进程是否存在,以及当前进程是否具有向目标发送信号的权限。
标签:函数,int,pid,发送给,信号,Linux,进程 来源: https://blog.csdn.net/weixin_45961392/article/details/115497380