zoukankan      html  css  js  c++  java
  • 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!
    ");
            return -1;
        }
        FILE *pfr = NULL;
        pfr = fopen(path, "r");
        if (pfr == NULL)
        {
            printf("fopen() failed ! file path:%s;error message:%s
    ", 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 !
    ");
        } else if (sign == SIGQUIT)
        {
            printf("accept SIGQUIT !
    ");
        } else
        {
            printf("accept other sign !
    ");
        }
    }
    
    
    int main(int arg, char *args[])
    {
        if (arg < 2)
        {
            printf("print file name!
    ");
            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 !
    ");
            return -1;
        }
        if (sigaction(SIGQUIT, &act, NULL) != 0)
        {
            printf("sigaction() failed !
    ");
            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 !
    ");
            return -1;
        }
        read_file(args[1]);
        //解除阻塞
        if (sigprocmask(SIG_UNBLOCK, &bset, NULL) != 0)
        {
            printf("sigprocmask() failed !
    ");
            return -1;
        }
        while(1)
        {
            pause();
        }
        return 0;
    }
  • 相关阅读:
    关于添加“服务引用”和“添加引用”的一点总结
    nodejs+express工程 在npm install之后或使用npm install bootstrap命令安装bootstrap之后
    Mongo基础使用,以及在Express项目中使用Mongoose
    Express URL跳转(重定向)的实现
    node 开发web 登陆功能
    node js实战:带数据库,加密的注册登录表单
    nodejs 进阶:封装所有对数据库的常用操作
    nodejs进阶:密码加盐:随机盐值
    Nodejs进阶:密码加盐
    express 路由能力
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/6119995.html
Copyright © 2011-2022 走看看