我是靠谱客的博主 还单身魔镜,这篇文章主要介绍封装异常处理的read和write函数,现在分享给大家,希望可以做个参考。

对于网络读写操作,经常会因为信号中断而异常返回,这时候系统的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函数的全部内容,更多相关封装异常处理内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部