在前一面一篇《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内部了。
执行结果:
gaolu@gaolu-desktop:~$ gcc -o dup2.o systemcall2.c
gaolu@gaolu-desktop:~$ ./dup2.o
gaolu@gaolu-desktop:~$ cat my.file
HELLOgaolu@gaolu-desktop:~$

转载于:https://blog.51cto.com/keren/170892

重定向dup2的本质相关推荐

  1. 描述符重定向dup2

    函数原型: #include <unistd.h> int dup2(int oldfd, int newfd); 函数功能描述: 将描述符newfd重定向到oldfd 下面是一个demo ...

  2. 基础IO-文件描述符,重定向

    目录 1.文件描述符fd 1.1  0 & 1 & 2 1.2文件描述符的分配规则 2.重定向 2.1原理 2.2使用dup2系统调用 1.文件描述符fd 1.1  0 & 1 ...

  3. java 请求转发_javaweb之请求的转发和重定向

    1.什么是请求转发和请求重定向? 请求转发: xxServlet收到请求,然后直接转发给yyServlet,然后yyServlet返回给客户端.整个过程中,客户端发出一个请求,收到一个响应. 重定向: ...

  4. Android 启动分析 1

    1.概述 Android虽然被称作一种操作系统,其实它仍然使用的Linux的kernel.所以本质上可以说,Android是一个适用于移动设备的Linux发行版.也就是说,之前的分析Linux内核的经 ...

  5. Linux编程(10)_进程通信

    1 进程通信相关概念 1 什么是IPC 进程间通信, InterProcess Communication 2 进程间通信常用几种方式 管道 (使用最简单) 信号 (开销最小) 共享内存/映射区 (无 ...

  6. Linux系统进阶-基础IO

    Linux系统进阶-基础IO 文章目录 Linux系统进阶-基础IO C语言中的文件接口 对文件进行写入 对文件进行读取 什么是当前路径 默认打开的三个流 stdout & stderr 系统 ...

  7. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  8. 13 Linux下的基础IO

    不同操作系统所暴露出的接口是不同的,因此Linux下的一些系统调用接口是无法移植到Windows下的. 文章目录 一.C语言中的文件接口 二.系统文件I/O 2.1.系统调用接口 open 2.2.文 ...

  9. 不仅仅是程序本身——基础IO

    关键字:C语言文件接口,系统调用文件接口,文件描述符,重定向,静态库与动态库,软链接与硬链接. 目录 基础IO C语言文件接口 系统调用文件接口 open write read lseek close ...

最新文章

  1. 作文计算机使用有什么问题,关于电脑利弊的作文
  2. oracle定时器每天下午6点_周五下午6点到8点 万盛经开区党工委书记、管委会主任袁光灿直播带货...
  3. 队列的C语言实现(通过内核链表)
  4. vba基本操作 -- 表单操作
  5. html多行文本框_前端面试集锦 HTML篇
  6. 什么是Gut–Skin Axis
  7. PHP扩展开发(3)-config.m4
  8. java thread 线程销毁_手把手带你了解Java线程的实现方式及生命周期原理
  9. 深入理解Java中四种创建对象的方式
  10. 按位与、或、异或等运算方法(转)
  11. jQuery第六章课后作业
  12. iOS【UIDynamic重力、弹性碰撞吸附等现象】
  13. 全球资本市场竞争力指数排名发布,中国跃居第五
  14. python3版本升级_python版本升级到3.7
  15. java中八种基本类型及默认值(2015年9月22日)
  16. 免费支持顺丰、四通一达、EMS等快递物流单号查询的开放接口?
  17. Web前端开发工程师--面试要求
  18. 大数据编程语言培训前景,怎么样?
  19. 逻辑门内部电路原理(与或非门)
  20. 系统集成项目管理 : 挣值管理(PV、EV、AC、SV、CV、SPI、CPI、VAC、BAC、ETC、EAC、)公式全集

热门文章

  1. java轴_JAVA2D:翻译轴
  2. php 递归实现无限极分类和排序_PHP无限级分类实现层级值间用字符串拼接
  3. spring boot和spring cloud的区别_Spring聊聊application和bootstrap
  4. 解决iIntelliJ IDEA导入jstl后,jsp中taglib指令无法自动添加uri地址
  5. java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
  6. 一道面试题引发的对JavaScript类型转换的思考
  7. Mybatis的ResultMap的使用
  8. Hadoop pipes编程
  9. 程序员面试题精选100题(37)-寻找丑数[算法]
  10. Coursera课程Python for everyone:Quiz: Single-Table SQL