Unix信号之sigaction函数

博客搬家,原地址:https://langzi989.github.io/2018/01/28/Unix信号之sigaction函数/

sigaction函数是除signal函数之外的另一个可以设置信号处理的函数。sigaction用法比signal函数复杂,但是可以对信号处理进行更加精准更灵活的控制。sigaction是POSIX的信号接口,而signal函数是标准C的信号接口,所以sigaction函数的可移植性更强。

sigaction函数说明

函数功能

检查或修改与指定信号相关联的处理动作,可以同时检查和修改。

函数原型

struct sigaction{
  void (*sa_handler)(int);		//信号处理函数地址
  sigset_t sa_mask;				//信号掩码集,当调用信号处理函数时,程序将阻塞sa_mask中的信号
  int sa_flag;					//位掩码,指定用于控制信号处理过程中的各种选项。
  void (*sa_sigaction)(int,siginfo_t*,void*);	//暂不用
};

int sigaction(int signo,const struct sigaction*restrict act,struct sigaction*restrict oact);

函数参数

  • signo : 指定操作的信号

  • act : 新修改的sigaction

  • oldact : 保存该函数原有的sigaction。

上述struct sigaction中sa_flag取值说明(常用的有以下两个):

  • SA_NODEFER:当信号处理函数正在进行时,不堵塞对于信号处理函数自身信号功能。
  • SA_RESETHAND:当用户注册的信号处理函数被执行过一次后,该信号的处理函数被设为系统默认的处理函数

函数返回值

  • 0 : 返回0表示设置成功
  • -1 : 返回-1表示设置失败

函数示例

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

void sighandler(int sig) {
	printf("this is in the sig handler\n");

	for (int i = 0; i < 5; i++) {
		printf("num:%d\n", i);
	}
}

int main() {
	struct sigaction act;
	struct sigaction oldact;

	act.sa_handler = sighandler;
	act.sa_flags = SA_NODEFER ;//| SA_RESETHAND;

	sigaction(SIGINT , &act,&oldact);

	printf ("this is the main function\n");

	pid_t pid = getpid();
	printf("%d", pid);
	kill(pid, SIGINT);
}

**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值