Linux Linux程序练习十三(信号阻塞,捕获)
/*
* 题目:
* 请编写一个程序,设置SIGINT和SIGQUIT信号,
* 并在该程序中实现从文件中读取信息的操作,
* 并保证在读取文件且只有在读取文件的过程中不会被发送的SIGINT和SIGQUIT信号所打断。
* 提示:在文件读取前阻塞信号,在文件读取后解除阻塞。
* */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h> #include <signal.h> int read_file(const char *path)
{
if (path == NULL)
{
printf("param not allow NULL!\n");
return -;
}
FILE *pfr = NULL;
pfr = fopen(path, "r");
if (pfr == NULL)
{
printf("fopen() failed ! file path:%s;error message:%s\n", path,
strerror(errno));
return -;
}
char buf[] = { };
while (fgets(buf, sizeof(buf), pfr) != NULL)
{
printf("%s", buf);
sleep();
memset(buf, , sizeof(buf));
}
fclose(pfr);
return ;
} void handler(int sign)
{
if (sign == SIGINT)
{
printf("accept SIGINT !\n");
} else if (sign == SIGQUIT)
{
printf("accept SIGQUIT !\n");
} else
{
printf("accept other sign !\n");
}
} int main(int arg, char *args[])
{
if (arg < )
{
printf("print file name!\n");
return -;
}
struct sigaction act;
act.sa_handler = handler;
//初始化信号集
sigemptyset(&act.sa_mask);
act.sa_flags = ;
//安装(注册)SIGINT和SIGQUIT信号
if (sigaction(SIGINT, &act, NULL) != )
{
printf("sigaction() failed !\n");
return -;
}
if (sigaction(SIGQUIT, &act, NULL) != )
{
printf("sigaction() failed !\n");
return -;
}
//阻塞信号
sigset_t bset;
//清空信号集
sigemptyset(&bset);
//将信号SIGINT和SIGQUIT添加到信号集中
sigaddset(&bset, SIGINT);
sigaddset(&bset, SIGQUIT);
//更改进程信号屏蔽状态字
if (sigprocmask(SIG_BLOCK, &bset, NULL) != )
{
printf("sigprocmask() failed !\n");
return -;
}
read_file(args[]);
//解除阻塞
if (sigprocmask(SIG_UNBLOCK, &bset, NULL) != )
{
printf("sigprocmask() failed !\n");
return -;
}
while()
{
pause();
}
return ;
}
Linux Linux程序练习十三(信号阻塞,捕获)的更多相关文章
- linux系统编程之信号(五):信号集操作函数,信号阻塞与未决
一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...
- Linux 信号详解五(信号阻塞,信号未决)
信号在内核中的表示 执行信号的处理动作成为信号递达(Delivery),信号从产生到递达之间的状态称为信号未决(Pending).进程可以选择阻塞(Block)某个信号. 被阻塞的信号产生时将保持在未 ...
- linux信号--阻塞与未决
执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending). 进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未决状态,直到进程解 ...
- linux备忘录-程序管理与SELinux
知识点 程序与程序(Process and Program) 通过执行一条指令或程序,则可以触发一个事件,并获得一个PID.当我们需要启动一个程序时,我们是启动一个二进制文件(binary file) ...
- 《嵌入式linux应用程序开发标准教程》笔记——6.文件IO编程
前段时间看APUE,确实比较详细,不过过于详细了,当成工具书倒是比较合适,还是读一读这种培训机构的书籍,进度会比较快,遇到问题时再回去翻翻APUE,这样的效率可能更高一些. <嵌入式linux应 ...
- Linux系统编程——进程间通信:信号中断处理
什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFb ...
- linux应用程序开发-文件编程-系统调用方式
在看韦东山视频linux驱动方面有一些吃力,究其原因,虽然接触过linux应用程序编程,但是没有深入去理解,相关函数用法不清楚,正好看到国嵌视频对这一方面讲的比较透彻, 所以把学习过程记录下来,也作为 ...
- 配置开发支持高并发TCP连接的Linux应用程序全攻略
http://blog.chinaunix.net/uid-20733992-id-3447120.html http://blog.chinaunix.net/space.php?uid=16480 ...
- Linux C 程序 进程控制(17)
进程控制 1.进程概述现代操作系统的特点在于程序的并行执行.Linux是一个多用户多任务的操作系统.ps .pstree 查看进程进程除了进程id外还有一些其他标识信息,可以通过相应的函数获得.// ...
- Linux 高性能服务器编程——Linux服务器程序规范
问题聚焦: 除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范. 工欲善其事,必先利其器,这篇主要来探 ...
随机推荐
- Hibernate连接mysql数据库并自动创建表
天才第一步,雀氏纸尿裤,Hibernate第一步,连接数据库. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个 ...
- 用户故事地图(User Story Mapping)之初体验
北京这几日的天儿真是好的出奇,白天风和日丽,晚上繁星漫天:在这样一个周六的下午,小编参加了一次北京敏捷社区(微信号:Agile1001)组织的活动:<用户故事地图User Story Mappi ...
- yii2 输出xml格式数据
作者:白狼 出处:http://www.manks.top/yii2_xml_response.html.html本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文 ...
- yii2整合百度编辑器umeditor
作者:白狼 出处:www.manks.top/article/yii2_umeditor 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责 ...
- 持续集成(CI)初探
前不久接触了持续集成(Continuous Integration,CI). 一.持续集成是什么 首先说说“集成”的概念.在实际的软件开发中,常常会发生两种情境: 1.几个项目组对同一个系统的不同功能 ...
- 【转】虚拟机VMware3种网络模式(桥接、nat、Host-only)的工作原理
VMware网络配置详解一:三种网络模式简介 安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其 中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口, ...
- 未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项 解决方法
在webconfig中加入这段话就可以了 <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:as ...
- cocos2d-x之 利用富文本控件解析xhml标签(文字标签,图片标签,换行标签,标签属性)
执行后效果: 前端使用: 后台SuperRichText解析code void SuperRichText::renderNode(tinyxml2::XMLNode *node){ while (n ...
- YUV420查表法高效、无失真的转换为RGB32格式
YUV格式有两大类:planar和packed.planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V,这里所讲述的就是这中存储格式的:packed的YUV ...
- 烂泥:更换ESXI5.0管理网卡及管理IP地址
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 公司的服务器基本上都是在IDC机房里面的,为了更有效的利用服务器性能.所以有几台服务器,安装的是ESXI5.0做成虚拟化. 注意目前这些服务器都是双网卡 ...