1.文件I/O简介
文件I/O是非缓冲I/O,这意味着我们read/write的时候将会调用系统函数。非缓冲I/O的函数属于POSIX1规范和the Single UNIX Specification,但是不属于ISO C规范。
大多数的文件操作都可以通过5个函数来实现:open,read,write,lseek,close。
2.标准I/O的文件描述符
POSIX.1规定标准输入的文件描述符为0,标准输出为1,标准错误为2.
还有其默认宏伟STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO,定义在<unistd.h>头文件中。
文件描述符大小变化从0道OPEN_MAX-1.(open_max定义在<linux/limits.h>里面)
3.open()/openat()函数
3.1函数原型以及头文件
需要包含头文件:include <fcntl.h>
函数原型:int open(const char* path, int oflag, .../*mode_t mode*/);
int opened(int fd, const char* path, int oflag, .../*mode_t mode*/);
返回值:成功返回文件描述符,失败返回-1.
3.2 函数参数说明
...表示最后的参数是变化的。最后一个参数只有当文件被创建的时候是需要的。
path:表示将要打开或者创建的文件。
oflag:用 | 连接多个选项的参数
下面主要介绍oflag的可用宏参数选择
O_RDONLY:只读打开
O_WRONLY:只写打开
O_RDWR:读写打开
O_EXEC:只执行打开
O_SEARCH:只搜索打开
上面的5个参数 必须有且只能有一个被选择使用。
另外还有一些其他的宏参数可被选择
O_APPEND:写入文件的时候为在文件最后追加写入,不会删除已有内容
O_CLOEXEC:打开文件的时候设置FD_CLOEXEC标志
O_CREAT:文件不存在的话创建该文件,该选项需要第三个参数
O_DIRECTORY:如果path不是一个目录则产生一个错误
O_EXCL:如果文件存在活着O_CREAT被选择,就会产生一个错误;该选项测试文件是否存在,如果不存在就创建一个新文件,并且测试和创建会是原子操作。
O_NOCTTY:如果path指向的是一个终端设备,不会将该终端设置为进程的控制终端,
O_NOFOLLOW:如果path指向的是一个符号链接就产生一个错误。
O_NONBLOCK:如果path指向的是FIFO,块特殊文件,字符特殊文件,将打开文件和以后的I/O设置为非阻塞模式
O_SYNC:每次write都等到物理I/O完成,包括write引起的文件属性的更新。
O_TRUNC:如果文件存在并且使用只读或只写模式打开成功,就将它的长度减为0。
O_TTY_INIT:当打开终端设备(not already open),设置非标准的终端参数用来确认Single UNIX Specification。
O_DSYNC:每次写操作都等到物理I/O完成,但是如果写操作不影响读取刚写入数据的读取,则不等待文件属性的更新。
O_RSYNC:每个以文件描述符作为参数的读操作等待,直到所有对文件同一部分的未决写操作完成。
3.3openat函数的fd参数
1.如果path是一个绝对路径,fd被忽略,并openat和open函数一样的含义。
2.如果path指向的是一个相对路径,并且fd是一个指向开始路径的文件描述符。则相对路径的起始位置的fd所指向的文件目录。
3.如果path指向的是一个相对路径,并且fd是AT_FDCWD,相对路径的起始位置是当前目录。并且openat与open一样。
4.create函数
函数原型以及包含头文件
#include<fcntl.h>
int creat(const char* path, mode_t mode);
成功返回文件描述符,失败返回-1.
该函数等同于open(path, O_WRONLY|O_CREAT|O_TRUNC, mode)
5.close函数
#include<unistd.h>
int close(int fd);
成功返回0,失败返回-1.