UNIX环境高级编程学习之第十章信号-用信号和非局部转移函数写非阻塞的IO函数

Linux/Unix C/C++ xiujie 122℃ 0评论 已收录

UNIX环境高级编程学习之第十章信号-用信号和非局部转移函数写非阻塞的IO函数

/*
File: NonblockingIO.c
Desc: 用信号和非局部转移函数写非阻塞的IO函数
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <setjmp.h>
#define MAXBUFSIZE     1024
#define READ_ERROR     -1
#define READ_TIMEOUT   -2
static sigjmp_buf jmpbuf;
/* 处理计时器超时信号 */
static void sig_alrm(int signo) 
{
        siglongjmp(jmpbuf, 1); // 信号处理中专用的非局部转移函数, 功能: 转移到sigsetjmp()位置
}

int my_read(char* buf, const int len, const int time)
{
		signal(SIGALRM, sig_alrm);
        int ret, readLen;
        ret = sigsetjmp(jmpbuf, 1); // 信号处理中专用的非局部转移函数, 功能: 设置转换点
        if (ret == 0)
        {
                alarm(time);       // 设置计时器
                if (( readLen = read(STDIN_FILENO, buf, len)) < 0)  // 阻塞的IO
                {
                        alarm(0);  // 清楚计时器
                        return READ_ERROR;
                }
                alarm(0);
                return readLen;
        }
        return READ_TIMEOUT;
}
int main(int argc, char* argv[])
{
        char buf[MAXBUFSIZE];
        int ret;
        while (1)
        {
                memset(buf, 0x00, sizeof(buf));
                ret = my_read(buf, sizeof(buf), 5);
                if (ret == READ_ERROR)
                {
                        printf("my_read Error ! /n");
                        exit(-1);
                }else if (ret == READ_TIMEOUT)
                {
                        printf("my_read Timeout!/n");
                }else{
                        printf("my_read data:%s", buf);
                }
        }
        return 0;
}


喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址