博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux Linux程序练习十三(信号阻塞,捕获)
阅读量:7229 次
发布时间:2019-06-29

本文共 1669 字,大约阅读时间需要 5 分钟。

/* * 题目: * 请编写一个程序,设置SIGINT和SIGQUIT信号, * 并在该程序中实现从文件中读取信息的操作, * 并保证在读取文件且只有在读取文件的过程中不会被发送的SIGINT和SIGQUIT信号所打断。 * 提示:在文件读取前阻塞信号,在文件读取后解除阻塞。 * */#include 
#include
#include
#include
#include
#include
int read_file(const char *path){ if (path == NULL) { printf("param not allow NULL!\n"); return -1; } FILE *pfr = NULL; pfr = fopen(path, "r"); if (pfr == NULL) { printf("fopen() failed ! file path:%s;error message:%s\n", path, strerror(errno)); return -1; } char buf[1024] = { 0 }; while (fgets(buf, sizeof(buf), pfr) != NULL) { printf("%s", buf); sleep(2); memset(buf, 0, sizeof(buf)); } fclose(pfr); return 0;}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 < 2) { printf("print file name!\n"); return -1; } struct sigaction act; act.sa_handler = handler; //初始化信号集 sigemptyset(&act.sa_mask); act.sa_flags = 0; //安装(注册)SIGINT和SIGQUIT信号 if (sigaction(SIGINT, &act, NULL) != 0) { printf("sigaction() failed !\n"); return -1; } if (sigaction(SIGQUIT, &act, NULL) != 0) { printf("sigaction() failed !\n"); return -1; } //阻塞信号 sigset_t bset; //清空信号集 sigemptyset(&bset); //将信号SIGINT和SIGQUIT添加到信号集中 sigaddset(&bset, SIGINT); sigaddset(&bset, SIGQUIT); //更改进程信号屏蔽状态字 if (sigprocmask(SIG_BLOCK, &bset, NULL) != 0) { printf("sigprocmask() failed !\n"); return -1; } read_file(args[1]); //解除阻塞 if (sigprocmask(SIG_UNBLOCK, &bset, NULL) != 0) { printf("sigprocmask() failed !\n"); return -1; } while(1) { pause(); } return 0;}

 

转载地址:http://uldfm.baihongyu.com/

你可能感兴趣的文章
Java设计模式学习 - 责任链模式
查看>>
JVM,DVM,ART
查看>>
webgl滤镜--会呼吸的痛
查看>>
用Go语言实现微信支付SDK
查看>>
oauth2在php实践
查看>>
LeetCode.914 卡牌分组
查看>>
填坑app:compileDebugJavaWithJavac
查看>>
Android 100+行实现本地跳一跳辅助(不需要连接电脑)
查看>>
位状态的使用
查看>>
面试技术题笔记
查看>>
Myth源码解析系列之一-项目简介
查看>>
JS易混淆的方法整理
查看>>
iOS下JS与OC互相调用(八)--Cordova详解+实战
查看>>
七牛实时音视频云视频连线demo(web部分)
查看>>
Netty源码分析(六):SelectedSelectionKeySetSelector
查看>>
forEach,for...of,map与asycn/await
查看>>
springboot 2 Hikari 多数据源配置问题(dataSourceClassName or jdbcUrl is required)
查看>>
Golang数据库编程之GORM模型定义与数据库迁移
查看>>
Oracle redo解析之-4、rowid的计算
查看>>
Easy Scheduler 1.0.3 发布,分布式工作流任务调度系统
查看>>