Chinaunix首页 | 论坛 | 博客
  • 博客访问: 73530
  • 博文数量: 30
  • 博客积分: 2133
  • 博客等级: 大尉
  • 技术积分: 320
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-12 13:33
个人简介

aaa

文章分类
文章存档

2010年(30)

我的朋友
最近访客

分类: LINUX

2010-04-12 15:15:59

dup 和 dup2 都可以用来复制一个现存的文件描述符。经常用来重新定向进程的 STDIN, STDOUT, STDERR。

 

dup 函数 

dup 函数定义在 中,函数原形为:

int  dup ( int filedes ) ;

函数返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝,若出错则返回 -1。由dup返回的新文件描述符一定是当前可用文件描述符中的最小数值。这函数返回的新文件描述符与参数 filedes 共享同一个文件数据结构。

 

使用例子: 

#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!!\n");
        
return 0;
    }

    
int nfd= dup( fd );
    
if( nfd< 0 ){
        printf("Error!!\n");
        
return 0;
    }

    
char buf[1000];
    
int  n;

    
while( (n= read( STDIN_FILENO, buf, 1000 ))> 0 )
      
if( write( nfd, buf, n )!= n ){
          printf("Write Error!!\n");
          
return 0;
      }

    
return 0;
}

 

上面代码中,nfd 拷贝了 fd,所以 write ( nfd, buf, n ) 这语句写到 nfd 所代表的文件时也就是写到 fd 所代表的文件。程序执行完后可以在相应的目录的 data.dat 看到输出。

 

dup2 函数 

dup2 函数定义在 中,函数原形为:

int dup2(  int filedes,  int filedes2 ) 
同样,函数返回一个新的文件描述符,若出错则返回 -1。与 dup 不同的是,dup2 可以用 filedes2 参数指定新描述符的数值。如果 filedes2 已经打开,则先将其关闭。如若 filedes 等于 filedes2 , 则 dup2 返回 filedes2 , 而不关闭它。同样,返回的新文件描述符与参数 filedes 共享同一个文件数据结构。

使用例子:

#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!!\n");
        
return 0;
    }

    
int nfd= dup2( fd, STDOUT_FILENO );
    
if( nfd< 0 ){
        printf(
"Error!!\n");
        
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!!\n");
          
return 0;
      }

    
return 0;
}

 

阅读(730) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~