Linux文件操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、创建文件
int creat(filename,mode)
成功返回文件描述符,失败返回-1
等效于open(filename,O_CREAT | O_WRONL Y | O_TRUNC,mode),二者成功都返回文件描述符
二、打开文件
int open(filename, flags)
int open(filename, flags, mode)
成功:返回文件描述符
失败:返回-1
flags文件打开标志在fcntl.h中定义宏
O_RDONL Y:只读方式打开
O_WRONL Y:只写方式打开
O_RDWR:读写方式打开
O_APPEND:追加方式打开,原子操作,内核每次对该文件读写之前都将偏移量设置到文件尾端,避免多进程操作时写入的内容重叠交错
O_CREAT:创建一个文件,激活mode参数的使用(可以不用)
O_EXCL:使用了O_CREAT时,文件已存在就报错(不是自动报错)O_NOBLOCK:非阻塞方式打开文件
O_TRUNC:如果文件已经存在,删除文件内容
注解:1、在任何情况下O_RDONL Y/O_WRONL Y/O_RDWR不能相互组合(以“|”)的方式组合
2、open("test.txt",O_CREAT | O_RDWR)等同test.txt文件存在时open("test.txt",O_RDWR)
3、open("test.txt",O_CREAT)可以在没有文件时创建文件
mode文件访问权限S_I(R/W/X)(USR/GRP/OTH)
▲其中R/W/X分别表示读/写/可执行权限▲USR/GRP/OTH分别表示用户/组/其他人S_IRWXG:组可读、写、执行
S_IRWXO:其他人可读、写、执行
S_ISUID:设置用户执行ID
S_ISGID:设置组的执行ID
注解:1、以上选择项是sys/stat.h文件中定义的宏,可以通过“|”相互组合,决定文件访问权限
2、也可以用5个八进制数表示
第1位:设置用户ID (1有效0无效)
第2位:设置组ID (1有效0无效)
第3位:用户权限(1执行权限、2写权限、4读权限、0无)(需要求和)
第4位:组的权限(1执行权限、2写权限、4读权限、0无)(需要求和)
第5位:其他人的权限(1执行权限、2写权限、4读权限、0无)(需要求和)
3、open("test.txt",O_CREA T,10 705)创建一个用户可读可写可执行,其他人可读可执行,组
无权限,分析10705如下
1(设置用户ID),0(不设置组ID),7(1+2+4读、写、执行),0(没权限),5(1+4读、执行)
三、文件操作函数#include
int close (文件描述符)
成功返回0失败返回-1
当一个进程终止时,内核自动关闭它所有打开的文件,关闭一个文件时会释放该进程加在该文件上的所有记录锁
int lseek (文件描述符,偏移量,相对位置)
成功返回新的文件偏移量(相对于头部的),失败返回-1
文件相对位置,宏定义在unistd.h中
SEEK_SET 文件开始处(宏定义为0)
SEEK_CUR 当前位置(宏定义为1)
SEEK_END 文件末尾处(宏定义为2)
lseek (文件描述符,0,SEEK_END)返回文件的长度
lseek(文件描述符,-5,SEEK_END)文件末尾向前偏移5个字节
lseek(文件描述符,5,SEEK_END)偏移之后写入字符,在写入的内容与原来的文件末尾处之间有一段空洞,就是不占用磁盘空间的空档,用vi编辑器查看该文件的空档是乱码,gedtid是打不开该文件了,因为编码不正确
注解:文件头部是不能往前偏移的,否则lseek会执行错误返回-1
int read(文件描述符,*buf,要读的字节数)
成功返回读到的字节数,失败返回-1,已到文件结尾返回0
当文件偏移量已经到文件结尾,则read返回0
当要读取的长度大于文件长度时,read返回实际读到的字符长度
注解:在read函数正常执行时(未返回-1时),文件偏移量将增加实际读到的字节数,例如对同一文件连续执行两次read函数读出来的内容相互衔接
int write(文件描述符,*buf,要写入的字节数)
成功返回已写的字节数,失败返回-1
注解:正常情况下write返回值应该和要写入的字节数相同,否则表示出错,write出错的一个常见原因是磁盘已满,或者超过一个给定进程的文件长度限制
write和read函数要读写的字节数先写入buffer,系统会将buffer写到文件或指定数组,buffer的值在4096字节时,系统CPU最快完成操作,超过4096对执行速度影响不大,所以在操作文件的时候尽量用大一点的buffer空间
四、文件的原子操作
任何一个需要多个函数调用的操作都不可能是原子操作,因为两个函数之间,内核有可能会临时挂起该进程,导致下一个函数调用时失去了原有的效果
#include
int pread(文件描述符,*buf,需要读取的字节数,相对文件头偏移量)
int pwrite(文件描述符,*buf,需要写入的字节数,相对文件头偏移量)
注解:调用pread和pwrite函数相当于顺序调用lseek和read/write,只是pread和pwrite 将两个函数结合成原子操作,单个函数实现功能不会被内核临时挂起,使用pread和pwrite