您的位置:首页 > 编程语言

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

2010-02-25 15:18 706 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