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; }
相关文章推荐
- UNIX环境高级编程学习之第十章信号-信号集的操作,让进程阻塞SIGQUIT信号
- UNIX环境高级编程学习之第十章信号-信号的基本操作(绑定/忽略/默认/发送)
- UNIX环境高级编程学习之第十章信号-用信号实现父子进程同步
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 非阻塞的Socket通信Select模型(多路复用), 实用Socket通信模板。
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 非阻塞的Socket通信EPoll模型(多路复用), 实用Socket通信模板
- UNIX环境高级编程 第十章:信号
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 非阻塞的Socket通信Poll模型(多路复用), 实用Socket通信模板
- UNIX环境高级编程第十章信号 读后笔记
- UNIX环境高级编程--第十章信号总结
- unix环境高级编程 学习笔记4
- UNIX环境编程学习笔记(23)——信号处理初步学习
- UNIX环境高级编程学习之第九章进程关系-创建孤儿进程
- Unix环境高级编程学习笔记1—a.out的实现
- <<UNIX环境高级编程>>之第十章理解
- UNIX环境高级编程学习之第十五章进程间通信 - 通过匿名管道实现父子进程同步
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 套接字选项的使用 (心跳检测、绑定地址复用)
- UNIX环境高级编程之-----信号signal
- UNIX环境高级编程学习之第六章系统数据文件和信息-GID To GroupName
- UNIX环境高级编程学习之第十三章守护进程 - 单实例的守护进程
- UNIX环境高级编程学习环境搭建---apue.h