/*
* 题目:
* 请编写一个程序,设置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程序练习十三(信号阻塞,捕获)的更多相关文章

  1. linux系统编程之信号(五):信号集操作函数,信号阻塞与未决

    一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...

  2. Linux 信号详解五(信号阻塞,信号未决)

    信号在内核中的表示 执行信号的处理动作成为信号递达(Delivery),信号从产生到递达之间的状态称为信号未决(Pending).进程可以选择阻塞(Block)某个信号. 被阻塞的信号产生时将保持在未 ...

  3. linux信号--阻塞与未决

    执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending). 进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未决状态,直到进程解 ...

  4. linux备忘录-程序管理与SELinux

    知识点 程序与程序(Process and Program) 通过执行一条指令或程序,则可以触发一个事件,并获得一个PID.当我们需要启动一个程序时,我们是启动一个二进制文件(binary file) ...

  5. 《嵌入式linux应用程序开发标准教程》笔记——6.文件IO编程

    前段时间看APUE,确实比较详细,不过过于详细了,当成工具书倒是比较合适,还是读一读这种培训机构的书籍,进度会比较快,遇到问题时再回去翻翻APUE,这样的效率可能更高一些. <嵌入式linux应 ...

  6. Linux系统编程——进程间通信:信号中断处理

    什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFb ...

  7. linux应用程序开发-文件编程-系统调用方式

    在看韦东山视频linux驱动方面有一些吃力,究其原因,虽然接触过linux应用程序编程,但是没有深入去理解,相关函数用法不清楚,正好看到国嵌视频对这一方面讲的比较透彻, 所以把学习过程记录下来,也作为 ...

  8. 配置开发支持高并发TCP连接的Linux应用程序全攻略

    http://blog.chinaunix.net/uid-20733992-id-3447120.html http://blog.chinaunix.net/space.php?uid=16480 ...

  9. Linux C 程序 进程控制(17)

    进程控制 1.进程概述现代操作系统的特点在于程序的并行执行.Linux是一个多用户多任务的操作系统.ps .pstree 查看进程进程除了进程id外还有一些其他标识信息,可以通过相应的函数获得.// ...

  10. Linux 高性能服务器编程——Linux服务器程序规范

    问题聚焦:     除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范.     工欲善其事,必先利其器,这篇主要来探 ...

随机推荐

  1. redis配置文件参数说明及命令操作

    redis下载地址:https://github.com/MSOpenTech/redis/releases. Redis 的配置文件位于 Redis 安装目录下,文件名为redis.windows. ...

  2. 快速提升word文档编写质量

    1.调整样式顺序

  3. My97DatePicker时间控件使用

    刚刚工作中遇到一个修改时间空间的bug,顺带学习了My97DatePicker时间空间 网上查到的资料已经很详细: http://www.360doc.com/content/14/0606/11/1 ...

  4. ios app响应background,foreground 事件实现

    1 通过AppDelegate 实现 App进入后台事件方法 - (void)applicationDidEnterBackground:(UIApplication *)application AP ...

  5. 开启Tomcat 源码调试

    开启Tomcat 源码调试 因为工作的原因,需要了解Tomcat整个架构是如何设计的,正如要使用Spring MVC进行Web开发,需要了解Spring是如何设计的一样,有哪些主要的类,分别是用于干什 ...

  6. PHP 取前一天或后一天、一个月时间

    //获得当前时间     //date()格式化时间返回String类型.     date("Y-m-d H:i:s") $current_date = date(’Y-m-d’ ...

  7. Angularjs之如何在跨域请求中传输Cookie

    一般情况我们在使用WebApi之类的技术时,都会遇到跨域的问题,这个只需要在服务端做一下处理即可. 如果这些GET或POST请求不需要传递Cookie数据的话,就没什么问题了,但如果需要,那么会发现 ...

  8. 深入理解Nginx之调试优化技巧

    在开发过程中,我们经常会碰到段错误等异常,这时我们需要有相应的机制来进行调试,特别是服务提供在线上时,面对大量的日志信息,合理的调试处理机制对于开发来说是一件非常重要的事情,幸好Nginx本身提供了很 ...

  9. iOS 判断内容是否是中文,两种实现

    用category实现 新建类别文件,代码 .h文件 #import <Foundation/Foundation.h> @interface NSString (Valid) - (BO ...

  10. linux下motion摄像头监控编译与配置

    利用linxu下的开源的motion搭建嵌入式视频动态监控系统 所谓移动图像监测,简单来说就是利用摄像头定点监测某个区域,当有移动物体经过时,摄像头便自动抓拍(要监测多大物体.按拍照速率都是可调的), ...