Chinaunix首页 | 论坛 | 博客
  • 博客访问: 526513
  • 博文数量: 68
  • 博客积分: 2501
  • 博客等级: 大尉
  • 技术积分: 713
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-07 17:49
个人简介

文章分类

全部博文(68)

分类: LINUX

2010-04-22 20:03:40

Linux下的I/O操作
一、分类
Linux下的I/O操作分为两类:一类是基于文件描述符,不带缓存的I/O操作;另一类是符合ANSI C标准的基于缓存的I/O操作。
二、基于文件描述符的,为基本的I/O控制,是不带缓存的。在这一类文件I/O操作中,最重要的是一个文件描述符。对于内核而言,所有打开的文件者通过文件描述符引用,文件描述符是一个非负数,当打开一个现有的文件夹或创建一个新文件时,内核向进程返回一个文件描述符;当读或写一个文件夹时,使用open等函数返回文件描述符来标识该文件,并将其作为参数传递给read和write。
open函数
(1)头文件
#include
(2)函数原型
int open(const char *pathname, /*被打开的文件名(可以包括路径名)*/
  const char flags, /*文件打开的方式*/
  int perms);/*被打开文件的存取权限,为八进制表示法*/
flags值有:O_RDONLY(只读方式打开文件),O_WRONLY(只写方式打开文件),O_RDWR(读写方式打开文件),O_CREAT(如果该文件不存在,就创建一个新的文件,并用第三个参数为其设置权限),O_EXCL(测试文件是否正在),O_NOCTTY(使用本参数,如文件为终端,那么终端不能作为调用open的进程或控制终端),O_TRUNC(如果文件已经存在,那么打开文件时会先删除文件中原有数据),O_APPEND(以添加方式打开文件,所有对文件的写操作都在文件末尾进行)。
对于perns参数,在对文件的权限设置中的值与chmod命令的权限数值是一致的(4-2-1规则)。
close函数
(1)头文件
#include
(2)函数原型及返回值
int close(int fd); /*fd为文件描述符*/
成功返回0;出错返回-1。
 
read,write函数
(1)头文件
#include
(2)函数原型及返回值
size_t read/write(int fd, /*文件描述符*/
    void *buf, /*指定存储器读出数据或写入数据缓存区*/
    size_t count);/*指定读出/写入的字节数*/
成功返回读到/写入的字节数,0已到时达文件尾,-1出错。
lseek函数
(1)头文件
#include
#include
(2)函数原型及返回值
off_t lseek(int fd,  /*文件描述符*/
     off_t offset /*偏移量,每一个读写操作所需要移动的距离,单位是字*/
    /*节的数量,可正可负(向前移,向后移)*/
     int whence); /*文件当前位置的基点*/
whence的选择方式有:SEEK_SET(当前位置为文件的开头,新位置为偏移量的大小),SEEK_CUR(当前位置为文件指针的位置,新位置为当前位置加上偏移量),SEEK_END(当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小)。
成功返回文件的当前的位置;出错-1。
fcntl函数
fcntl有非常强大的功能,能够复制一个现有的描述符,获得/设置文件描述符标识,获得/设置文件状态标识,获得/设置异步I/O所有权及获得/设置记录锁。
(1)头文件
#include
#include
#include
(2)函数原型及返回值
int fcntl(int fd,  /*文件描述符*/
   int cmd,  /*不用的命令*/
   struce flock *lock); /*设置记录锁的具体状态*/
cmd有不同的选择,flock结构体如下:
struct flock{
    short l_type; /*可为F_RDLCK,F_WRLCK,F_UNLCK*/
    off_t l_start;/*相对位移量(字节)*/
    short l_whence;/*(SEEK_SET,SEEK_CUR,SEEK_END,参考lseek函数的whence参数选项)*/
    off_t l_len; /*加锁域的长度*/
    pid_t l_pid;
};
成功返回0;出错-1。
select函数
(1)头文件
#include
#include
#include
(2)函数原型及返回值
int select(int numfds,  /*需要检查的最大文件描述符加1*/
    fd_set *readfds, /*由select监视的读文件描述符集合*/
    fd_set *writefds, /*由select监视的写文件描述符集合*/
    fd_set *exeptfds, /*由select监视的异常处理文件描述符集合*/
    struct timeval *timeout);/*等待的时间*/
