在前一面一篇《UNIX I/O---再谈文件描述符 》的基础上,学习一下dup2函数。先看下面的代码示例:
 
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc,char* argv[])
{
 int fd;
  fd = open("my.file",O_WRONLY|O_CREAT|O_APPEND,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
 if(fd == -1)
 {
  perror("\nERROR: fail to creat my.file.");
  return -1; 
 }
 
 if(dup2(fd,STDOUT_FILENO) == -1)
 {
  perror("\nERROR: fail to redirect std output.");
  return -1;
 }
 if(close(fd)==-1)
 {
  perror("\nERROR: fail to colse my.file.");
  return -1;
 }
 if(write(STDOUT_FILENO,"HELLO",5)==-1)
 {
  perror("\nERROR: fail to write to file.");
  return -1;
 } 
 return 0;
}
上面一段程序是一个比较简单的创建文件、并将标准输出重定向到文件的例子。
 
(1)open函数打开文件,文件不存在时,根据给定的参数进行文件创建,创建以后再打开。这里open()是操作系统在系统文件表内创建了一个条目,并设置描述符表中的条目[3]。
                                                               图1
(2)dup2函数有2个参数fd1和fd2,如果文件描述符表的fd2条目是打开的,dup2将其关闭,并将条目fd1的指针拷贝到条目fd2中去。dup2执行失败返回-1,并设置ERR NO,执行成功返回被复制的文件描述符。在这里,dup2执行完以后,标准输出就被写入到my.file 里了。
                                                            图3
(3)调用函数close()删除文件my.file额外的文件描述符表条目。执行后的示意图如图.3所示:
此后,想标准输出打印HELLO,并不会看到HELLO的打印信息,而cat my.file显示 my.file的内容,可以看到HELLO。可见标准输出已经被重定向到my.file内部了。
 
 
执行结果: