(P20)信号安装函数:sigaction

news/2024/2/27 21:00:23

文章目录

    • 1.sigaction函数
    • 2.sigaction结构体
    • 3.sigaction实例

1.sigaction函数

  • sigaction
    包含头文件<signal.h>;
    功能:sigaction函数用于改变进程接收特定信号后的行为
    act:信号的处理函数
    old:信号安装之前,关联的行为
原型:int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);参数:
第一个参数:
该函数的第一个参数为信号的值,可以为除SIGKILL以及SIGSTOP外的任何一个特定有效的信号(因为为这俩信号定义自己的处理函数,将
导致信号安装错误)
第二个参数:
第二个参数是指向结构sigaction的一个实例的指针,在结构sigaction的实例中,指定了对特定信号的处理,可以为空,进程会以
缺省的方式对信号进行处理
第三个参数:
oldact指向的对象用来保存原来对相应信号的处理,可指定oldact为NULL返回值:
函数成功返回0,失败返回-1

2.sigaction结构体

  • sigaction结构体
    第2个参数最为重要,其中包含了对指定信号的处理、信号所传递的信息、信号处理函数执行过程中应屏蔽掉哪些函数等等
    man sigaction
struct sigaction 
{//下面的2个声明(函数指针)只能任选其一void     (*sa_handler)(int);//对不可靠信号安装的原型,对可靠信号安装也可以使用该原型,只不过此时它不能传递数据void     (*sa_sigaction)(int, siginfo_t *, void *);//对可靠信号安装的原型sigset_t   sa_mask;//可以指定一个信号屏蔽字,用来屏蔽放到屏蔽字当中的信号int        sa_flags;//影响信号的行为void     (*sa_restorer)(void);//该字段可以不用关心
};

3.sigaction实例

  • eg1:P20sigaction.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \} while(0)void handler(int sig);int main(int argc, char *argv[])
{struct sigaction act;act.sa_handler = handler;sigemptyset(&act.sa_mask);act.sa_flags = 0;//NULL表示不关心信号之前的行为//sigaction关联一个动作if (sigaction(SIGINT, &act, NULL) <0)ERR_EXIT("sigaction error\n");//以便有机会发送信号for (;;)pause();return 0;}
void handler(int sig)
{printf("recv a sig = %d\n", sig);
}
  • 测试:改变了信号的输出行为
    在这里插入图片描述
  • eg:P20sigaction1.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \} while(0)void handler(int sig);
