Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

复制文件描述符

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)调用可以解决另外一个伤脑筋的问题。
 

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理