【linux服务器编程学习】7.信号

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

信号是什么

信号是由用户、系统或者进程发送给目标进程的信息以通知目标进程某个状态的改变或系统异常。

signal信号是进程之间相互传递消息的一种方法信号全称为软中断信号也有人称作软中断从它的命名可以看出它的实质和使用很象中断。

信号概述

发送信号

#include<sys/types.h>
#include<signal.h>
int kill(pid_t pid,in sig);

pid>0 进程号为pid的进程
pid=0 本进程组的所有进程
pid=-1 出了init进程的所有进程
pid<-1 发送给进程组为-pid的所有进程

成功返回0,失败返回-1并设置errno

该函数把信号sig发送给目标进程pid

信号处理

#include<signal.h>
typedef void (*__sighandler_t)(int);

目标进程收到信号时需要定义一个接收函数处理。这是信号处理函数的原型。

Linux信号

请添加图片描述一些常用的信号

信号函数

signal

#include<signal.h>
_sighandler_t signal(int sig,_sighanlder_t handler);

sig是信号类型
handler是指定的信号处理函数

错误返回SIG_ERR并设置errno

为一个信号设置处理函数

sigaction

#include<signal.h>
int sigaction(int sig,const struct sigaction* act,struct sigaction* oact);

sig是信号类型
act指定处理方式
oact输出先前处理方式

sigaction结构体中有sa_handler指定信号处理函数
sa_mask设置进程的信号掩码
sa_flags用于设置程序收到信号的行为

一种更强大的信号处理函数设置接口

信号集

#include<signal.h>
int sigemptyset(sigset_t* set);清空
int sigfillset(sigset_t* set);填满
int sigaddset(sigset_t* set,int signo);添加
int sigdelset(sigset_t* set,int signo);删除
int segismember(const sigset_t * set,int signo);是否在内

信号集表示一组信号的集合可用这一组函数修改信号集

信号掩码

#include<signal.h>
int sigpromask(int how,const sigset_t* set,sigset_t *oset);

how参数
SIG_BLOCK  新的进程信号掩码是当前的和新加的并集
SIG_UNBLOCK 新的进程信号掩码是当前的和新加的交集
SIG_SETMASK设置新的信号集为掩码

set指定新的掩码
oset返回原来的掩码

成功返回0,失败返回-1并设置errno

设置或查看进程的信号掩码

被挂起的信号

设置信号掩码后被屏蔽的信号不能被进程接收将被设置成被挂起的信号这时取消屏蔽能被立即接收到。

#include<signal.h>
int sigpending(sigset_t* set);

set输出被挂起的信号集

成功返回0失败返回-1并设置errno

获得进程当前被挂起的信号

.
.

后记条条大路通罗马我是米兰的小铁匠

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux服务器