Chinaunix首页 | 论坛 | 博客
  • 博客访问: 409565
  • 博文数量: 54
  • 博客积分: 1186
  • 博客等级: 少尉
  • 技术积分: 668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-11 04:57
文章分类

全部博文(54)

文章存档

2013年(1)

2012年(6)

2011年(47)

我的朋友

分类: LINUX

2012-07-09 14:11:27

调用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。
阅读(6076) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~