对于网络读写操作,经常会因为信号中断而异常返回,这时候系统的read和write函数明显捉急了。
下面先讲解一下封装异常处理的read函数,write函数类似。
先看my_read函数的执行流程:
下面直接上代码,注释里面说得很清楚,这里就不啰嗦了
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
/*封装read函数,增加异常处理,参数和返回值跟read函数相同*/
ssize_t my_read(int fd, void *buffer, size_t length)
{
ssize_t len = length;//读入的字节数
while(len > 0)//如果因为信号中断而导致异常,则多次读取
{
len = read(fd, buffer, length);
if (len != length)//异常出错
{
if (errno == EINER)//如果是信号中断导致的错误,则舍弃已读入的内容,重新读取
{
len = length;
}
else//其他错误则输出错误原因,并且返回
{
perror("failed to read");
return -1;
}
}
else
break;
}
return len;//返回实际读入的字节数
}
my_write函数执行流程类似,要想画图自己画一个吧,我就只上代码了。
/*封装write函数,增加异常处理,参数和返回值跟write函数相同*/
ssize_t my_write(int fd, void *buffer, size_t length)
{
ssize_t len = length;//实际写的字节数
while(len > 0)//如果因为信号中断而导致异常,则多次写缓冲区
{
len = write(fd, buffer, length);
if (len != length)//异常出错
{
if (errno == EINER)//如果是信号中断导致的错误,则舍弃已写的内容,重新写缓冲区
{
len = length;
}
else//其他错误则输出错误原因,并且返回
{
perror("failed to write");
return -1;
}
}
else
break;
}
return len;//返回实际写的字节数
}