dup() 和 dup2()

2011-10-07 11:06:31|  分类: Linux学习心得 |字号 订阅

 
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

注:本例子转自他人

最新文章

  1. 开发者最爱的Firebug停止更新和维护
  2. 动手实践 Linux VLAN - 每天5分钟玩转 OpenStack(13)
  3. UDP的使用
  4. leetcode 74. Search a 2D Matrix
  5. oracle with as 用法
  6. 拓扑编号 vijos1790
  7. matlab中meshgrid函数的用法
  8. web.xml配置文件 taglib
  9. Spring: DispacherServlet和ContextLoaderListener中的WebApplicationContext的关系
  10. 深入理解ob_flush和flush的区别(转)
  11. 打造自己个性的notepad ++
  12. socket 通信之select
  13. css3: css3选择器
  14. leetcode — valid-palindrome
  15. dubbo远程方法调用的基本原理
  16. SQL 加载
  17. VS2012 安装番茄插件
  18. 基于Kafka消息驱动最终一致事务(一)
  19. (转阮一峰)深入理解OAuth 2.0
  20. SparkR(R on Spark)编程指南 含 dataframe操作

热门文章

  1. BZOJ - 1003 DP+最短路
  2. tp5.0
  3. Oracle子分区(sub partition)操作
  4. MongoDB复杂查询语句记录
  5. JS如何获取屏幕、浏览器及网页高度宽度?
  6. win10 sshsecureshellclient删除profile保存的信息
  7. CentOS6 克 隆
  8. DNS服务器设置
  9. python作业1.1,编写登录模块
  10. bzoj 5340: [Ctsc2018]假面