系统相关
首页 > 系统相关> > Linux信号

Linux信号

作者:互联网

信号机制是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断。信号的本质是软件层次上对中断的一种模拟(软中断)。它是一种异步通信的处理机制,事实上,进程并不知道信号何时到来。通俗来讲,信号就是系统响应某些条件而产生的一个事件。

信号的产生

有以下几种方式:

  1. 用户按下某些终端按键后引发终端产生信号,如“CTRL+C”。
  2. 硬件产生的异常信号,如无效的内存访问, 这些信号通常由硬件检测并通知Linux内核,然后内核产生信号发送给相关进程。
  3. 进程使用系统调用函数kill给一个进程或进程组发送一个信号,
  4. 用户调用kill命令将信号发送给其他进程。
  5. 当检测到某些软件条件已经发生,并将其通知有关进程时也会发送信号。

信号的处理方式

  1. 对于需要处理的信号,指定处理函数,由该函数处理。
  2. 忽略某信号,对于该信号不做任何处理。
  3. 对该信号的处理保留系统默认值,这种缺省操作大多使得进程终止,进程通过系统调用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