UNIX环境高级编程学习之第十章信号-用信号和非局部转移函数写非阻塞的IO函数
[code lang=”cpp”]/*
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;
}

[/code]

发表评论