重定向和管道的实现

重定向标准输入的实现:
1)close-then-open: close(0) ; fd=open("test",O_RDONLY); fd将是stdin。
2)open-close-dup-close:
fd=open(file),打开stdin将要重定向的文件;close(0);new_fd=dup(file);close(fd);new_fd就是被重定向的stdin
3)open-dup2-close:
fd=open(file);new_fd=dup2(fd,0);close(fd);

重定向标准输出的实现:
  父进程fork();子进程close(1);create("g",0644),此时子进程的stdout被重定向到g;接下来子进程exec某个程序,文件描述符属于进程属性,exec调用不会改变他们,那么运行的程序的标准输出将被送到g,由此实现了标准输出重定向。

本质上重定向的实现是依赖两个原则:
1、标准输入、标准输出和标准错误分别是0、1和2
2、最低可用描述符:打开文件时,为此文件安排的描述符总是进程内打开文件数组的最低可用位置的索引。

管道:
  匿名管道:适合于有亲缘关系的进程,通过pipe函数实现。
  有名管道:通过mkfifo函数实现,实现进程间的双向通讯可以采用两个有名管道实现,也可以采用socketpair调用。

文章转自庄周梦蝶  ,原文发布时间2008-02-29

时间: 2024-10-29 20:38:09

重定向和管道的实现的相关文章

RHCE 学习笔记(4)- 重定向,管道和VIM编辑器

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://beanxyz.blog.51cto.com/5570417/1592526 这一节主要学习了重定向,管道和VIM编辑器 首先看看输出重定向 1 > 或者> 都表示将正确的信息覆盖输出重定向, 1>>或者>>表示追加的重定向 2 > 表示将错误的信息覆盖输出重定向, 2>>表示追加的错误信息重定向 &> 将所有的信息,正确

5个DOS专用文件的6种io重定向(实现管道原理)

1. 重定向 以下a.asm,用含't'及回车13的txt,仿command.com,依masm命令行的arg符号值N,(如masm /Darg=0 a;),重定向5个DOS开启文件(STD_): N=0:是STDIN句柄,先bin方式读1符,再从txt输't'到charN=1:是STDOUT句柄,输出char的'1'到txtN=2:是STDERR句柄,输出char的'2'到txt N=30,31:3是STDAUX句柄,N=30,从txt输't'到char;N=31,输出char的'3'到txt

SHELL重定向和管道的实现

原文链接 I have been always fascinated about the design of UNIX. I am still curious and enjoy the philosophy and the idea of 'Write programs that do one thing and do it well'. Aim of this blog post is to walk through some interesting aspects on implement

linux数据流重定向和管道

1.标准输入.输出.错误 在执行一个指令的时候,这个指令可能会由文件读入资料,然后经过处理,再将数据输出到屏幕上.一般来说,要执行一个指令,其流程是这样的: 1.标准输入(stdin):代码为0,使用< 或 <<  2. 标准输出(stdout):代码为1,使用>或>> 3.标准错误输出(stderr):代码为2,使用2>或2>> 例如,我们想把/目录下的所有文件用:ls -l 命令列出,但是不显示在桌面,而是显示在一个新建的文件里,我们可以执行如下命

Linux入门基础(九) 管道及重定向

不要重复发明轮子 开源文化的核心理念之一就是不要重复发明轮子,很多开源软件都是现有软件,代码和功能的重新组合,就好像通过零件装配机器一样,源代码的开放和共享让这成为了可能,同时也大大提高了效率和生产率. 管道和重定向 在Linux系统中,大多数命令都很简单,很少出现复杂功能的命令,每个命令往往只实现和一个或几个很简单的功能,我们可以通过将不同功能的命令组合在一起使用,以达到某个复杂功能的目的. 在Linux中,几乎所有命令返回数据都是纯文本的(与因为命令都是运行在CLI下),而纯文本形式的数据又

管道通信-dup2重定向了stdin之后怎么才能重现获取键盘输入呢?有代码!

问题描述 dup2重定向了stdin之后怎么才能重现获取键盘输入呢?有代码! 大神看下我p1的进程里有2个scanf加上dup2(fp1[0],STDOUT_FILENO);之后~第2个scanf就失效了...这是为啥呢? 解决方案 dup2(old,new).你标题是重定向stdin,而你的代码是重定向了管道

linux shell 管道命令(pipe)使用及与shell重定向区别_linux shell

看了前面一节:linux shell数据重定向(输入重定向与输出重定向)详细分析 估计还有一些朋友是头晕晕的,好复杂的重定向了.这次我们看下管道命令了.shell管道,可以说用法就简单多了. 管道命令操作符是:"|",它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandard error 信息没有直接处理能力.然后,传递给下一个命令,作为标准的输入 standard input. 管道命令使用说明: 先看下下面图: comma

Shell学习笔记---重定向输入、输出(原创)

声明:本文仅作学习研究使用,多数语句都是为了介绍语法而构造的. 重定向输入.输出示例$cat         #cat把键盘看作标准输入,屏幕看作标准输出.按下CTRL+D结束键盘输入 $cat > sample.txt $cat /dev/null > /var/log/messages $cat  /etc/profile  >   /var/log/messages $cat  /etc/profile  >>  /var/log/messages     #在文件/v

管道 PIPE

没错,就讲大家可能天天会用的"管道 | ",前者的输出是后者的输入.这里简单要提一点大家可能忽略了的一个有趣事实是,后者不用得到前者执行完毕才启动.更有趣的是,只要后者获取了足够的数据,前者便会停止执行. grep 'colin' bigfile.txt | head 故而当 grep 在给定文件中找到含有给定字符串的 10行文字后,即可功成身退,因为那是 head 的全部所需.加入没有管道机制,那就只能这样: grep 'colin' bigfile.txt > tmpfile