《Linux C编程实战》笔记:信号应用于事件通知

实际应用中,进程可能需要等待某一事件的发生,一般可以通过检测某一全局变量来判断事件是否发生。有三种方法可以实现这一要求。

第一种:程序不停循环检测全局变量,这样可以满足要求,但是非常占用cpu资源

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
#define UNHAPPEN 0
#define HAPPENED 1
int flag_happen;
void handler_sigint(int signo){flag_happen=HAPPENED;
}
int main(int argc,char **argv){if(signal(SIGINT,handler_sigint)==SIG_ERR){perror("signal");exit(1);}while (1){if(flag_happen==HAPPENED){printf("event happened\n");break;}}}

第二种:用pause挂起,等待信号的触发,事件发生时向进程发送信号,对应的信号处理函数改变全局变量的值,信号处理函数返回后进程检测该全局变量,满足要求即可直到事件已发生

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
#define UNHAPPEN 0
#define HAPPENED 1
int flag_happen;
void handler_sigint(int signo){flag_happen=HAPPENED;
}
int main(int argc,char **argv){if(signal(SIGINT,handler_sigint)==SIG_ERR){perror("signal");exit(1);}while (flag_happen==UNHAPPEN){pause();}printf("after event happened\n");}

第三种:原理和第二种一致,不过使用的函数是sigsuspend

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
#define UNHAPPEN 0
#define HAPPENED 1
int flag_happen;
void my_err(const char *err_string,int line){fprintf(stderr,"line:%d ",line);perror(err_string);exit(1);
}
void handler_sigint(int signo){flag_happen=HAPPENED;
}
int main(int argc,char **argv){sigset_t newmask,oldmask,zeromask;if(signal(SIGINT,handler_sigint)==SIG_ERR){my_err("signal",__LINE__);}sigemptyset(&newmask);sigemptyset(&zeromask);sigaddset(&newmask,SIGINT);//屏蔽信号SIGINTif(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)my_err("sigprocmask",__LINE__);else printf("SIGINT blocked\n");while (flag_happen==UNHAPPEN){sigsuspend(&zeromask);}printf("after event happened\n");//将信号屏蔽字恢复if(sigprocmask(SIG_SETMASK,&oldmask,nullptr)<0)my_err("sigprocmask",__LINE__);return 0;}

上述每个函数的用法在前面文章都讲过,不懂的往前看谢谢喵

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

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

相关文章

5-1 A. DS串应用--KMP算法

题目描述 学习KMP算法&#xff0c;给出主串和模式串&#xff0c;求模式串在主串的位置 算法框架如下&#xff0c;仅供参考 输入 第一个输入t&#xff0c;表示有t个实例 第二行输入第1个实例的主串&#xff0c;第三行输入第1个实例的模式串 以此类推 输入样例&#xff1a; 3 qwe…

dfs专题 P1706 全排列问题——洛谷(题解)

题目描述 按照字典序输出自然数 11 到 &#xfffd;n 所有不重复的排列&#xff0c;即 &#xfffd;n 的全排列&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 &#xfffd;n。 输出格式 由 1∼&#xfffd;1∼n 组成的所有不重复的数字…

Mac下手动源码编译安装Swig

使用Homebrew安装 这个方式最简单&#xff0c;但是一般都是安装的最新版&#xff1a; brew install swig如果按照特定版本&#xff0c;需要看一个当前支持的列表&#xff1a; brew search swig brew install swig3源码编译安装 swig依赖pcre库&#xff0c;需要先安装pcre …

浅谈一下软件 QA 方法论 和 工具

浅谈一下软件 QA 方法论 和 工具 目录概述需求&#xff1a; 设计思路实现思路分析1.QA方法论2.Java QA工具 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result…

Oracle Extractor 软件下载

oracle Extractor 研发背景 在企业日益增长的 IT 系统中&#xff0c;数据容量正以几何级数扩展。 oracle DBA 在保证数据完整 性的课题上正面临着现有磁盘存储系统容量不足以存放全量备份&#xff0c;基于磁带的数据备份在恢 复数据时往往要求远远超过预期的平均修复时间等实际…

Linux系统——文本三剑客

目录 一、grep 1.格式 2.选项 2.1 grep重定向 2.2grep -m 匹配到几次停止 2.3grep -i 忽略大小写 2.4grep -n 显示行号 2.5grep -c 统计匹配行数 2.6grep -A 后几行 2.7grep -C 前后三行 2.8grep -B 前三行 2.9grep -e 或 2.10grep -w 匹配整个单词 2.11grep -r…

窥探向量乘矩阵的存内计算原理—基于向量乘矩阵的存内计算

在当今计算领域中&#xff0c;存内计算技术凭借其出色的向量乘矩阵操作效能引起了广泛关注。本文将深入研究基于向量乘矩阵的存内计算原理&#xff0c;并探讨几个引人注目的代表性工作&#xff0c;如DPE、ISAAC、PRIME等&#xff0c;它们在神经网络和图计算应用中表现出色&…

现代C++之万能引用、完美转发、引用折叠FrancisFrancis

转载&#xff1a;现代C之万能引用、完美转发、引用折叠 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/99524127 后期参考(还未整合)&#xff1a;C 完美转发深度解析:从入门到精通_c完美转发-CSDN博客https://blog.csdn.net/qq_21438461/article/details/129938466 0.导语 …

Dragons

题目链接&#xff1a; Problem - 230A - Codeforces 解题思路&#xff1a; 用结构体排序就好&#xff0c;从最小的开始比较&#xff0c;大于就加上奖励&#xff0c;小于输出NO 下面是c代码&#xff1a; #include<iostream> #include<algorithm> using namespac…

Java发送post请求

Java发送post请求 1.省份字典2.姓氏字典3.结婚时祝愿字典4.发送Post请求5.整合一起 1.省份字典 List<String> provinces new ArrayList<>();provinces.add("北京");provinces.add("天津");provinces.add("河北");provinces.add(&qu…

Python程序设计 流程控制

1. if判断语句 if 语句是最简单的选择结构。如果满足条件就执行设定好的操作&#xff0c;不满足条件就执行其他其他操作。 1.1 判断的定义 如果 条件满足&#xff0c;才能做某件事情&#xff0c; 如果 条件不满足&#xff0c;就做另外一件事情&#xff0c;或者什么也不做 …

java框架面试篇

Spring框架 spring Bean线程安全问题 Scope注解 我们可以在bean的类上加Scope注解来声明这个Bean是单个实例还是多个实例。在默认情况下Bean是单个实例的&#xff0c;此时的注解中的属性默认为Scope("singleton")&#xff0c;Scope("prototype")则是一…

dfs专题(记忆化搜索)P1141 01迷宫——洛谷(题解)

题目描述 有一个仅由数字 00 与 11 组成的 &#xfffd;&#xfffd;nn 格迷宫。若你位于一格 00 上&#xff0c;那么你可以移动到相邻 44 格中的某一格 11 上&#xff0c;同样若你位于一格 11 上&#xff0c;那么你可以移动到相邻 44 格中的某一格 00 上。 你的任务是&#…

一、图像读取显示

读取和显示函数主要为&#xff1a;imread()和imshow()函数 imread函数&#xff0c;im是image的缩写&#xff0c;read就是读入一张图片 同理&#xff0c;imshow也是一样的 C中读入的图片是按照矩阵&#xff08;Matrix&#xff09;进行存储的&#xff0c;故定义变量src的数据类型…

【pytorch】nn.linear 中为什么是y=xA^T+b

我记得读教材的时候是yWxb, 左乘矩阵W&#xff0c;这样才能表示线性变化。 但是pytorch中的nn.linear中&#xff0c;计算方式是yxA^Tb&#xff0c;其中A是权重矩阵。 为什么右乘也能表示线性变化操作呢&#xff1f;因为pytorch中&#xff0c;照顾到输入是多个样本一起算的&…

python魔法函数

1、init 用于初始化对象的属性和状态 当创建一个对象时&#xff0c;Python会自动调用该对象的__init__方法。 这个方法用于初始化对象的属性和状态&#xff0c;是对象创建过程中的一个重要环节 2、new # 通常我们不需要重写__new__方法&#xff0c;除非我们正在进行一些非常…

kerberos+kafka(2.13)认证(单节点ubuntu)

一&#xff1a;搭建kerberos。 1. 运行安装命令 apt-get install krb5-admin-server krb5-kdc krb5-user krb5-config2. 检查服务是否启动。 systemctl status krb5-admin-server systemctl status krb5-kdcsystemctl start krb5-admin-server systemctl startkrb5-kdc3. 修…

yum安装报错“Curl error (37): Could‘t read a file...”

使用yum命令安装软件包“libmcrypt-devel” 运行yum命令如下&#xff1a; yum install libmcrypt-devel 提示有这个软件以及软件版本信息&#xff0c;输入y后下载软件包。 稍后提示错误如下&#xff1a; 错误提示截图中&#xff0c;警告软件包libmcrypt-devel-2.5.8-26.el8…

Blender Object 的 name 字段不是 string

之前在获取 object 的 name 之后直接当作 string&#xff0c;对他调用 string 的函数&#xff0c;结果导致了 blender 崩溃&#xff0c;完全不知道哪错了 后面发现 object 的 name 字段似乎不是 string&#xff0c;需要先转到 string 感觉 blender 这点不好&#xff0c;调用了…

DC-磁盘配额(23国赛真题)

2023全国职业院校技能大赛网络系统管理赛项–模块B&#xff1a;服务部署&#xff08;WindowServer2022&#xff09; 文章目录 DC-磁盘配额题目配置步骤验证查看DC2驱动器C:\的磁盘配额&#xff0c;限制磁盘空间&#xff0c;警告等级等配置 DC-磁盘配额 题目 在DC2驱动器C:\上…