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; /* 返回实际写的字节数 */
}