函数signal、sigaction

二、函数sigaction

修改信号处理动作(通常在Linux用来注册一个信号的捕捉函数)

#inlcude<signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);                                                  

参数:

  • act:传入参数,新的处理方式
  • oldact:传出参数,旧的处理方式
struct sigaction
{void       (*sa_handler)(int);void       (*sa_sigaction)(int, siginfo_t*, void*);sigset_t   sa_mask;int        sa_flags;void       (*sa_restorer)(void);
};

分析:

  •  sa_restorer:该元素是过时的,不应该使用, POSIX.1标准将不指定该元素。(弃用)
  • sa_sigaction:当sa_flags被指定为SA_SIGINFO标志时,使用该信号处理程序(很少使用)
  • sa_handler:指定信号捕捉后的处理函数名(即注册函数)。可赋值为SIG_IGN表忽略或SIG_DFL表执行默认动作
  • sa_mask:调用信号处理函数时,所要屏蔽的信号集合(信号屏蔽字)。注意仅在处理函数调用期间屏蔽。(默认属性:信号捕捉函数执行期间,自动屏蔽本信号)
  • sa_flag:通常设置为0,表默认属性

 

1. 测试代码:

#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<unistd.h>void docatch(int signo)
{printf("%d signal is catch\n", signo);
}int main()
{int ret;struct sigaction act;act.sa_handler = docatch;sigemptyset(&act.sa_mask);sigaddset(&act.sa_mask, SIGQUIT);act.sa_flags = 0;  //默认属性:信号捕捉函数执行期间,自动屏蔽本信号ret = sigaction(SIGINT, &act, NULL);if(ret < 0) {perror("sigaction error");exit(1);}while(1)sleep(1);return 0;
}

输出结果:

 

信号捕捉特性:

  • 进程正常运行时,默认PCB有一个信号屏蔽字,假定为☆,它决定了进程自动屏蔽哪些信号,当注册了某个信号步捕捉函数,捕捉到该信号以后,要调用该函数,而该函数有可能执行很长时间,在这期间所屏蔽的信号不由☆指定,而由sa_mask来指定,调用完信号处理函数,再恢复为☆。
  • xxx信号捕捉函数执行期间,XXX信号自动屏蔽。
  • 阻塞的常规信号不支持排队,产生多次只记录一次(后32个实时信号支持排队)

 

 

2. 测试代码:

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>void docatch(int signo)
{printf("%d signal is catch\n", signo);sleep(10);printf("--------------finish\n");
}int main()
{int ret;struct sigaction act;act.sa_handler = docatch;sigemptyset(&act.sa_mask);sigaddset(&act.sa_mask, SIGQUIT);act.sa_flags = 0;ret = sigaction(SIGINT, &act, NULL);if (ret < 0) {perror("sigaction error");exit(1);}while (1) sleep(1);return 0;
}

输出结果:

 

