Posted on 2009-08-24 10:01
Prayer 閱讀(832)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
C/C++ 、
LINUX/UNIX/AIX
UNIX提供這種獨(dú)有的能力,使一個(gè)打開(kāi)文件描述符可用做兩個(gè)(或多個(gè))獨(dú)立文件描述符。此外,我們可能選取一個(gè)打開(kāi)文件描述符,并使它對(duì)某個(gè)特定文件單元號(hào)可用(假若該號(hào)還未用)
dup(2)和dup2(2)函數(shù)的句法如下:
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
在dup(2)的情形,成功時(shí)返回文件描述符是當(dāng)前進(jìn)程中可用的最低未用文件單元號(hào)。然而,對(duì)于dup2(2),在參數(shù)newfd中指定新的文件描述符值。當(dāng)dup2(2)成功返回時(shí),return值應(yīng)與newfd匹配
提示:
在某些UNIX平臺(tái)上,dup(2)和dup2(2)調(diào)用可能返回錯(cuò)誤EINTR(在SGI的IRIX6.5中說(shuō)明)
有一種情況,dup(2)在其中是有幫助的,就是在打開(kāi)FILE流以利用現(xiàn)有的套接口時(shí)。下例取得套接口s并創(chuàng)建輸入流rx及另一個(gè)用于寫(xiě)的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)調(diào)用之所以必要,是因?yàn)闉榱艘院箨P(guān)閉rx流而進(jìn)行調(diào)用ffclose(3)時(shí),它也關(guān)閉文件描述符(套接口)s. dup(2)調(diào)用保證tx流將具有自己要使用的文件描述符,而不管流rx是否仍然打開(kāi)著。
如果從例子中省略了dup(2),當(dāng)對(duì)tx調(diào)用fclose(3)時(shí),tx的緩沖匹中保存的最后數(shù)據(jù)將不能寫(xiě)到套接口(假定rx已被關(guān)閉了)。原因是下層文件描述符已被關(guān)閉。dup(2)調(diào)用可以解決另外一個(gè)傷腦筋的問(wèn)題。