文件读写函数因为信号中断异常返回处理
2015-10-27 09:39
441 查看
extern ssize_t my_read(int fd,void *buffer, size_t length); extern ssize_t my_write(int fd,void *buffer, size_t length);
/* iolib.c 自己的文件I/O函数库 */ #include <errno.h> #include <fcntl.h> #include <unistd.h> /* 封装read函数,增加可出错处理,参数和返回值和read函数相同 */ ssize_t my_read(int fd, void *buffer, size_t length) { ssize_t done = length; /* 读入的字节数 */ while(done > 0) { /* 如果因为信号中断而导致异常,则多次读取 */ done = read(fd, buffer, length); /* 调用read函数 */ if(done == -1) /* 异常出错 */ if(errno == EINTR) /* 如果是信号中断导致的错误,则舍弃已读入的内容,重新读取 */ done = length; else{ perror("fail to read"); /* 其他错误则输出错误原因,并且返回 */ return -1; } else break; } return done; /* 返回实际读入的字节数 */ } /* 封装write函数,增加可出错处理,参数和返回值和write函数相同 */ ssize_t my_write(int fd, void *buffer, size_t length) { ssize_t done = length; /* 实际写的字节数 */ while(done > 0) { /* 如果因为信号中断而导致异常,则多次写缓冲区 */ done = write(fd, buffer, length); /* 调用write函数 */ if(done != length) /* 异常出错 */ if(errno == EINTR) /* 如果是信号中断导致的错误,则舍弃已写的内容,重新写缓冲区 */ done = length; else{ perror("fail to write"); /* 其他错误则输出错误原因,并且返回 */ return -1; } else break; } return done; /* 返回实际写的字节数 */ }
相关文章推荐
- Sql server 的表值函数是返回一个Table类型,table类型相当与一张存储在内存中的一张虚拟表。
- Android4.2.2由于越来越多的物理按键(frameworks)
- The CHECK_POLICY and CHECK_EXPIRATION options cannot be turned OFF when MUST_CHANGE is ON. (Microsoft SQL Server,错误: 15128)
- 输入格式--InputFormat和InputSplit
- 堆排序算法
- 堆排序算法
- 堆排序算法
- Leetcode Find Minimum in Rotated Sorted Array II
- jQuery无刷新分页完整实例代码
- hibernate单向关联与双向关联
- OC学习_第二天 实例变量可⻅度、⽅法
- poj3169(差分约束)
- 卷纸快速抽调纸筒
- 如何在Eclipse中开发并调试自己的插件(或者说如何将自己的代码插件化)
- 快速排序算法
- 快速排序算法
- 快速排序算法
- Linux下10个ps命令的基本例子
- 图书管理系统c++
- 归并排序算法