Posted on 2009-08-24 10:01
Prayer 阅读(808)
评论(0) 编辑 收藏 引用 所属分类:
C/C++ 、
LINUX/UNIX/AIX
UNIX提供这种独有的能力,使一个打开文件描述符可用做两个(或多个)独立文件描述符。此外,我们可能选取一个打开文件描述符,并使它对某个特定文件单元号可用(假若该号还未用)
dup(2)和dup2(2)函数的句法如下:
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
在dup(2)的情形,成功时返回文件描述符是当前进程中可用的最低未用文件单元号。然而,对于dup2(2),在参数newfd中指定新的文件描述符值。当dup2(2)成功返回时,return值应与newfd匹配
提示:
在某些UNIX平台上,dup(2)和dup2(2)调用可能返回错误EINTR(在SGI的IRIX6.5中说明)
有一种情况,dup(2)在其中是有帮助的,就是在打开FILE流以利用现有的套接口时。下例取得套接口s并创建输入流rx及另一个用于写的tx流:
int s; /*open socket*/
FILE *rx; /*read stream*/
FILE *tx; /*write steam*/
...
rx=fdopen(s,"r"); /*open stream for reading on s*/
tx=fdopen(dup(s),"w"); /*open stream for writing on s*/
这里dup(2)调用之所以必要,是因为为了以后关闭rx流而进行调用ffclose(3)时,它也关闭文件描述符(套接口)s. dup(2)调用保证tx流将具有自己要使用的文件描述符,而不管流rx是否仍然打开着。
如果从例子中省略了dup(2),当对tx调用fclose(3)时,tx的缓冲匹中保存的最后数据将不能写到套接口(假定rx已被关闭了)。原因是下层文件描述符已被关闭。dup(2)调用可以解决另外一个伤脑筋的问题。