Linux文件操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档