函数作用:在进程中打开文件和创建文件,如果成功则返回一个文件描述符。
函数原型:
引用头文件:#include<fcntl.h>
int open(const char* pathname, int oflag,...);
int open(const char* pathname, int oflag,mode_t mode);
函数参数:
1.第一个参数pathname:要打开或者创建的文件名
2.第二个参数oflag:用于指定文件打开模式、标志等信息。
3.第三个参数mode:用来设置创建文件的权限(rwx)。当oflag中带有O_CREAT时才有效。
oflag:文件打开模式标志
以下三个标志必须指定一个且只能指定一个O_RDONLY : 只读打开
- O_WRONLY : 只写打开
- O_RDWR : 读写打开
其他文件标志:下面的标志是可以选择的,可通过C语言的或运算与文件打开标志进行组合
- 其他文件标志:
- O_APPEND:以后每次写文件时都会先将当前文件偏移量设置到文件末尾,但是读文件时时不影响。简单讲就是每次写的数据都添加到文件尾
- O_TRUNC:若此文件存在,并以读写或只写打开,则文件长度为0(打开文件的同时将文件中的内容清除)
- O_CREAT:若文件不存在,则创建该文件。此时,open函数需要第三个参数,用于指定该文件的访问权限位(后面描述)
- O_EXCL:若同时指定了O_CREAT标志,而文件已经存在,则会出错。可用于测试文件是否存在
- O_NOCTTY:如果打开的文件是终端设备,则不将此设备设置为进程的控制终端
- O_NONBLOCK:如果打开的文件是一个管道、一个块设备文件或一个字符设备文件,则后续的I/O操作均设置为非阻塞方式
- O_SYNC:使每次write都等到物理I/O操作完成
返回值:整型数据
- 调用成功时返回一个文件描述符fd
- 调用失败时返回-1,并修改errno
#include<string.h>
char* strerror(int errno);
注:出错处理
errno.h头文件中,定义了errno:当API调用出错时,errno说明出错的具体原因可简单地将errno理解成整型数据出错信息转换成可读字符串.
其它小点:
- open函数返回的文件描述符fd一定是未使用的最小的文件描述符。
- 如果文件不存在,而且又使用了O_CREAT标志,也就是会创建文件,创建文件时会给文件一定的权限,但是这个权限并不会限制该进程后面对该文件的操作。
- 当mode参数是由八进制数字给出的时候,如 0777 .要纠正一个错误,就是之前我认为 权限数字前面的 0 代表的是八进制的含义,其实并不是这样的,前面的 0 代表了权限修饰位,也就是set-user-id位、set-group-id位和sticky这三位的权限。