time值:NULL,永远等待;具体值,struct timeval类型指针,若等待timeout时间文件描述符还没有准备好,就立即返回;0,从不等待。
成功返回准备好的文件描述符;出错-1。
timeout是一个struct timeval类型的指针,timeval结构体如下:
struct timeval {
 long tv_sec; /*秒*/
 long tv_usec; /*微秒*/
}
实例:
******************
******************
三、基于流缓冲的,符合ANSI C的标准I/O处理,标准I/O库处理了很多细节,如缓存分配、优化长度执行等,包含了我们很多已熟知的函数,像printf、scanf函数等。
标准I/O又称高级磁盘I/O,在文件I/O的基础上进行了封装,提供缓冲流的目的是尽可能减少使用read和write调用的次数,提高I/O效率。它提供了全缓冲、行缓冲和不带缓冲3种缓冲类型。
(1)文件指针
在标准I/O中,流(stream)用“FILE *”来描述,所有的操作都是围绕流来进行的。在标准I/O库中预定义了3个流:标准输入流(stdin),标准输出流(stdout)和标准错误(stderr),当一个程序执行时,系统自动打开这三个流,它们可以在程序中直接使用。
(2)头文件
#include
所有的操作函数都在这个头文件中定义声明。
(3)函数原型及返回值
打开函数
FILE * fopen(const char *path, /*包含要打开的文件夹路径及文件名*/
 const char *mode); /*文件的打开方式*/
FILE * fdopen(const char *path, /*包含要打开的文件夹路径及文件名*/
 const char *mode); /*文件的打开方式*/
FILE * freopen(const char *path, /*包含要打开的文件夹路径及文件名*/
 const char *mode); /*文件的打开方式*/
成功返回指向FILE的指针;失败NULL。
关闭函数
int fclose(FILE * stream); /*已打开的文件指针*/
成功返回0;失败EOF。
按字符读/写文件
在文件打开之后,可对文件进行读写操作,读文件函数有fgetc/getc/getchar,写文件函数有fputc/putc/putchar。
成功读取的字符/写入返回0;失败EOF。
按行读/写文件
读文件的函数为fgets,写文件的函数为fputs/puts,函数原型为:
char *fgets(char *s,int n, FILE *stream);/*从流stream中最多读取n-1个字符到缓冲中*/
int fputs(const char *s,FILE *stream);/*将字符串s输出到流stream*/
int puts(const char *s); /*将字符串s输出到标准输出*/
按指定格式读/写文件
以指定的格式一次从文件中读取或写入若干个对象,常用来处理二进制文件。
size_t fread/fwrite(void *ptr ,/*存放读取/写入记录的缓冲区*/
 size_t size,  /*读取/写入的记录大小*/
 size_t nmemb,  /*读取/写入的记录数*/
 FILE * stream);  /*要读取/写入的文件流*/
成功返回读取/写入的记录数目;失败EOF。
刷新流
强制刷新一个流,使该流所有未军民一致的缓冲区数据写入到实际的流中,函数原型为:
int fflush(FILE *stream);
成功返回0,失败-1。
文件定位
文件中有个位置指针,指向当前读写的位置。fseek/rewind可以改变文件的位置指针,ftell返回流多文件的当前位置,函数原型为:
void rewind(FILE *stream); /*使位置指针重新指向文件的开始*/
int fseek(FILE *stream,
 long offset, /*位移量,以起始点为基准移动的字节数*/
 int whence); /*起始点,参考前面*/
成功返回0,失败乃成功之母1。
long ftell(FILE *stream);
成功返回当前位置,失败-1L。
实例:
******************
******************
阅读(1624) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~