



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux I/O重定向的原理和实现在Unix系统中,每个进程都有 STDIN、STDOUT和STDERR这3种标准I/O,它们是程序最通用的输入输出方式。几乎所有语言都有相应的标准I/O函数,比如,C语言可以通 过scanf从终端输入字符,通过printf向终端输出字符。熟悉Shell的朋友都知道,我们可以方便地对Shell命令进行I/O重定向,比如 find -name *.java testfile.txt 把当前目录下的Java文件列表重定向到testfile.txt。多数情况下,我们只需要了解I/O重定向的使用就够了,但是如果要编程实现类似Shell的I/O重定向以及管道功能,那么就需要清楚它的原理和实现。下面本文就以Linux系统为具体例子,介绍I/O重定向的原理和实现(文中实验环境为Ubuntu 12.04,内核版本3.2.0-59)。文件描述符表理解I/O重定向的原理需要从Linux内核为进程所维护的关键数据结构入手。对Linux进程来讲,每个打开的文件都是通过文件描述符(File Descriptor)来标识的,内核为每个进程维护了一个文件描述符表,这个表以FD为索引,再进一步指向文件的详细信息。在进程创建时,内核为进程默 认创建了0、1、2三个特殊的FD,这就是STDIN、STDOUT和STDERR,如下图所示意:所谓的I/O重定向也就是让已创建的FD指向其他文件。比如,下面是对STDOUT重定向到testfile.txt前后内核文件描述符表变化的示意图重定向前:重定向后:在I/O重定向的过程中,不变的是FD 0/1/2代表STDIN/STDOUT/STDERR,变化的是文件描述符表中FD 0/1/2对应的具体文件,应用程序只关心前者。本质上这和接口的原理是相通的,通过一个间接层把功能的使用者和提供者解耦。下面我们通过strace命令跟踪一下echo命令的系统调用:dagangubuntu12:$ strace echo hello 2&1 /dev/null | grep writewrite(1, hellon, 6) = 6我们可以看到 write(1, hellon, 6) 这样一个系统调用,它的第一个参数1就是代表的STDOUT的FD,这说明对于echo程序,它只管(通过标准I/O函数从STDOUT)向FD 1写入,而不关心它们FD 1到底对应的是哪个文件。Shell正是通过I/O重定向和管道这种特殊的文件把多个程序的STDIN和STDOUT串联在一起组成更复杂功能的,下面是Shell中通过管道的示意图:下面我们用一个实际的例子来体验一下:dagangubuntu12:$ sleep 30 | sleep 40 &1 5584dagangubuntu12:$ pgrep -l sleep5583 sleep5584 sleepdagangubuntu12:$ ll /proc/5583/fdtotal 0lrwx- 1 dagang dagang 64 Feb 27 13:41 0 - /dev/pts/3l-wx- 1 dagang dagang 64 Feb 27 13:41 1 - pipe:246469lrwx- 1 dagang dagang 64 Feb 27 13:41 2 - /dev/pts/3dagangubuntu12:$ ll /proc/5584/fdtotal 0lr-x- 1 dagang dagang 64 Feb 27 13:41 0 - pipe:246469lrwx- 1 dagang dagang 64 Feb 27 13:41 1 - /dev/pts/3lrwx- 1 dagang dagang 64 Feb 27 13:41 2 - /dev/pts/3上面我们启动了两个进程5583和5584,通过查看/proc/fd,我们看到进程5583的STDOUT和5584的STDIN被重定向到了pipe:246469,这样就达到了连接两个进程标准I/O的目的。dup2()系统调用上面介绍了文件描述符表和I/O重定向的原理,那么在Linux系统中如何通过C程序实现I/O重定向呢?主要用到了dup2()这个系统调用,man中关于dup2是这样说的:int dup2(int oldfd, int newfd);dup2() create a copy of the file descriptor oldfd. After a successful return from dup() or dup2(), the old and new file descriptors may be used interchangeably. They refer to the same open file description (see open(2) and thus share file offset and file status flags; for example, if the file offset is modified by using lseek(2) on one of the descriptors, the offset is also changed for the other.这里我们通过一个实际的问题来说明它的使用方法:编写一个C程序,通过调用sort这个Shell命令进行排序,要求把in.txt和out.txt分别重定向到sort的STDIN,STDOUT。参考实现:int main() int pid = 0; / fork a worker process if (pid = fork() / wait for completion of the child process int status; waitpid(pid, &status, 0); else / open input and output files int fd_in = open(in.txt, O_RDONLY); int fd_out = open(out.txt, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (fd_in 0 & fd_out 0) / redirect STDIN/STDOUT for this process dup2(fd_in, 0); dup2(fd_out, 1); / call shell command system(sort); close(fd_in); close(fd_out); else / . error handling return 0;上面的主要步骤包括:1. 首先fork一个子进程,后续步骤都在子进程中完成,父进程通过waitpid()系统调用等待子进程结束;2. 打开open()系统调用打开in.txt和out.txt,得到它们的描述符(在我的测试中,这两个值通常为3和4);3. 通过dup2()系统调用把STDIN重定向到fd_in,把STDOUT重定向到fd_out(注意,重定向的影响范围是整个子进程);4. 通过system()系统调用运行shell命令sort通过上面的例子我们就了解最基本的I/O重定向的实现方法,接下来,你能否根据这些知识进一步实现出Shell的管道特性呢?总结本文介绍了L
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 关于元宵节作文800字(9篇)
- 孝顺的猴子400字7篇
- 2025至2030中国工业岩盐行业发展趋势分析与未来投资战略咨询研究报告
- 2025至2030中国小型风电行业前景预测及发展趋势预判报告
- 2025至2030中国密封玻璃行业发展趋势分析与未来投资战略咨询研究报告
- 2025至2030中国室外冷却器箱行业发展趋势分析与未来投资战略咨询研究报告
- 2025至2030中国定点跳伞设备行业发展趋势分析与未来投资战略咨询研究报告
- 2025至2030中国安全劳保用品行业市场发展现状及商业模式与投融资战略报告
- 2025至2030中国婴儿防摔蚊帐行业市场运行态势分析及发展前景与投资报告
- 呼吸道传播途径
- 高效化学灭菌技术-洞察及研究
- 融媒体保密管理制度
- 2025江苏扬州宝应县“乡村振兴青年人才”招聘67人笔试参考题库附答案详解
- 2025年河南高考真题化学试题含答案
- 陕西省榆林市2023-2024学年高二下学期期末质量检测政治试卷(含答案)
- 公司廉政纪律管理制度
- 护士文职面试题及答案
- 解剖期末试题题库及答案
- 保密知识竞赛试题及答案
- 【高分复习笔记】胡裕树《现代汉语》(重订本)笔记和课后习题(含考研真题)详解
- 中国未来几年直流电源屏行业市场前景预测及投资价值评估分析报告
评论
0/150
提交评论