下面两个函数都可用来复制一个现存的文档描述符:
#include <unistdh>
int dup(int filedes);
int dup2(int filedes,int filedes2);
两函数的返回:若成功为新的文档描述符,出错为-1
由dup返回的新文档描述符一定是当前可用文档描述符中的最小数值。用dup2我们
则能够用f
iledes2参数指定新描述符的数值。假如filedes2已打开,则先将其关闭。如若
filedes等
于filedes2,则dup2返回filedes2,而不关闭他。
这些函数返回的新文档描述符和参数filedes共享同一个文档表项。图34显示了
这种情况
。
图34〓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。他们之间的区别是
:
1dup2是个原子操作,而close及fcntl则包括两个函数调用。有可能在close和
fcntl之
间插入执行信号捕获函数,他可能修改文档描述符(我们将在第十章说明信号。)
2在dup2和fcntl之间有某些不同的errno。
dup2系统调用起源于Version 7,然后传播至任何BSD版本。而复制文档描述符的f
cntl方法
则首先由系统Ⅲ使用,系统Ⅴ则继续采用之。SVR32取用了dup2函数,42BSD则
取用了fc
ntl函数及F[CD#*2]DUPFD功能。POSIX1需要dup2及fcntl的F[CD#*2]DUPFD功能两
者。
313〓fcntl函数
fcntl函数能够改变已打开的文档的性质。
#include <sys/typesh>
#include <unistdh>
#include <fcntlh>
int fcntl(int filedes,int cmd,/* int arg */);
返回:若成功,依赖于cmd(见下),出错为-1
在本节的各实例中,第3个参数总是个整数,和上面所示函数原型中的注释部分
相对应。
但是我们在123节中说明记录锁时,第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)。
我们先说明这十种命令值中的前七种(在123节中说明后三种,他们都和记录锁有
关)我们
将涉及和进程表项中各文档描述符相关联的文档描述符标志连同每个文档表项中的
文档状态
标志,所以请参阅图32。
F[CD#*2]DUPFD〓复制文档描述符filedes,新文档描述符作为函数值返回。他是尚
未打开的
各描述符中大于或等于第三个参数值(取为整型值)中各值的最小值。新描述符和f
iledes共
享同一文档表项(参见图34)但是,新描述符有他自己的一套文档描述符标志,其
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函数时,
已说明了文档状态标志。他们列于图35中
图35〓对于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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



