调用open函数可以打开或创建一个文件。
#include
#include
#include
intopen(constchar*pathname,intoflag,.../*,mode_tmode*/);
返回:若成功为文件描述符,若出错为-1
我们将第三个参数写为...,这是ANSIC说明余下参数的数目和类型可以变化的方法。对于open函数而言,仅当创建新文件时才使用第三个参数。(我们将在稍后对此进行说明。)在函数原型中此参数放置在注释中。
pathname是要打开或创建的文件的名字()。oflag参数可用来说明此函数的多个选择项。用下列一个或多个常数进行或运算构成oflag参数(这些常数定义在头文件中):
传开刀DONLY只读打开。
传开圀刀伀一LY只写打开。
传开刀DWR读、写打开。
很多实现将O_RDONLY定义为0,O_WRONLY定义为1,O_RDWR定义为2,以与早期的系统兼容。
在这三个常数中应当只指定一个。下列常数则是可选择的:
传开APPEND每次写时都加到文件的尾端。3.11节将详细说明此选择项。
传开CREAT若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,
用其说明该新文件的存取许可权位。(4.5节将说明文件的许可权位,那时就能了解如何说明mode,以及如何用进程的umask值修改它。)
传开EXCL如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。3.11节将较详细地说明原子操作。
传开吀刀唀一C如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。
传开一伀CTTY如果pathname指的是终端设备,则不将此设备分配作为此进程的控制终端。
传开一伀一BLOCK如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,
则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。12.2节将说明此工作方式。
较早的系统V版本引入了O_NDELAY(不延迟)标志,它与O_NONBLOCK(不阻塞)选择项类似,但在读操作的返回值中具有两义性。如果不能从管道、FIFO或设备读得数据,则不延迟选择项使read返回0,这与表示已读到文件尾端的返回值0相冲突。SVR4仍支持这种语义的不延迟选择项,但是新的应用程序应当使用不阻塞选择项以代替之。
传开匀夀一C使每次write都等到物理I/O操作完成。3.13节将使用此选择项。
传开匀夀一C选择项不是POSIX.1的组成部分,但SVR4支持此选择项。
由open返回的文件描述符一定是最小的未用描述符数字。这一点被很多应用程序用来在标准输入、标准输出或标准出错输出上打开一个新的文件。例如,一个应用程序可以先关闭标准
输出(通常是文件描述符1),然后打开另一个文件,事先就能了解到该文件一定会在文件描述符1上打开。在3.12节说明dup2函数时,可以了解到有更好的方法来保证在一个给定的描述符
上打开一个文件。
文件名和路径名截短
如果NAME_MAX是14,而我们却试图在当前目录中创建一个其文件名包含15个字符的新文件,此时会发生什么呢?按照传统,早期的系统V版本,允许这种使用方法,但是总是将文
件名截短为14个字符,而BSD类的系统则返回出错ENAMETOOLONG。这一问题不仅仅与创建新文件有关。如果NAME_MAX是14,而存在一个其文件名恰恰就是14个字符的文件,那么
以pathname作为其参数的任一函数(open,stat等)都会遇到这一问题。
在POSIX.1中,常数_POSIX_NO_TRUNC决定了是否要截短过长的文件名或路径名,或者返回一个出错。第12章将说明此值可以针对各个不同的文件系统进行变更。
FIPS151-1要求返回出错。
SVR4对传统的系统V文件系统(S5)并不保证返回出错(见表2-6),但是对BSD风格的文件系统(UFS),SVR4保证返回出错,4.3+BSD总是返回出错。
若_POSIX_NO_TRUNC有效,则在整个路径名超过PATH_MAX,或路径名中的任一文件名超过NAME_MAX时,返回出错ENAMETOOLONG。
阅读(6134) | 评论(0) | 转发(0) |