dup() 和 dup2() http://blog.163.com/crosslandy@126/blog/static/12798713420119710598844/

dup() 和 dup2()  

2011-10-07 11:06:31|  分类: Linux学习心得 |  标签:dup  dup2  linux  c  |举报|字号 订阅

下载LOFTER客户端
dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。

#include <unistd.h>
int dup(int newfd);
int dup2(int newfd, int oldfd);
      
下面用一个简单的例子解释两个函数的用法和区别:
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 int main(void)
 {
     int fd, save_fd;
     char msg[] = "This is a test of dup() & dup2()\n";
     int test;
     fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
     if(fd<0) {
         perror("open");
         exit(1);
     }
     save_fd = dup(STDOUT_FILENO);                        //运行后save_fd指向STDOUT——FILENO,即save_fd指向标准输出
     printf("save_fd=%d\n",save_fd);                             //测试用
     test=dup2(fd, STDOUT_FILENO);                         //运行后STDOUT_FILENO指向fd所指向的文件,即
STDOUT_FILENO指向somefile
     printf("dup2_1=%d\n",test);                                   //测试用 此时的标准输出不再指向显示器,因此该段测试将写入somefile文件中
     close(fd);
     write(STDOUT_FILENO, msg, strlen(msg));           //此时STDOUT_FILENO所指向的是somefile文件不再是标准输出流,因此
该段将
                                                                              //写入somefile文件中

     test=dup2(save_fd, STDOUT_FILENO);                 //运行后STDOUT_FILENO指向save_fd所指向的文件,即标准输出流
     printf("dup2_2=%d\n",test);                                  //测试用 此时标准输出流重新指回显示器,因此该段测试将写入显示器
     write(STDOUT_FILENO, msg, strlen(msg));           //此时STDOUT_FILENO所指向的便回标准输出流该段将写入显示器
     close(save_fd);
     return 0;
 }
该程序运行后显示器上显示的内容为:
[crosslandy@localhost PIPE]$ ./dup_example 
save_fd=4
dup2_2=1
This is a test
somefile文件内的内容为:
dup2_1=1
This is a test


注:本例子转自他人

你可能感兴趣的:(dup() 和 dup2() http://blog.163.com/crosslandy@126/blog/static/12798713420119710598844/)