//用sigaction模拟signal函数,类型可以从man signal中看到,所以这么写
_sighandler my_signal(int sig, _sighandler_t handler);int main(int argc, char *argv[])
{// struct sigaction act;// act.sa_handler = handler;// sigemptyset(&act.sa_mask);// act.sa_flags = 0;// if (sigaction(SIGINT, &act, NULL) <0)//     ERR_EXIT("sigaction error\n");my_signal(SIGINT, handler);for (;;)pause();return 0;}//信号原来的行为从oldact返回回来
//my_signal等价于signal函数
//signal函数既可以安装可靠信号,也可以安装不可靠信号
//但是在安装可靠信号时,函数指针只能是handler,不能用可以传递更多数据的函数
_sighandler my_signal(int sig, _sighandler_t handler)
{strucy sigaction act;struct  sigaction oldact;act.sa_handler = handler;sigemptyset(&act.sa_mask);act.sa_flags = 0;//信号原来的行为从oldact返回回来if (sigaction(sig, &act, &oldact) <0)return SIG_ERR;return oldact.handler;//返回信号原来的处理函数
}void handler(int sig)
{printf("recv a sig = %d\n", sig);
}
  • 测试:
    signal也是在可靠的机制上进行安装信号的,当信号安装完毕后,当信号处理函数被执行后,信号的默认行为是不会自动恢复的。我们可以认为他是调用sigaction来实现的。实际上,内核代码是调用do_sigaction来实现的

在这里插入图片描述

  • eg:P20sa_mask.c
    sa_mask如何改变信号的行为
    在这个信号处理函数执行的时候,能否屏蔽其他信号?
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \} while(0)void handler(int sig);int main(int argc, char *argv[])
{struct sigaction act;act.sa_handler = handler;sigemptyset(&act.sa_mask);sigaddset(&act.sa_mask, SIGQUIT);act.sa_flags = 0;if (sigaction(SIGINT, &act, NULL) <0)ERR_EXIT("sigaction error\n");for (;;)pause();return 0;}
void handler(int sig)
{printf("recv a sig = %d\n", sig);
}
  • 测试:
    在还没有返回的时候,出现了3号信号,程序退出,说明在2号信号处理函数执行的时候,没有屏蔽3号信号,直接被递达了
    在这里插入图片描述
    按下ctrl \并没有马上退出来,因为该信号在先前信号还没有运行完的时候阻塞了,直到先前信号运行完毕,该信号才能递达
    在这里插入图片描述
    在这里插入图片描述

  • eg:P20sa_,ask1.c
    注意区别:sa_mask中的掩码能阻塞信号,当处理函数在执行的过程中,加入到掩码中的信号将要被阻塞,直到handler返回才能被递达;
    sigpromask表示将这些集合中的信号添加到进程的信号屏蔽字当中,这些信号就不能被递达了,即使发生了

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \} while(0)void handler(int sig);int main(int argc, char *argv[])
{//当处理函数在执行的过程中,加入到掩码中的信号将要被阻塞struct sigaction act;act.sa_handler = handler;sigemptyset(&act.sa_mask);act.sa_flags = 0;//将SIGINT加入到了进程中的信号屏蔽字,将对应的位置为1//SIGINT信号发生的时候,不能被递达,会处于pending未决状态sigset_t s;sigemptyset(&s);sigaddset(&s, SIGINT);sigprocmask(SIG_BLOCK, &s, NULL);if (sigaction(SIGINT, &act, NULL) <0)ERR_EXIT("sigaction error\n");for (;;)pause();return 0;}
void handler(int sig)
{printf("recv a sig = %d\n", sig);
}
  • 测试:
    在这里插入图片描述
    按下ctrl \就可以退出程序,因为他没有阻塞,所以他被递达了

  • Makefile

.PHONY:clean all
CC=gcc
CFLAGS=-Wall -g
BIN=01sigac
all:$(BIN)
%.o:%.c$(CC) $(CFLAGS) -c $< -o $@
clean:rm -f *.o $(BIN)

http://www.ppmy.cn/news/192110.html

相关文章

华为 P20 Pro 相机体验报告

从 618 到现在&#xff0c;我一共用 P20 Pro 正好也差不多一个月了&#xff0c;P20 Pro 的三摄算得上是今年智能手机市场里的一大黑马&#xff0c;发布之初在 DxOMark 直接登顶&#xff0c;让它有了很多争议&#xff0c;所以我把积累了一个月的样张&#xff0c;用对比来看看实际…

概率密度函数的非参数估计方法

概率密度函数的非参数估计方法 1. Parzen窗方法2. kn近邻估计 \qquad 直接由样本来估计概率密度 p ( x ) p(\boldsymbol{x}) p(x) 的方法&#xff0c;称为非参数方法 (non-parametric method) \text{(non-parametric method)} (non-parametric method)。 \quad ● \quad 概率…

学习笔记P20-CNN

学习网址&#xff1a;https://www.bilibili.com/video/av48285039?p20 前言 CNN【Convolutional Neural Network&#xff0c;CNN或ConvNet】通常被用在影像处理的问题上&#xff0c;但是并不是说只有CNN才能做影像处理&#xff0c;一般的Neuron Network也可以做这件事。 例…

P20到P23js知识点

1.比较运算符&#xff1a;a.比较值&#xff1a;1“1” true b.比较值与类型&#xff1a;1“1” false 2.数组&#xff1a; A.定义&#xff1a;a.隐式定义&#xff1a;var数组名[值&#xff0c;值] b.直接实例化&#xff1a;var数组名new Array(值&#xff0c;值) c.定义数组…

【PyTorch教程】P20 ReLU

ReLU Replace的设置&#xff1a; 激活函数&#xff0c;只有一个batch_size参数需要设置。 效果&#xff1a; 可以运行的代码 # &#xff01;usr/bin/env python3 # -*- coding:utf-8 -*-""" author :24nemodate :2021年07月07日 """impo…

谷粒商城-02-p20-p27

一、SpringCloud Alibaba 1、SpringCloud Alibaba 简介 1&#xff09;、简介 Spring Cloud Alibaba 致力于提供微服务开发的****一站式解决方案。此项目包含开发分布式应用 微服务的必需组件&#xff0c;方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布 …

vue 课程学习p20---p40

计算属性 计算属性调用时&#xff0c;不加&#xff08;&#xff09;区别于方法 p12计算属性的复杂应用 计算data—>books里的总价 回顾 p23计算属性的getter和setter 计算属性一般没有setter方法 p24计算属性和methods对比 计算属性只调用一次&#xff0c;methods调用…

剑指 Offer 41. 数据流中的中位数

题目&#xff1a; 如何得到一个数据流中的中位数&#xff1f;如果从数据流中读出奇数个数值&#xff0c;那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值&#xff0c;那么中位数就是所有数值排序之后中间两个数的平均值。 例如&#xff0c; [2,…

华为mate20参数表_华为Mate20售价5000起 华为Mate20配置参数详解

华为Mate20最新消息:华为Mate20配置被曝光地差不多了,花火网小编也会在下文对华为Mate20的配置参数详细介绍,不过更多人关注的还有一点,就是华为Mate20的售价,据说华为Mate20售价在5000左右,目的就是为了从苹果口中分一杯羹 华为近些年在手机市场做的风生水起,它们每一款…

参数曲面matlab,MATLAB空间曲面的实现方法

分析数据的时候,有时需要用到三维曲面进行后处理展示,介绍了在MATLAB中生成三维曲面的几种方法: case1 通过仿真得到x,y,z的数值,其中z(x,y)解析解难以得到的情况,即x,y,z均为数据的情况: x=[0.05 0.1 0.15 0.2 0.25 0.05 0.1 0.15 0.2 0.25 0.05 0.1 0.15 0.2 0.25 0.05…

Python入门学习P16~P20

目录 函数1&#xff1a; 1.format有两种参数&#xff0c;位置参数012和关键字参数abc&#xff0c;如果综合使用的话&#xff0c;位置参数必须在关键字参数之前。 >>> "{0}love{1}.{2}".format ("I","happy","xxx") Iloveh…

spring学习笔记p20-p27

IOC操作Bean管理&#xff08;基于注解方式&#xff09; 1.什么是注解 &#xff08;1&#xff09;注解是代码特殊标记&#xff0c;格式&#xff1a;注解名称&#xff08;属性名称属性值&#xff0c;属性名称属性值…&#xff09; &#xff08;2&#xff09;使用注解&#xff0…

关于机器人机械臂参数辨识

前几天在逛github发现一个dynamic identification的仓库&#xff0c;代码非常全。同时也看了对应的文章&#xff0c;虽然参数辨识不是文章最终目的&#xff0c;但是仍能感受到作者在参数辨识领域的了解程度和功底。这篇博客主要记录一下这几天学习该仓库的一些心得吧&#xff0…

代码随想录第52天

1.最长递增子序列 接下来&#xff0c;我们依然用动规五部曲来详细分析一波&#xff1a; dp[i]的定义 本题中&#xff0c;正确定义dp数组的含义十分重要。 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 为什么一定表示 “以nums[i]结尾的最长递增子序” &…

mybatisplus数据权限插件学习初探 动态表名更换插件

文章目录 学习链接 mybatisplus数据权限插件学习初探前言案例建表用户表订单表 环境准备UserUserMapperUserMapper.xmlOrdersOrdersMapperOrdersMapper.xml 配置UserTypeEnumUserContextHolderCustomizeDataPermissionHandlerMybatisPlusConfig 测试测试类bossdeptManagerclerk…

UBANTU 切换显卡配置, 在THINKPAD先00-i7+集成显卡笔记本和HP-W3680+1060显卡台式机

在一个256G的SSD安装了UBUNTU 16.04&#xff0c; 需要安装在两台主机中切换使用。 碰到适应显卡的问题&#xff1a; 分别如下设置&#xff0c; 作为切换&#xff1a; setting -> Software&Updates -> Aditional Drivers 进入后对应选择即可&#xff08;因为我已经…

Intervals POJ - 3680

传送门 给定数轴上n个带权区间$[l_i,r_i]$,权值为$w_i$ 选出一些区间使权值和最大&#xff0c;且每个点被覆盖次数不超过k次。 离散拆点&#xff0c;最大费用可行流&#xff08;跑到费用为负为止&#xff09; 第一部分点按下标串起来&#xff0c;相邻两个点之间连容量为k&#…

BZOJ3680 吊打GTY

Link Description gty又虐了一场比赛&#xff0c;被虐的蒟蒻们决定吊打gty。gty见大势不好机智的分出了n个分身&#xff0c;但还是被人多势众的蒟蒻抓住了。蒟蒻们将 n个gty吊在n根绳子上&#xff0c;每根绳子穿过天台的一个洞。这n根绳子有一个公共的绳结x。吊好gty后蒟蒻们…

bzoj 3680 吊打xxx

Description gty又虐了一场比赛&#xff0c;被虐的蒟蒻们决定吊打gty。gty见大势不好机智的分出了n个分身&#xff0c;但还是被人多势众的蒟蒻抓住了。蒟蒻们将n个gty吊在n根绳子上&#xff0c;每根绳子穿过天台的一个洞。这n根绳子有一个公共的绳结x。吊好gty后蒟蒻们发现由于…

POJ 3680_Intervals

题意&#xff1a; 给定区间和该区间对应的权值&#xff0c;挑选一些区间&#xff0c;求使得每个数都不被K个区间覆盖的最大权值和。 分析&#xff1a; 如果K1&#xff0c;即为区间图的最大权独立集问题。可以对区间所有端点排序后利用动态规划的方法&#xff0c;设dp[i]为只考虑…
最新文章