3.1--引言
本章开始讨论Unix系统,先说明可用的文档I/O函数〖CD2〗打开文档、读文档、写
文档等等。大多数Unix文档I/O只要用5个函数:open、read、write、lseetp连同
close。然后说明不同缓冲器长度对read和write函数的影响。
本章所说明的函数经常被称之为不带缓冲的I/O(和将在第五章中说明的标准I/O函
数相对照)。术语---不带缓冲指的是每个read和write都调用一个核中的系统调用。
这些不带缓冲的I/O函数不是ANSI C的组成部分,但是是POSIX1和XPG3的组成部分。
只要涉及在多个进程间共享资源,原子操作的概念就变成很重要。我们将通过文
件I/O和传送给Open函数的参数来讨论此概念。这将导致讨论在多个进程间是如何
共享文档的,并涉及系统核的有关数据结构。在讨论了这些特征后,我们将说明
dup、fcntl和ioctl函数。
3.2--文档描述符
对于系统核而言,任何打开文档都由文档描述符引用。一个文档描述符是个非负整
数。当打开一个现存文档或创建一个新文档时,系统核向进程返回一个文档描述符。
和我们要读、写一个文档时,用open或creat返回的文档描述符标识该文档,将其
作为参数传送给read或write。
按照惯例,Unix Shell使文档描述符O和一个进程的标准输入相结合,使文档描述符1
和标准输出相结合,使文档描述符2和标准出错输出相结合。这是Unix shell连同很
多应用程式使用的惯例,而和系统核无关。尽管如此,假如不遵照这种惯例那么很多
Unix应用程式就会不能工作。
在POSIX1应用程式中,这些幻数0,1,2应被代换成符号常数STDIN_FILENO,STDOUT_F-
ILENO和STDERR_FILENO。这些常数都定义在头文档<unistd.h>中.文档描述符的范围
是0-OPEN_MAX(请回忆图2.7)。较早的Unix版本采用的上限值是19(允许每个进程打开
20个文档),现在很多系统则将其增加为63。SVR4和4.3 BSD对文档描述符的变化范围
没有作规定,他只受到系统配置的存储器的总量、整型字的字长连同系统管理员所配
置的软性或硬性限制的约束。
3.3--Open函数
调用Open函数打开或创建一个文档。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int oflag, /* mode_t mode */);
返回:若成功为文档描述符,出错为-1
我们将第3个参数写为/* */,这是ANSI C说明余下参数的数目和类型能够变化的方法。
对于Open函数而言,仅当创建新文档时才使用第3个参数(我们将在稍后对此进行说明)
在函数原型中我们将此参数放置在注释中。pathname是要打开或创建的文档的名字。
flag参数可用来说明此函数的多个可选择项。用下列一个或多个常数相或(OR)构成flag
参数(这些常数定义在<fcntl.h>头文档中)。
O_RDONLY 只读打开, O_WRONLY 只写打开,O_RDWR 读、写打开.很多实现将O_RDONLY定
义为0,O_WRONLY定义为1,O_RDWR定义为2,以和较早的系统兼容.在这三个常数中应当也
只应指定一个.下列常数则是可选择的:
O_APPEND--在每次写时都加到文档的尾端。我们将在3.11中周详说明此选择项。
O_CREAT--若此文档不存在则创建他。使用此可选项时,需同时说明第三个参数mode,
用其说明该新文档的存取许可权位。(我们将在45节中说明文档的许可权位,那时就能
了解如何说明mode,连同如何用进程的vmask值修改他。)
O_EXCL--假如同时指定了O_CREAT,而文档已存在,则出错.这使得测试一个文档是否存
在,假如不存在则创建此文档成为一个原子操作.我们将在3.11节中较周详的说明原子操作
O_TRUNC--假如此文档存在,而且为只读或只写成功打开,则将其长度截短为0。
O_NOCTTY--假如pathname指的是终端设备,则不将此设备分配作为此进程的控制终端.我
们在9.6节中说明控制终端。
O_NONBLOCK--假如pathname指的是个FIFO、一个块特别文档或一个字符特别文档,则此
选择项为此文档的本次打开操作和后续的I/O操作配置非阻塞方式。在12.2中我们将说明
此工作方式。
较早的系统Ⅴ版本引入了O_NDELAY(不延迟)标志,他和O_NONBLOCK(不阻塞)选择项类似,
但在读操作的返回值中具备两义性。假如不能从管道、FIFO或设备读得数据,则不延迟
选择项使read返回0,这和表示已读到文档尾端的返回值0相冲突。SVR4仍支持这种语义
的不延迟选择项,但是新的应用程式应当使用不阻塞选择项以代替之。
O_SYNC--使每次write都等到物理I/O操作完成。我们将在3.13使用此选择项。
由Open返回的文档描述符一定是最小的未用描述符数字。这一类被很多应用程式用来在
标准输入、标准输出或标准出错输出上打开一个新的文档。例如,一个应用程式能够先
关闭标准输出(通常是文档描述符1),然后打开另一个文档,事先就能了解到该文档一定
会在文档描述符1上打开。在3.12节说明dup函数时我们能够了解到有更好的方法能确保在
一个给定的描述符上打开一个文档。
文档名和路径名截短--假如NAME_MAX是14,而我们却试图在当前目录中创建一个其文档名
包含15个字符的新文档,此时会发生什么呢?按照传统的系统Ⅴ版本,允许这种使用方法,
但是总是将文档名截短为14个字符,而BSD类的系统则返回出错ENAMETOOLONG。这一问题
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




