<>文件描述符
所有打开的文件都通过文件描述符引用。对文件进行read和write等操作都是通过文件描述符进行。在符合Poxi.1的应用程序中0,1,2都标准化为标准输入、输出、错误,在"unitstd.h"中由STDIN_FILENO,STDOUT_FILENO,
STDERR_FILENO表示。对于文件描述符范围为0 ~ OPEN_MAX -
1。很多时候文件描述符范围0~19,现在将这些增加到63。而现在大部分操作系统上限都是根据系统几乎是无限的,一般取决于存储器总量,整形字长,系统管理员所做的软限制和硬限制。
<>open 和 openat
这两个函数都是打开一个文件定义为
#include < fcntl.h > int open(const char *path, int fd, ....); int openat(int
fd, const char * path, int oflag, ...); //打开成功返回文件描述符,出错返回-1
open的第一个参数为路径,第二个参数是打开文件的方式,第三个参数只有在第二个参数为创建个新文件的时候才有效。
第二个参数有已下几个选项
* O_RDONLY 只读打开
* O_WRONLY 只写打开
* O_RDWR 读写打开
* O_EXEC 只执行打开
* O_SEARCH 只搜索打开
上面五个选项是只可以选择一个,下面是多选
* O_APPEDN 每次写文件都追加到文件末尾
* O_CLOEXEC 把常量设置为文件描述符标志,这个标志作用是在调用exec执行一个程序后文件描述符会自动关闭
* O_CREATE 如果文件不存在则创建,这时open第三个和openat第四个参数就派上用场了,用于描述新创建文件的访问权限。
* O_DIRECTORY 限定打开的文件是一个目录,如果不是目录的话会出错
* O_EXCL 和O_CREAT一起使用,可以作为一个原子操作判断一个文件是否存在,如果文件存在是后会返回错误,可以用于文件锁
* O_NOFOLLOW 如果路径是一个符号链接,那么出错
* O_NOBLOCK 如果路径指定的是一个FIFO,一个块特殊文件或者是一个字符特殊文件,都设置为非阻塞操作。
* O_SYNC 每次操作等待文件I/O操作完成,包括引起的属性更新
* O_TRUNC 如果文件存在,以只写或者是读写方式打开,文件长度会被截断到0
* O_DSYNC write会等待文件I/O操作完成,如果文件不影响读取刚写入数据(例如不在影响文件总长度),那么不会等待文件更新,这个和O_SYNC区别
* O_RSYNC 使每一个以文件描述符作为参数进行read操作等待,直至所有对文件同意部分挂起的写操作都完成
open 和 openat的区别,当想使用相对路径时候,可以使用openat,但是openat也可以用于绝对路径,这个时候第一个参数就被无视了
<>函数creat
创建一个文件
#include < fcntl.h > int create(const char *path, mode_t mode);
//打开成功返回文件描述符,出错返回-1
第一个参数为文件路径,第二个参数是文件权限
这个函数等效于
open(path, O_WRONLY|O_CREATE|O_TRUNC, mode);
可以看出当文件存在时候也可以调用成功,只不过文件内容被清楚了。
<>函数close
关闭一个文件
#include < unistd.h > int close(int fd); //关闭成功返回0, 关闭失败返回-1
关闭一个文件会关闭该文件的所有记录锁
并且在一个程序关闭时,会关闭这个程序打开的所有文件
<>函数lseek
用于显示的改变一个文件偏移量
#include < unistd.h > off_t lseek(int fd, off_t offset, int whence); //
成功返回新文件的偏移,失败返回-1
第一个参数是文件的偏移量,