进程通信——信号

信号的概念及类型

信号是Linux系统中用于进程之间通信或操作的一种机制,信号可以在任何时候发送给某一进程,而无须知道该进程的状态。如果该进程并未处于执行状态,则该信号就由内核保存起来,直到该进程恢复执行并传递给他为止。如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
收到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:

  1. 第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。
  2. 第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。
  3. 第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。

在linux下我们可以使用 kill -l 命令查看当前系统支持的信号,需要注意的是不同的系统支持的信号是不一样的:

在上面的信号中,我们常见或用到的是:

信号编号 信号名 信号说明 默认动作
2 SIGINT Ctrl+c按键终止程序运行的信号 程序终止
4 SIGILL 非法的指令 程序终止
7 SIGBUS 运行非本CPU相关编译器编译的程序 程序终止
9 SIGKILL 强制杀死程序信号,任何程序都不可以捕捉该信号 程序终止,不可被捕捉
10 SIGUSR1 用户自定义信号1 程序终止
11 SIGSEGV 段错误系统给程序发送的信号 程序终止
12 SIGUSR2 用户自定义信号2 程序终止
13 SIGPIPE 管道破裂信号 程序终止
14 SIGALRM alarm()系统调用发送的信号 程序终止
15 SIGTERM kill命令默认发送的信号,默认动作是终止信号 程序终止
17 SIGCHLD 子进程退出信号 忽略该信号

信号的安装

linux下主要有两个函数实现信号的安装:signal()、sigaction()。
1、signal()

#include <signal.h>  //头文件

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

函数说明:注册一个信号捕捉函数
参数说明:① 第一个参数signum指定信号的值。②第二个参数handler制定针对前面函数的处理,可忽略该信号(参数设为SIG_IGN),可以采用系统默认方式处理信号(参数设为SIG_DFL),也可以自己实现处理方式(参数指定一个函数地址),即当指定信号到底时,就会跳转到handler指定的函数执行。
返回值:signal()调用成功时,返回最后一次为安装信号signum而调用signal()时的handler值,失败返回SIG_ERR。

2、sigaction()

#include <signal.h>

int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact);

函数说明:函数可对发来的信号做排队处理(通常在Linux用其来注册一个信号的捕捉函数)
参数说明:①第一个参数signum为要操作的信号,可以为SIGKILL及SIGSTOP外的任何一个特定有效的信号(这两个信号定义自己的处理函数,导致安装错误)。②第二个参数act为指向sigaction结构体的一个指针,在结构体中指定了对信号新的处理方式,当为NULL时,进程会按缺省的方式对信号处理。③第三个参数oldact参数输出先前信号的处理方式,也可指为NULL。若第二个参数和第三个参数都为NULL则该函数用来检查信号的有效性。

struct sigaction结构体如下:

struct sigaction {
   
    void (*sa_handler)(int);
    void 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进程信号的处理过程:(1)在目的进程中安装该信号,即设置如果目标进程捕获该信号时执行的操作代码。Linux采用sigal和sgation系统调用来完成。因信号是异步事件的典型应用,产生信号对进程而言是随机出现的,因此,进程不能预先知道信号会不会发送到当前进程,也不能预先知道信号什么时候发送到当前进程,因此只能在信号到来前告诉内核“在此信号发生时,请执行下列操作”,即所谓的安装信号。 (2)信号被某个进程产生,同时设置此信号的目标进程(一般为目标进程的pid),然后由操作系统管理。Linux采用kill()、arise()、alarm()等系统调用来实现。 (3)信号在目的进程被注册。操作系统将信号添加到目的进程的PCB相关的数据结构中。在每个进程的PCB (task_struct结构)中有一个未决信号的数据成员。 (3)信号在进程中的注销。进程在执行信号相应处理函数之前,首先要把信号在进程中注销。如果存在未决信号等待处理且该信号没有被进程屏蔽,则在运行相应的信号处理函数前,进程会把信号在未决信号链中占有的结构卸掉。 (5)信号生命终止。进程注销信号后,目的进程根据当前进程对此信号设置的处理方式,暂时终止当前代码的执行,保护上下文,转而执行信号处理函数,即捕获该信号,执行完成后再恢复到被中断的位置继续执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值