标签归档:系统级IO

linux c i/o函数汇总

Linux c 常用i/o函数:

一、标准I/o函数:

fopen 、fread 、fscanf、sscanf、fgets、fflush、fclose
fdopen、fwrite、fprintf、sprintf、fputs、fseek

二、Unix I/O函数

open write stat read lseek close

三、RIO函数–扩展函数

rio_readn、rio_writen、rio_readinitb、rio_readlineb、rio_readnb

相关阅读:
RIO 带缓冲的输入函数
Rio包 健壮读和写
read write函数用法
linux c打开关闭文件

RIO 带缓冲的输入函数

通常一个文本行是一个换行符结尾的ASCII码字节系列。在unix系统中,换行符”\n”ASCII(LF),数字值(0x0a),
如何检测一个文本行的长度:
1 使用read函数 一次一个字节地从文件中传送到用户存储器中,当检测到换行符时,文本行读取完毕,这种方法的缺点:每读取一个字节都要调用内核
2 使用RIO带缓冲的读取函数(rio_readlineb),它先从一个内部读缓冲区copy一个文本行,当缓冲区变空时,再次调用read函数重新将缓冲区填满,对于既包含文本行也包含二进制数据文件,RIO提供一个rio_readn带缓冲区的版本。
void rio_readinitb(rio_t *rp, int fd);


ssize_t rio_readlineb(rio_t *rp ,void *usrbuf,size_t maxlen);
ssize_r rio_readnb(rio_t *rp,void *usrbuf,size_t n);
函数简介:


1 调用rio_readinitb函数,它的功能是将文件描述符fd和地址rp进行关联。
2 rio_readlineb函数的功能从文件rp读出一个文本行(包含文本换行符),将文本行copy到usrbuf,并且用null字符来结束这个文本行,rio_readlineb一次最多可以读maxlen-1个字节。
3 rio_readnb函数从文件rp最多读n个字节到存储器usrbuf中。

相关阅读:
read函数读取文件

Rio包 健壮读和写(一)

RIO包:Robust I/O 包 健壮包。
此包主要提供高效 方便 健壮的I/O读取方式。RIO提供了两类不同的函数:
1 无缓冲的输入输出函数:这个函数直接在存储器和文件之间传送数据,没有应用级缓冲。(主要应用于 二进制数据读写到网络 网络读写至二进制数据中)。
2 带缓冲的输入函数:这个函数允许高效地从文件中读取文本行和二进制数据,这些文件的内容首先被缓冲至应用级缓冲区内,类似于为printf打印区提供的缓冲区,RIO带缓冲输入函数,在同一个描述符上可以被交错地调用,例:先读取一些文本行,稍后再读取二进制数据


Rio的无缓冲的输入输出函数:
ssize_t rio_readn(int fd,void * usrbuf,size_t n); 若EOF 则返回0 出错则返回-1。
ssize_t rio_writen(int fd,void * usrbuf,size_t n); 若成功则返回传送的字节数 否则出错则返回-1。
rio_readn函数的功能是:从fd的当前文件位置最多传送n个字节到存储器位置usrbuf。
rio_writen函数的功能是:从位置usrbuf传送n个字节到描述符fd

ssize_t rio_readn(int fd,void * usrbuf,size_t n){
size_t left =n;
ssize_t nread;
char *bufp = usrbuf;

while(nleft >0)
{
if((read =read(fd,bufp,nleft)<0){ if(errno ==EINTR) { nread =0;//遇到中断异常时,此次执行失败,但是继续执行while 循环执行程序 }else { return -1; } }else if(read ==0){ break; //已经读到文件末尾 } nleft -=nread; bufp +=nread; } return (n-nleft); }


ssize_t rio_writen(int fd,void *usrbuf,size_t n){
size_t nleft = n;
ssize_t nwriten;
char *bufp = usrbuf;

while(nleft >0){
if((written =write(fd,bufp,nleft)) <=0){ if(errno == EINTR){ nwritten =0; //遇到中断异常时,此次执行失败,但是继续执行while 循环执行程序 }else { return 0; } } nleft -=nwriten; bufp +=nwriten; } return n; }



rio 无缓冲函数的原理就是当遇到中断时,当次操作报异常,但是while 循环继续执行读取和写入操作,执行完成n个字节的读取和写入。