手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

第三章--文档I/O

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


下面两个函数都可用来复制一个现存的文档描述符:

#include <unistdh>

int dup(int filedes);

int dup2(int filedes,int filedes2);

两函数的返回:若成功为新的文档描述符,出错为-1

由dup返回的新文档描述符一定是当前可用文档描述符中的最小数值。用dup2我们

则能够用f

iledes2参数指定新描述符的数值。假如filedes2已打开,则先将其关闭。如若

filedes等

于filedes2,则dup2返回filedes2,而不关闭他。

这些函数返回的新文档描述符和参数filedes共享同一个文档表项。图34显示了

这种情况

。



图34〓dup(1)后系统核数据结构

在此图中,我们假定进程执行了:

newfd=dup(1);

当此函数开始执行时,我们假定下一个可用的描述符是3(这是很有可能的,因为

0,1和2

是由shell打开的)。因为两个描述符指向同一文档表项,所以他们共享同一文档状

态标志(

读、写、添写等)连同同一当前文档位移量。

每个文档描述符都有他自己的一套文档描述符标志。如我们在下一节中将说明的那

样,新描

述符的执行时关闭(close[CD#*2]on[CD#*2]exec)文档描述符标志总是由dup函数清

除。

复制一个描述符的另一种方法是使用fcntl函数,我们将在下一节对该函数进行说

明。确实

,调用

dup(filedes);

等效于

fcntl (filedes,F[CD#*2]DUPFD,0);

而调用

dup2(filedes,filedes2);

等效于

close(filedes2);

fcntl(filedes,F[CD#*2]DUPFD,filedes2);

在后一种情况下,dup2并不完全等同于close,然后跟附fcntl。他们之间的区别是

:

1dup2是个原子操作,而close及fcntl则包括两个函数调用。有可能在close和

fcntl之

间插入执行信号捕获函数,他可能修改文档描述符(我们将在第十章说明信号。)



2在dup2和fcntl之间有某些不同的errno。

dup2系统调用起源于Version 7,然后传播至任何BSD版本。而复制文档描述符的f

cntl方法

则首先由系统Ⅲ使用,系统Ⅴ则继续采用之。SVR32取用了dup2函数,42BSD则

取用了fc

ntl函数及F[CD#*2]DUPFD功能。POSIX1需要dup2及fcntl的F[CD#*2]DUPFD功能两

者。

313〓fcntl函数

fcntl函数能够改变已打开的文档的性质。

#include <sys/typesh>

#include <unistdh>

#include <fcntlh>

int fcntl(int filedes,int cmd,/* int arg */);

返回:若成功,依赖于cmd(见下),出错为-1

在本节的各实例中,第3个参数总是个整数,和上面所示函数原型中的注释部分

相对应。

但是我们在123节中说明记录锁时,第3个参数则是指向一个结构的指针。

fcntl函数有五种功能:

·复制一个现存的描述符(cmd 剑啤迹茫模*常病紻UPFD),

·获得/配置文档描述符标记(cmd=F[CD#*2]GETFD或F[CD#*2]SETFD),

·获得/配置文档状态标志(cmd=F[CD#*2]GETFL或F[CD#*2]SETFL),

·获得/配置异步I/O属主权(cmd=F[CD#*2]GETOWN或F[CD#*2]SETOWN),

·获得/配置记录锁(cmd=F[CD#*2]GETLK,F[CD#*2]SETLK或F[CD#*2]SETLKW)。

我们先说明这十种命令值中的前七种(在123节中说明后三种,他们都和记录锁有

关)我们

将涉及和进程表项中各文档描述符相关联的文档描述符标志连同每个文档表项中的

文档状态

标志,所以请参阅图32。

F[CD#*2]DUPFD〓复制文档描述符filedes,新文档描述符作为函数值返回。他是尚

未打开的

各描述符中大于或等于第三个参数值(取为整型值)中各值的最小值。新描述符和f

iledes共

享同一文档表项(参见图34)但是,新描述符有他自己的一套文档描述符标志,其

FD[CD#*2

]CLOEXEC文档描述符标志则被清除(这表示该描述符在exec时仍保持开放,我们将

在第八章

对此进行讨论。)

F[CD#*2]GETFD〓对应于filedes的文档描述符标志作为函数值返回。当前只定义了

一个文档

描述符标志FD[CD#*2]CLOEXEC标志。

F[CD#*2]SETFD〓对于filedes配置文档描述符标志。新标志值是按第3个参数(取为

整型值)

配置的。

应当了解很多现存的涉及文档描述符标志的程式并不使用常数FD[CD#*2]CLOEXEC。

代替之,

程式或将此标志配置为0(系统默认,在exec时不关闭),或1(在exec时关闭)。

F[CD#*2]GETFL〓对应于filedes的文档状态标志作为函数值返回。在我们说明ope

n函数时,

已说明了文档状态标志。他们列于图35中

图35〓对于fcntl的文档状态标志

不幸的是三个存取方式标志(O[CD#*2]RDONLY,O[CD#*2]WRONLY,连同O[CD#*2]RDWR

)并不各占

1位。(正如前述,这三种标志的值各是0,1和2由于历史原因。这三种值是互斥的

〖CD2〗一

个文档只能有这3种值之1。)因此首先必须用屏蔽字O[CD#*2]ACCMODE取得存取方式

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!