RIO包 健壮的I/O函数代码
下面是关于
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h> #define MAXLINE 1024 /*unbuffer input/output function*/ ssize_t rio_readn(int fd,void *usrbuf,size_t n)
{
size_t nleft = n;
ssize_t nread;
char *bufp = usrbuf; while(nleft > 0){
if((nread = read(fd,bufp,nleft)) < 0){
if(errno == EINTR){/*interrupted by sig handler return*/
nread = 0;
}else{
return -1;/*error*/
}
}else if(nread == 0){
break; /*EOF*/
}else{/*read content*/
nleft -= nread;
bufp += nread;
}
}
return (n - nleft);
} ssize_t rio_writen(int fd,void *usrbuf,size_t n)
{
size_t nleft = n;
ssize_t nwritten;
char *bufp = usrbuf; while(nwritten = write(fd,bufp,nleft) <= 0){
if(errno == EINTR){
nwritten = 0;
}else{
return -1;
}
nleft -= nwritten;
bufp += nwritten;
}
return n;
}
/******************************************************************************/
#define RIO_BUFSIZE 8192
typedef struct{
int rio_fd; /*To operate the file descriptor*/
int rio_cnt;/*unread bytes in internal buf*/
char *rio_bufptr;/*next unread byte int internal buf*/
char rio_buf[RIO_BUFSIZE];/*internal buf*/
}rio_t;
void rio_readinitb(rio_t *rp,int fd)
{
rp->rio_fd = fd;
rp->rio_cnt = 0;
rp->rio_bufptr = rp->rio_buf;
}
static ssize_t rio_read(rio_t *rp,char *usrbuf,size_t n)
{
int cnt;
while(rp->rio_cnt <= 0){/*Read the file content if buf is empty*/
rp->rio_cnt = read(rp->rio_fd, rp->rio_buf,sizeof(rp->rio_buf));
if(rp->rio_cnt < 0){
if(errno != EINTR){
return -1;
}
}else if(rp->rio_cnt == 0){/*EOF*/
return 0;
}else {/*reset buf ptr*/
rp->rio_bufptr = rp->rio_buf;
}
}
/*when n < rp->rio_cnt, need copy some times */
cnt = n;
if(rp->rio_cnt < n){/*one time copy end*/
cnt = rp->rio_cnt;
}
memcpy(usrbuf,rp->rio_bufptr,cnt);
rp->rio_bufptr += cnt;
rp->rio_cnt -= cnt;
return cnt;
}
ssize_t rio_readlineb(rio_t *rp, void *usrbuf,size_t maxlen)
{
int n,rc;
char c,*bufp = usrbuf;
for(n = 1; n < maxlen; n++){
if (( rc = rio_read(rp,&c,1)) == 1){
*bufp++ = c;
if(c == '\n'){
break;
}
}else if (rc == 0){
if(n == 1){/*EOF no data read*/
return 0;
}else{/*EOF some data read*/
break;
}
}else{/*ERROR*/
return -1;
}
}
*bufp = 0;/*string end sign :'\0'*/
return n;
} ssize_t rio_readnb(rio_t *rp,void *usrbuf,size_t n)
{
size_t nleft = n;
ssize_t nread;
char *bufp = usrbuf; while(nleft > 0){
if((nread = rio_read(rp,bufp, nleft)) < 0){
if(errno == EINTR){/*interrupted by sig handler return*/
nread =0;
}else{/*errno set by read() */
return -1;
}
}else if(nread == 0){/*EOF*/
break;
}
nleft -= nread;
bufp += nread;
}
return (n-nleft);/*return >=0*/
} int main()
{
int n;
rio_t rio;
char buf[MAXLINE]; int fd = open("1.txt",O_RDONLY,755);
if(fd <=0){
printf("error\n");
}
rio_readinitb(&rio,fd);
while ((n = rio_readlineb(&rio,buf,MAXLINE)) != 0){
rio_writen(1,buf,n);
}
close(fd);
return 0;
}
上面的函数式RIO包提供的两类不同的函数:
1、不带缓冲的输入输出函数
2、带缓冲的输入函数
这里主要针对文件Io,因为标准Io本身就是带缓冲的,我们在对文件进行读写操作时,一般会优先使用标准的Io函数,但是在网络编程中,只能使用文件Io的函数,这里可能就用到我们上面的函数编写,有兴趣的可以多了解下上面的机制。在网络通信中,这种机制方法运用还是比较多的!
RIO包 健壮的I/O函数代码的更多相关文章
- 健壮的网络编程IO函数-RIO包
RIO包 简介 Rio包即为Robust io函数包.包中函数是对Linux基本I/O函数的封装,使其更加健壮.高效,更适用于网络编程. 分析 Rio包由rio_t结构体和系列函数组成. 首先是两个不 ...
- Linux IO操作——RIO包
1.linux基本I/O接口介绍 ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, void *buf, siz ...
- Maxim实时时钟芯片设计指南5791-关于编写健壮的实时时钟控制代码的提示
用DS12C887设计一个万年历,虽然反复查看说明书,还是出各种的错误. 因此,从美信官网查询资料,翻译的不太通,凑合着对照看. 原文链接 Tips for Writing Bulletproof R ...
- ThinkPHP3.2 G函数代码及 使用方法
ThinkPHP3.2 G函数代码及 使用方法 代码: // 内存是否可调用 define('MEMORY_LIMIT_ON',function_exists('memory_get_usage')) ...
- php 安全过滤函数代码
php 安全过滤函数代码,防止用户恶意输入内容. //安全过滤输入[jb] function check_str($string, $isurl = false) { $string = preg_r ...
- 使用正则表达式匹配JS函数代码
使用正则表达式匹配JS函数代码 String someFunction="init"; Pattern regex = Pattern.compile("function ...
- C语言实现md5函数代码
网上找到的实现md5函数代码,包括一个头文件md5.h和一个源文件md5.c,用下面的测试代码test.c测试通过,各文件依次如下: 头文件md5.h #ifndef MD5_H #define MD ...
- 前端JS面试题汇总 Part 2 (null与undefined/闭包/foreach与map/匿名函数/代码组织)
原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...
- (转)x264源码分析(1):main、parse、encode、x264_encoder_open函数代码分析
转自:http://nkwavelet.blog.163.com/blog/static/2277560382013103010312144/ x264版本: x264-snapshot-2014 ...
随机推荐
- Android 程式开发:(二十)内容提供者 —— 20.6 自定义ContentProvider的使用
现在,ContentProvider已经创建好了,可以去尝试使用一下. 1. 使用之前的工程,在布局文件main.xml中添加一些控件. <?xml version="1.0" ...
- 圣魔大战3(Castle Fantisia)艾伦希亚战记完美攻略
作为城堡幻想曲系列续作,艾伦希亚战记继承了前作的战棋+养成模式进行游戏. (城堡幻想曲3,纠正大家个错误哦,不是圣魔大战3,圣魔大战是城堡幻想曲2,圣魔大战不是个系列,艾伦西亚战记==艾伦希亚战记,一 ...
- Android TextView自己主动换行文字排版參差不齐的原因
今天项目没什么进展,公司后台出问题了.看了下刚刚学习Android时的笔记,发现TextView会自己主动换行,并且排版文字參差不齐.查了下资料,总结原因例如以下: 1.半角字符与全角字符混乱所致:这 ...
- Ubuntu14.04更新源
Ubuntu14.04更新源 http://jingyan.baidu.com/article/7f41ecec1b7a2e593d095ce6.html Ubuntu源 http://wiki.ub ...
- SSH2三大框架整合警告
*********************************************************************** * WARNING!!! * * * * >> ...
- 使用Eclipse EE开发web项目
最近使用EclipseEE开发web项目,遇到了以下几个问题: 1. 通过tomcat启动web应用的时候,总是提示找不到包或者class. 经过排查,发现所有的jar包并没有放到WEB-INF/li ...
- 继承Application实现Android数据共享
Application类 在Android中,启动一个应用,首先会初始化Application,然后再通过它检查AndroidManifest.xml清单文件,选择须要首先启动的Activi ...
- UC网盘被关停 将与阿里淘盘合并?(案例说明云盘的成本才是重点,技术不是问题;与巨头竞争是重点)
UC网盘被关停 将与阿里淘盘合并? 二八2016-03-18 08:05:36阿里巴巴 网盘 产品阅读(0)评论(12) UC网盘项目组日前发布公告称将停止网盘存储服务,原因为配合国家对云盘传播淫秽色 ...
- 试解析Tomcat运行原理(一)--- socket通讯(转)
关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...
- Filter和FilterChain具体的使用说明
一.Filter的介绍及使用 什么是过滤器? 与Servlet类似,过滤器是一些web应用程序组件,能够绑定到一个web应用程序中.可是与其它web应用程序组件不同的是,过滤器是"链&quo ...