dup() 和 dup2()函数的介绍

转载 2013年12月05日 18:51:08

dup() 和 dup2()  

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

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

相关文章推荐

up与dup2函数介绍----转载

up与dup2函数介绍----转载 dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这两个函数...
  • jsyao
  • jsyao
  • 2012年08月16日 23:16
  • 587

写一个与dup2()功能相同的函数

//用dup()来返回文件描述符,直到符合要求的为止,最后再把不符合要求的关闭 //2013年 06月 19日 星期三 06:23:38 HKT //当输入的描述符是负的或者已超过MAX_OPEN时,...

实现dup2功能相同的函数

自行实现dup2的功能。函数原型:int mydup2(int fd, int fd2),思路如下: 1.fd2小于0,直接返回错误; 2.如果fd是有效的文件描述符且等于fd2,直接返回fd2;...

重写dup2函数

在unix环境高级编程的第三章中有一道题目是这样的:重写dup2函数,不能使用fnctl函数,要有规范的容错处理 刚开始没有什么思路,后来在网上查了一下,发现大多数的处理都是,一直调用dup直到得到...

文件描述符存在形式及其dup2函数的使用

最近写myshell的时候,用到了dup2这个函数,函数的形式看着很简单,但是当时就是很不理这么用的意义在哪里,不知道它具体是怎么实现重定向输入输出的。后来上网查了很多资料,从文件描述符开始来了解,想...

UNIX重定向--dup(2)函数

用同一个open()打开的文件可以有多个描述字与它相连,这种描述字称为重复描述字。重复一个描述字有两种方法:用函数dup()或dup2(),或用函数fcntl()。 #include int d...

3.12 dup2函数-文件描述符复制

dup2函数用于复制一个现存的文件描述符,函数原型如下: #include int dup2(int filedes, int filedes2); 返回值:若复制成功则返回新文件描述符,若出错...

Unix环境编程 如何实现dup2函数,不允许调用fcntl?

这是unix编程环境第三章的一个题目,前段时间翻了下,发现这个题目还有点小意思,而且网上也没什么全面的答案。 先补充几个概念:   文件描述符:内核(kernel)利用文件描述符(file de...
  • xiaotjx
  • xiaotjx
  • 2012年08月31日 16:59
  • 244

dup2函数

dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id。dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:dup() 和 dup2()函数的介绍
举报原因:
原因补充:

(最多只允许输入30个字)