对于网络读写操作,经常会因为信号中断而异常返回,这时候系统的read和write函数明显捉急了。
下面先讲解一下封装异常处理的read函数,write函数类似。
先看my_read函数的执行流程:
下面直接上代码,注释里面说得很清楚,这里就不啰嗦了
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#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函数执行流程类似,要想画图自己画一个吧,我就只上代码了。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24/*封装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;//返回实际写的字节数 }
最后
以上就是还单身魔镜最近收集整理的关于封装异常处理的read和write函数的全部内容,更多相关封装异常处理内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复