2928|0

241

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

Helper2416-32——Linux_Programing——输入输出重定向 [复制链接]

本帖最后由 yuanlai2010 于 2014-8-12 12:15 编辑

输入输出重定向
参与Helper2416开发板助学计划心得

常在命令行中我们可以通过”>”运算符把标准输出重定向到文件:


如前面文件编程中所提到的,标准输出是三大默认的数据流.他们在程序运行时就会被打开,在进程中,文件描述符与数据流是相互对应的,他的对应关系就记录在文件描述表中,如下图所示:
  
#
  
数据流
0
标准输入(键盘)
1
标准输出(屏幕)
2
标准错误(屏幕)
3
msg.txt文件


那么我们要如何在自己的程序中使用重定向呢?
从上图来看,只要修改文件描述符表中的对应关系,替换数据流,就可以轻松的完成重定向的工作,.
从前面的文件编程中可以知道,描述符表的前三项是固定不变的..即:
0à标准输入
1à标准输出
2à标准错误
那么要完成输出重定向,就是让文件描述符1指向其他的数据流。

我们需要知道需要重定向到数据流的文件描述,如果我们是使用open系统调用打开文件,则直接返回的就是与文件相对应的文件描述符,但是如果是使用标准库函数fopen打开的文件的话,就还需要如下这条函数来获取数据流的描述符:

fileno()返回文件描述符
函数原型: int _fileno( FILE *stream );
函数功能: fileno()用来取得参数stream指定的文件流所使用的文件描述符
函数返回: 某个数据流的文件描述符
参数说明: stream指定文件流
所属文件:


已经获取到了文件描述符了,接下来就是修改文件描述符表中的对应关系了,可以通过以下系统调用改变对应关系:

dup2()复制数据流
函数原型: int dup2(int oldhandle,int newhandle);
函数功能: 复制文件描述符,实现通过多个文件描述符访问同一文件
函数返回: 成功返回0
参数说明: oldhandle指定当前的文件描述符,newhandle指定新的文件描述符用于访问oldhandle所指定的文件。
所属文件:


接下来通过实验验证是否重定向成功:
内容:把printf函数打印出的内容重定向到文件msg.txt.
实验代码:
  1. #include <unistd.h>     // include dup2()
  2. #include <stdio.h>      // include printf()/fprintf()/fopen()
  3. #include <stdlib.h>     // include exit()
  4. #include <errno.h>      // include errno
  5. #include <string.h>     // include strerror()

  6. void error(char *msg)
  7. {
  8.         fprintf(stderr, "%s: %s\n",msg,strerror(errno));
  9.         exit(1);
  10. }

  11. int main()
  12. {
  13.         int filedes;
  14.         FILE *fp = fopen("msg.txt", "w");
  15.         if(!fp){
  16.                 error("Can't open msg.txt !\n");
  17.         }
  18.         filedes = fileno(fp);
  19.         dup2(filedes, 1);

  20.         printf("hello world !\n");
  21.                
  22.                 return 0;
  23. }
复制代码
运行结果:
  
#
  
数据流
0
标准输入(键盘)
1
标准输出(msg.txt文件)
2
标准错误(屏幕)
3
msg.txt文件
  1. [Linux@CentOS dup]$ gcc dup.c -o dup
  2. [Linux@CentOS dup]$ ./dup
  3. [Linux@CentOS dup]$ ls
  4. dup  dup.c  msg.txt
  5. [Linux@CentOS dup]$ cat msg.txt
  6. hello world !
  7. [Linux@CentOS dup]$
复制代码


实验结果表示重定向成功,我们不仅可以重定向标准输入输出,还可以按照自己的需求,自由的重定向任意数据流,实现原理都是一样的。
论坛ID:yuanlai2010
发表时间:2014-08-12



赞赏

1

查看全部赞赏

点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表