底层I/O的操作过程

来源:互联网 发布:淘宝订单自检通知 编辑:程序博客网 时间:2024/05/21 23:00

打开文件→改变文件位置→读写文件→关闭文件
文件的操作主要用到5个函数:open,read, write, lseek,close
0 文件描述符
文件操作符是一个非负整数,是一个用于描述被打开文件的索引值
一个进程从运行开始一般都会打开3个文件,标准输入,标准输出和标准出错函数。三个对应的描述符分别是0,1,2。一般第一个打开的文件是从3开始的。
1 文件的创建、打开与关闭
open函数用于打开或创建文件,在打开或创建文件时可指定文件的属性及用户的权限等各种参数

#include<sys/types.h>#include<sys/stat.h>#include<fcantl.h>int open(const char *pathname,int flags)int open(const char *pathname,int flags,mode_t mode)

…..所要用到的头文件
open函数返回,若成功返回文件描述符,若出错返回-1
pathname使用绝对路径或相对路径
flags是打开文件方式的参数,定义在fcntl.h文件中,O_RDONLY 只读,O_WRONLY只写,O_RDWR读写三个参数只能指定其中一个
mode是用于指定所创建文件的权限,使用|来组合 具体用法 S_I(R/W/X)(USR/GEP/OTH) 也可以用数字来代替 例如0777
umask 用户权限的掩码 默认为 0022 1 可以由命令更改 2可以在代码中更改 umask(0000);

creat函数

open(pathname,O_RDWR|O_CREAT|O_TRUNC,0666)

O_RDWR 可读可写 O-CREAT 建立 0_TRUNC 覆盖 0666是存储权限
推荐使用2,调用open函数

create函数返回,成功返回只写方式打开的文件描述符,出错为-1
pathname、mode含义与open相同
close函数

#include <unistd.h> int close(int fd)  

close函数返回,成功返回0,出错-1
fd表示已打开文件的描述符
2、文件的定位

当前文件位移量,非负整数,度量一个文件开始处计算的字节数,读写操作从当前文件位移量处开始
调用lseek函数显示的定位一个打开文件

#include <sys/types.h>  #include <unistd.h>  off_t lseek(int fd,off_t offset,int whence)  

fd表示已打开文件的描述符
offset表示位移量的大小,单位字节,可正负
whence,解释参数offset大小,下面是取值和含义

whence取值含义
SEEK_SET 将该文件的位移量设置为距文件开始处offset个字节
SEEK_CUR 将该文件的位移置量设置为其当前增加offset个字节,offset可为正或负
SEEK_END 将该文件的位移量设置为文件长度加offset个字节,offset可为正或负
小技巧
如果要得到文件的长度 lseek(fd ,0,SEEK_END);
文件的读写
read函数
打开文件读取数据

#include <unistd.h>  ssize_t read(int fd,void *buf,size_t count)

返回,读到的字节数,若已到文件尾端返回0,出错返回-1
fd表示进行操作的文件描述符

buf是一个指向缓冲区的指针

count表示本次操作将要读取的数据字节数

write函数
用write函数向打开文件写数据

#include <unistd.h>  ssize_t write (int fd,void *buf,size_t count) 

返回,成功为已写的字节数,出错为-1
fd操作的文件描述符

buf指向缓冲区的指针,放入要写入文件的数据

count表示本次操作写入文件的数据字节数
参考http://blog.csdn.net/del1214/article/details/7202372#

0 0