一、Linux中文件及文件描述符概述
在Linux中对目录和设备的操作都等同于文件的操作,Linux中文件主要分为4种:普通文件、目录文件、链接文件和设备文件。
内核通过文件描述符来区分和引用特定的文件。对Linux而言,所有设备和文件的操作都是使用文件描述符来进行的。文件描述符是一个非负的整数,它是一个索引值,并指向在内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。
通常,一个进程启动时都会打开三个文件:标准输入、标准输出和出错处理。这三个文件分别对应文件描述法为0、1和2(也就是替换宏STDIN_FILENO、STDOUT_FILEON和STDERR_FILENO)。
二、底层文件I/O操作
1.基本文件操作
(1)open()函数用于打开或创建文件,在打开或创建文件时可以指定用户的属性及用户的权限等各种参数。
所需头文件 | #include<sys/types.h> /* 提供类型pid_t的定义 */ #include<sys/stat.h> #include<fcntl.h> |
|
---|---|---|
函数原型 | int open(const char *pathname,int flags,int perms) | |
函数传入值 | pathname | 被打开的文件名(包括路径名) |
flag:文件打开的方式 | O_RDONLY:以只读方式打开文件 | |
O_WRONLY:以只写方式打开文件 | ||
O_RDWR:以读写方式打开文件 | ||
O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三个参数为其设置权限 | ||
O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在。此时open是原子操作,防止多个进程同时创建同一个文件 | ||
O_NOCTTY:使用本参数时,若文件为终端,那么该终端不会成为调用open()的那个进程的控制终端 | ||
O_TRUNC:若文件已经存在,那么会删除文件中的所有数据,并设置文件大小为0 | ||
O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾,即将写入的数据添加到文件的末尾 | ||
perms | 被打开文件的存取权限 可以用一组宏定义:S_I(R/W/X)(USR/GRP/OTH) 其中R/W/X分别表示读/写/执行权限 USR/GRP/OTH分别表示文件所有者/文件所属组/其他用户 例如,S_IRUSR|S_IWUSR表示设置文件所有者的可读可写属性。 八进制表示法中600也表示同样的权限 |
|
函数返回值 | 成功:返回文件描述符 失败:-1 |
PS:在open()函数中,flag参数可通过“|”组合构成,但前3个标志常量(O_RDONLY、O_WRONLY以及O_RDWR)不能相互组合。perms是文件的存取权限,既可以用宏定义表示法,也可以用八进制表示法。
(2)close()函数用于关闭一个被打开的文件。当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功能而不显示地关闭一个文件。