您的位置:首页 > 其它

文件读写函数因为信号中断异常返回处理

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; /* 返回实际写的字节数 */
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: