dup 函數(shù)
dup 函數(shù)定義在 <unistd.h> 中,函數(shù)原形為:
int dup ( int filedes ) ;
函數(shù)返回一個(gè)新的描述符,這個(gè)新的描述符是傳給它的描述符的拷貝,若出錯(cuò)則返回 -1。由dup返回的新文件描述符一定是當(dāng)前可用文件描述符中的最小數(shù)值。這函數(shù)返回的新文件描述符與參數(shù) filedes 共享同一個(gè)文件數(shù)據(jù)結(jié)構(gòu)。
使用例子:
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main( int argc, char* argv[] ){
int fd= open( "/home/darren/data.dat", O_CREAT| O_RDWR| O_TRUNC, S_IRUSR| S_IWUSR );
if( fd< 0 ){
printf("Open Error!!");
return 0;
}
int nfd= dup( fd );
if( nfd< 0 ){
printf("Error!!");
return 0;
}
char buf[1000];
int n;
while( (n= read( STDIN_FILENO, buf, 1000 ))> 0 )
if( write( nfd, buf, n )!= n ){
printf("Write Error!!");
return 0;
}
return 0;
}
上面代碼中,nfd 拷貝了 fd,所以 write ( nfd, buf, n ) 這語句寫到 nfd 所代表的文件時(shí)也就是寫到 fd 所代表的文件。程序執(zhí)行完后可以在相應(yīng)的目錄的 data.dat 看到輸出。
dup2 函數(shù)
dup2 函數(shù)定義在 <unistd.h> 中,函數(shù)原形為:
int dup2( int filedes, int filedes2 )
同樣,函數(shù)返回一個(gè)新的文件描述符,若出錯(cuò)則返回 -1。與 dup 不同的是,dup2 可以用 filedes2 參數(shù)指定新描述符的數(shù)值。如果 filedes2 已經(jīng)打開,則先將其關(guān)閉。如若 filedes 等于 filedes2 , 則 dup2 返回 filedes2 , 而不關(guān)閉它。同樣,返回的新文件描述符與參數(shù) filedes 共享同一個(gè)文件數(shù)據(jù)結(jié)構(gòu)。
使用例子:
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main( int argc, char* argv[] ){
int fd= open( "/home/darren/data.dat", O_CREAT| O_RDWR| O_TRUNC, S_IRUSR| S_IWUSR );
if( fd< 0 ){
printf("Open Error!!");
return 0;
}
int nfd= dup2( fd, STDOUT_FILENO );
if( nfd< 0 ){
printf("Error!!");
return 0;
}
char buf[1000];
int n;
while( (n= read( STDIN_FILENO, buf, 1000 ))> 0 )
if( write( STDOUT_FILENO, buf, n )!= n ){
printf("Write Error!!");
return 0;
}
return 0;
}