调用open函数可以打开或创建一个文件:
- #include <fcntl.h>
- int open(const char *pathname, int oftag, ...);
返回值:成功返回文件描述符,出错返回-1
我们将第三个参数写为...,ISO C用这种方法表明余下参数的数量及其类型根据具体的调用会有所不同。对于open函数而言,仅当创建新文件时才使用第三个参数。
pathname是要打开或创建文件的名字。
oflag参数可用来说明此函数的多个选项。用下列一个或多个常量进行“或”运算构成oflag参数(这些常量定义在<fcntl.h>头文件中)。
- O_RDONLY 只读打开。
- O_WRONLY 只写打开。
- O_RDWR 读、写打开。
在上面三个常量中必须指定一个且只能指定一个。下列常量则是可选择的:
- O_APPEND 每次写时都追加到文件的尾端。
- O_CREAT 若此文件不存在,则创建它。使用此选项时,需要第三个参数mode,用其指定该新文件的访问权限位。
- O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则会出错。用此可以测试一个文件是否存在,如果不存在,则创建此文件,这使测 试可创建两者成为一个原子操作。
- O_TRUNC 如果此文件存在,而且为只写或读写成功打开,则将其长度截短为0。
- O_NOCTTY 如果pathname指的是终端设备,则不将该设备分配作为此进程的控制终端。
- O_NONBLOCK 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/O操作设置非阻塞模式。
下面三个标志也是可选的。它们是Single UNIX Specification(以及POSIX.1)中同步输入和输出选项的一部分。
- O_DSYNC 使每次wriite等待物理I/O操作完成,但是如果写操作并不影响读取刚写入的数据,则不等待文件属性被更新。
- O_RSYNC 使每一个以文件描述符作为参数的read操作等待,直至任何对文件同一部分进行的未决写操作都完成。
- O_SYNC 使每次write都等到物理I/O操作完成,包括有write操作引起的文件属性更新所需的I/O。
由open返回的文件描述符一定是最小的未用描述符数值。例如,一个应用程序可以先关闭标准输出(通常是文件描述符1),然后打开另一个文件,执行打开操作前就能了解到该文件一定会在文件描述符1上打开。