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 -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;
}
时间: 2024-10-25 21:25:12

Linux Linux程序练习十三(信号阻塞,捕获)的相关文章

Linux信号阻塞与未达

信号在内核中的表示 执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作. 注意,阻塞和忽略是不同,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作.信号在内核中的表示可以看作是这样的: @font-face { font-family: "Times New Roman"; }@font-fa

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

什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFbo0_5uH5OQFr_vaRJaZ-3lq_" style="color:rgb(202,0,0); text-decoration:none">软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式 . 信号能够导致一个正在执行的进程被还有一个正在执行的异

Linux GDB程序调试工具使用简介

GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓"寸有所长,尺有所短"就是这个道理. 一般来说,GDB主要帮忙你完成下面四个方面的功能: 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式) 当程序被停住时,

Linux服务器程序规范

除了网络通信外,服务器程序还必须考虑许多其他细节问题,零碎,但基本上时模板式的. ---引 Linux服务器程序一般以后台形式运行.后台程序又称守护进程.它没有控制终端,因而也不会意外接受用户输入.守护进程的父进程一般是init进程(pid=1). Linux服务器程序通常有一套日志系统,它至少能输出日志到文件,有的高级服务器可以输出日志到专门的UDP服务器.大部分后台进程都在/var/log下有自己的日志目录. Linux服务器程序一般以某个专门的非root身份运行.mysqld, httpd

嵌入式Linux裸机开发(十三)——I2C通信

嵌入式Linux裸机开发(十三)--I2C通信 一.IIC协议 1.IIC总线简介 I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.I2C总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL.在 I2C总线上传送的一个数据字节由八位组成.总线对每次传送的字节数没有限制,但每个字节后必须跟一位应答位. IIC总线是一种串行总线,用于连接微控制器及其外围设备,具有以下特点:

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

在看韦东山视频linux驱动方面有一些吃力,究其原因,虽然接触过linux应用程序编程,但是没有深入去理解,相关函数用法不清楚,正好看到国嵌视频对这一方面讲的比较透彻, 所以把学习过程记录下来,也作为linux应用程序开发的一个系列吧! 文件编程有两种方式,一是系统调用方式,二是库函数调用. 前者依赖特定的平台,后者不依赖平台. 系统调用:创建 int creat(const char *filename,mode_t mode); filename:要创建的文件名 mode:创建模式 S_IR

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

http://blog.chinaunix.net/uid-20733992-id-3447120.html http://blog.chinaunix.net/space.php?uid=16480950&do=blog&id=103598 原文见:http://www.cppblog.com/flashboy/articles/47012.html1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到

Linux GDB 程序调试工具使用详解

转自    http://www.codeceo.com/article/linux-gdb-tools.html 整理的挺全的 GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓“寸有所长,尺有所短”就是这个道理. 一般来说,GDB主要帮忙你完成下面四个方面的功能: 启动你的程序,可以按照你的自

Linux从程序到进程

Linux从程序到进程 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机如何执行进程呢?这是计算机运行的核心问题.即使已经编写好程序,但程序是死的.只有活的进程才能产出.我们已经从Linux进程基础中了解了进程.现在我们看一下从程序到进程的漫漫征程. 一段程序 下面是一个简单的C程序,假设该程序已经编译好,生成可执行文件vamei.exe. #include <stdio.h> int glob=0; /*global

linux应用程序中的延时和定时器

笔记: 在linux应用程序中延时有sleep().msleep()和usleep()函数之类的延时,也有如下形式的延时: struct timeval delay; delay.tv_sec = sleepSecond; delay.tv_usec = 0; select( 0, NULL, NULL, NULL, &delay ); 但是基本上都是基于进程休眠的,好像没有循环等待的延时,有待证实,目前没发现. 考虑到一个问题,如果定时发送信号,执行相应一个信号处理函数时,该函数还么有执行完成