`
fanrey
  • 浏览: 251981 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dup和dup2

 
阅读更多
名称::
dup/dup2

目标:
复制一个现存的文件描述符.

头文件:
#include <unistd.h>

函数原形:
int dup(int oldfd)

int dup2(int oldfd,int newfd)

参数:
oldfd    原有文件描述符

newfd   新的文件描述符

返回值:
-1      遇到错误

int      新文件描述符




  系统调用dup是用来复制一个文件描述符,也就是将进程u区的文件描述符表中的一项复制一份,使得这两项同时指向系统稳健表的同一表项。

  系统调用dup复制由参数oldfd指定的文件描述到进程文件描述符表的第一个空表项处。而系统调用dup2复制由参数oldfd指定的文件描述到参数newfd指定的文件描述符表项处。老的文件描述符和新复制的文件描述符可以互换使用。它们共享锁、文件指针和文件状态。例如,对其中一个文件描述符使用系统调用lseek修改文件指针的位置,对另一文件描述符来说文件指针也改变了,其实我们了解了内核的工作原理,这一点很容易理解。因为我们知道,文件指针是放在系统文件表中的。但这两个文件描述符具有不同的close-on-exec标志,因为该标志是存放在文件描述符表中的。

  该调用成功时,返回值为新的描述符;错误时,返回-1,并设置相应的错误代码errno:

EBADF:参数oldfd不是一个已经打开的文件描述符;或者参数newfd超出允许的文件描述符的取值范围。
EMFILE:进程打开的文件描述符数量已经到达最大值,但仍然企图打开新的文件描述符。
  下面我们来看一个简单的例子。在这个例子中,我们将标准输出(文件描述符为1)关闭,并将一个打开了普通文件“output”的文件描述符复制到标准输出上,因为刚关闭了文件描述符1,所以,文件描述符表的第一个空表项是1。所以,程序以后的printf等向标准输出写的内容都写到了文件中。

利用这个功能我们可以把输出/输入重定向到文件中。下面是一个例子。





#include <stdio.h>

#include <unistd.h>

#include <systypes.h>

#include <sys/stat.h>

#include <string.h>

#include <errno.h>

#include <fcntl.h>



main(int argc,char *argv[])
{
      int fd;
      if ((fd=open(argv[1],O_CREAT|O_RDWR,0644))==-1)
            printf("cannot open output file ");


     close(1);     

       if(dup(fd)==-1);
          perror(“error”);

close(fd);
      printf("This line will write to file ");
}

  该程序执行过程的屏幕拷贝:

      [wap@wapgw /tmp]$ gcc -o 1_5 1_5.c
      [wap@wapgw /tmp]$ ./1_5 test1
      [wap@wapgw /tmp]$ more test1
      This line will write to file






dup2的功能和dup基本相同,只不过是dup2复制oldfd到newfd上。下面是用dup2实现同样的例子。





#include <stdio.h>

#include <unistd.h>

#include <systypes.h>

#include <sys/stat.h>

#include <string.h>

#include <errno.h>

#include <fcntl.h>



main(int argc,char *argv[])

{

int fd;

if((fd=open(argv[1],O_WRONLY|O_CREAT,0644))==-1)

    perror(“error”);

close(1);

if(dup2(fd,1)==-1)

    perror(“error”);

close(fd);

printf(“This line will write to file \n”);

close(fd);



}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics