UNIX提供這種獨有的能力,使一個打開文件描述符可用做兩個(或多個)獨立文件描述符。此外,我們可能選取一個打開文件描述符,并使它對某個特定文件單元號可用(假若該號還未用)
dup(2)和dup2(2)函數(shù)的句法如下:
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
在dup(2)的情形,成功時返回文件描述符是當前進程中可用的最低未用文件單元號。然而,對于dup2(2),在參數(shù)newfd中指定新的文件描述符值。當dup2(2)成功返回時,return值應與newfd匹配
提示:
在某些UNIX平臺上,dup(2)和dup2(2)調(diào)用可能返回錯誤EINTR(在SGI的IRIX6.5中說明)
有一種情況,dup(2)在其中是有幫助的,就是在打開FILE流以利用現(xiàn)有的套接口時。下例取得套接口s并創(chuàng)建輸入流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)調(diào)用之所以必要,是因為為了以后關閉rx流而進行調(diào)用ffclose(3)時,它也關閉文件描述符(套接口)s. dup(2)調(diào)用保證tx流將具有自己要使用的文件描述符,而不管流rx是否仍然打開著。
如果從例子中省略了dup(2),當對tx調(diào)用fclose(3)時,tx的緩沖匹中保存的最后數(shù)據(jù)將不能寫到套接口(假定rx已被關閉了)。原因是下層文件描述符已被關閉。dup(2)調(diào)用可以解決另外一個傷腦筋的問題。