#include <sys/wait.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>void sys_err(char *str)
{perror(str);exit(1);
}void do_sig_child(int signo)
{int status;pid_t pid;while ((pid = waitpid(0, &status, WNOHANG)) > 0) {if (WIFEXITED(status))printf("---------------------------child %d exit %d\n", pid, WEXITSTATUS(status));else if (WIFSIGNALED(status))printf("child %d cancel signal %d\n", pid, WTERMSIG(status));}
}int main()
{pid_t pid;int i;for (i = 0; i < 10; i++) {if ((pid = fork()) == 0)break;else if (pid < 0)sys_err("fork");}if (pid == 0) //子进程{int n = 1;while (n--) {printf("child ID %d\n", getpid());sleep(1);}return i + 1;}else if (pid > 0) //父进程{struct sigaction act;           //SIGCHLD阻塞act.sa_handler = do_sig_child;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGCHLD, &act, NULL);  //解除对SIGCHLD的阻塞    while (1) {printf("parent ID %d\n", getpid());sleep(1);}}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文了解OOM及解决方案,你还看不明白?

InnoDB总体结构 首先我们来看官网的一张图(图片来源于MySQL官网)&#xff1a; 从上图中可以看出其主要分为两部分结构&#xff0c;一部分为内存中的结构(上图左边)&#xff0c;一部分为磁盘中的结构(上图右边) 内存结构 InnoDB内存中的结构主要分为&#xff1a;Buffer Pool,…

信号 09 | 函数pause

函数pause 调用该函数可以造成进程主动挂起&#xff0c;等待信号唤醒&#xff0c;调用该系统调用的进程处于阻塞状态(主动放弃CPU)直到有信号递达将其唤醒。 将进程置为可中断睡眠状态。然后 它调用schedule()&#xff0c;使linux进程调度器找到另一个进程来运行。pause使调用…

一文搞懂JVM架构和运行时数据区,全网最新

1.Java基础面试知识点 Java中和equals和hashCode的区别int、char、long各占多少字节数int与integer的区别探探对Java多态的理解String、StringBuffer、StringBuilder区别什么是内部类&#xff1f;内部类的作用抽象类和接口区别抽象类的意义抽象类与接口的应用场景抽象类是否可…

一条正确的Java职业生涯规划,帮你突破瓶颈

面试题模块介绍&#xff1a; 一、Java 基础 JDK 和 JRE 有什么区别&#xff1f; 和 equals 的区别是什么&#xff1f;两个对象的 hashCode()相同&#xff0c;则 equals()也一定为 true&#xff0c;对吗&#xff1f;final 在 java 中有什么作用&#xff1f;java 中的 Math.roun…

【线程】线程基本函数

一、pthread_self函数 功能&#xff1a;获取线程ID。 pthread_t pthread_self(void); 线程ID&#xff1a;pthread_t类型&#xff0c;本质&#xff1a;在Linux为无符号整数(%lu)&#xff0c;其他系统可能是结构体实现线程ID是进程内部识别标志。&#xff08;两个进程间&#…

一条正确的Java职业生涯规划,顺利通过阿里Java岗面试

珍藏版&#xff08;1&#xff09;——Mybatis入门 1.什么是MyBatis 2.为什么我们要用Mybatis? 3.Mybatis快速入门 3.1 导入开发包 3.2准备测试工作 3.3 创建mybatis配置文件 3.4 编写工具类测试是否获取到连接 3.5 创建实体与映射关系文件 3.6 编写DAO 4.Mybatis工作…

一次违反常规的Java大厂面试经历,系列教学

第一部分 Java相关以及答案 答案 第二部分算法跟编程 第三部分html&JavaScript&ajax部分 答案 第四部分Javaweb部分 答案 第五部分数据库部分 答案 第六部分XML部分 答案 第七部分.流行的框架与新技术 答案 第八、九部分.软件工程与设计模式以及j2ee部分 最后 笔者…

一次违反常规的Java大厂面试经历,重难点整理

目录 Kafka的基本介绍Kafka的设计原理分析Kafka数据传输的事务特点Kafka消息存储格式副本&#xff08;replication&#xff09;策略Kafka消息分组&#xff0c;消息消费原理Kafak顺序写入与数据读取消费者&#xff08;读取数据&#xff09; Kafka的基本介绍 Kafka是最初由Lin…

一步搞定你疑惑的数据结构与算法系列,原理+实战讲解

蚂蚁金服一面&#xff1a; 下午杭州的电话&#xff0c;问有没有空&#xff0c;果断有空&#xff0c;虽然感觉略显紧张&#xff0c;有点懵逼。 面试的题目&#xff1a; HashMap和Hashtable的区别实现一个保证迭代顺序的HashMap说一说排序算法&#xff0c;稳定性&#xff0c;复…

互斥量(互斥锁)

一、互斥量mutex Linux提供一把互斥锁mutex(也称之为互斥量)每个线程在对资源操作前都尝试先加锁&#xff0c;成功加锁才能操作&#xff0c;操作结束后解锁。资源还是共享的&#xff0c;线程间也还是竞争的&#xff0c;但通过锁将资源的访问变为互斥操作&#xff0c;而后与时间…

一眼就能看懂的Java自学手册,终局之战

珍藏版&#xff08;1&#xff09;——Mybatis入门 1.什么是MyBatis 2.为什么我们要用Mybatis? 3.Mybatis快速入门 3.1 导入开发包 3.2准备测试工作 3.3 创建mybatis配置文件 3.4 编写工具类测试是否获取到连接 3.5 创建实体与映射关系文件 3.6 编写DAO 4.Mybatis工作…

Java虚拟机学习集锦是我攒来的,带你碾压面试官!

1. 一致性&#xff08;Consistency&#xff09; 一致性&#xff08;Consistency&#xff09;是指多副本&#xff08;Replications&#xff09;问题中的数据一致性。可以分为强一致性、顺序一致性与弱一致性。 1.1 强一致性&#xff08;Strict Consistency&#xff09; 也称为…

Java虚拟机学习集锦是我攒来的,看这篇文章准没错!

一面 介绍一下自己 问项目经历, 聊"数据同步" 接着聊上了 K8S 的项目 有没有什么钻研得比较深得技术&#xff1f;&#xff08;大佬&#xff1a;kubernetes, golang, prometheus, java&#xff09; kubernetes 的架构是怎么样的? 这个问题很大&#xff0c;拆成 …

文件描述符、函数open和openat

文件描述符 pcb&#xff1a;结构体一个进程有一个文件描述符&#xff1a;1024文件描述符&#xff1a;寻找磁盘文件函数open和openat 函数原型&#xff1a; include<sys/stst.h> #include<fcntl.h>int open(const char *pathname, int flags); int open(const ch…

Java这些高端技术只有你还不知道,移动架构师成长路线

并发编程共享模型篇 并发编程概览进程与线程Java线程共享模型之管程共享模型之内存共享模型之无锁共享模型之不可变共享模型之工具 共享模型之管程 原理之 Monitor(锁) 原理之伪共享 模式篇—正确姿势 同步模式之保护性智停同步模式之Blking同步模式之顺序控制异步模式之生产…

函数read、write、lseek

函数原型&#xff1a; #include<unistd.h> ssize_t read(int fd, void *buf, size_t count);返回值&#xff1a;读到的字节数&#xff0c;若已到文件尾&#xff0c;返回0&#xff1b;若出错&#xff0c;返回-1 参数&#xff1a; fd&#xff1a;函数open的返回值buf&a…

Java这些高端技术只有你还不知道,薪资翻倍

正文 我的第一份工作是在一家外企&#xff0c;当时抱着“逃离”上海的想法去了二线城市的分公司&#xff0c;但是管理文化氛围跟总部几乎都是一样的&#xff0c;这份工作经历对我后面的工作不论是做事风格、习惯上还是思考问题的方式方法上都有很大的影响。后面陆续进入国企&a…

函数dup和dup2

函数原型&#xff1a; #include<unistd.h> int dup(int oldfd);返回值&#xff1a;若成功&#xff0c;返回新的文件描述符&#xff1b;若出错&#xff0c;返回-1 参数&#xff1a; oldfd&#xff1a;要复制的文件描述符dup调用成功&#xff1a;有两个文件描述符指向同…

Java进阶面试资料无偿分享!真香系列

8-22 投递简历 8-24 一面&#xff08;大概1h50min&#xff09; 0、currenthashmap怎么扩容的&#xff1f;fwn为什么固定hash -1&#xff0c;这样设计有什么好处&#xff1f;帮助扩容是发生在什么阶段?读线程和写线程都会帮助扩容吗&#xff1f;扩容的时候任务具体怎么协调的&…

Java通用流行框架大全,绝对干货

Java如何入门&#xff1f; 1、建立好开发环境 首先建立好开发环境非常重要&#xff0c;工欲善其事&#xff0c;必先利其器。做任何开发&#xff0c;首先就是要把这个环境准备好&#xff0c;之后就可以去做各种尝试&#xff0c;尝试过程中就能逐渐建立信心。初学者往往在环境配…