近期,通过实现shell了解了输入重定向,输出重定向,管道-

用自己的话总结定义:

输入重定向:把<右边的文件的内容输入到<左边的命令中。

输出重定向:把运行>左边命令得出的结果输入到>右边的文件中。

(若以>输出到一个已经存在的文件中,那么文件就会被覆盖掉,如果想追加内容而不想删除原来文件的内容则可以用'>>')

管道命令:a|b,a和b分别是两个命令,执行a命令后得到的结果可以被b接受,b命令继续对结果进行相应的处理。

实现方法:

(输入重定向)

if(pid == 0)             {                 if(!(find_command(arg[0])))                 {                     printf("%s:command not found",arg[i]);                     exit(0);                 }                fd=open(file,O_RDONLY);                 dup2(fd,0);                                                        execvp(arg[0],arg);                 exit(0);             }

(输出重定向)

if(pid == 0)             {                 if(!(find_command(arg[0])))                 {                     printf("%s:command not found",arg[i]);                     exit(0);                 }                、 fd=open(file,O_RDONLY);                     dup2(fd,0);                                                             execvp(arg[0],arg);                     exit(0);             }

输入重定向和输出重定向

输入重定向和输出重定向的方法很相似,主要都是运用了dup2()这个函数:

dup2( int oldfd , int newfd )

dup2可以用参数newfd指定新文件描述符的数值,dup2调用成功,返回新的描述符。

(文件描述符0代表标准输入文件,一般就是键盘;  文件描述符1代表标准输出文件,一般是显示器;  文件描述符2代表标准错误输出,一般也指显示器 )

dup2(fd,1)的意思就是把文件描述符替换为1,因为执行命令得到的结果是会向名为1的输出流中输出得到的结果,现在将文件描述符的数值变为1,执行命令后自然就会将结果输入到文件中了。

dup2(fd,0)同理,将文件符的值变为0,命令会从名为0的输入流中读取信息。

(管道命令)

if(pid == 0)             {                 int pid2;                 int status2;                 int fd2;                 if((pid2 =fork()) < 0)                 {                    printf("fork2 error\n");                     return;                 }                 else if(pid2 == 0)                 {                     if(!(find_command(arg[0])))                     {                        printf("%s :command not found\n",arg[0]);                         exit(0);                     }                     fd2 = open("/tmp/youdonotknowfile",O_WRONLY|O_CREAT|O_TRUNC,0644);  //创建临时文件保存管道符前面的操作                     dup2(fd2,1);                                                                            execvp(arg[0],arg);                                                                      exit(0);                 }         、        if(waitpid(pid2,&status2,0) == -1)                                                                          //确保管道符前的操作先执行完成                 printf("please wait process error\n");
                if(!(find_command(arg[i])))                {                     printf("%s :command not found\n",arg[0]);                     exit(0);               }                 fd2 = open("/tmp/youdonotknowfile",O_WRONLY|O_CREAT|O_TRUNC,0644);

dup2(fd2,0);                execvp(argnext[0],argnext);                 if(remove("/tmp/youdonotknowfile"))                 printf("remove error\n");                 exit(0);         }

其实管道命令的实现方法也很简单,也运用了输入输出重定向

实现的方法就是将|左边的命令执行的结果保存至文件中,在运行|右边的命令时将再将刚刚文件中的内容传入|右边的命令去执行。

转载于:https://www.cnblogs.com/fqnb001/p/8793057.html

输入重定向,输出重定向,管道相关内容及实现方法相关推荐

  1. 如何使cmd的输入和输出重定向到管道中(用这种方法可以将指令写入cmd并抓取输出)

    / //                                                                                      // //      ...

  2. Linux笔记之浅析linux重定向——输出重定向与输入重定向

    重定向 大多数 UNIX 系统命令从你的终端接受输入,并将所产生的输出发送回到您的终端. 一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端. 同样,一个命令通常将其输出写入到标 ...

  3. java二维数组从键盘更改_互换二维数组的行列。要求数组的行数、列数以及各元素均从键盘输入;输出互换前数组内容和互换后数组内容。(要求循环输入进行测试)Java...

    1. 互换二维数组的行列.要求数组的行数.列数以及各元素均从键盘输入:输出互换前数组内容和互换后数组内容.(要求循环输入进行测试) package com.mingrisoft; import jav ...

  4. 22、输入和输出重定向,管道,命令连接符,命令替换符

    2019独角兽企业重金招聘Python工程师标准>>> (一)输入/输出重定向 标准输入--standard input:从键盘上输入 标准输出--standard output:在 ...

  5. edittext怎么输入默认内容覆盖_Linux Shell 输入与输出重定向

    UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端. 一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端,同样,一个命令通常将其输出写入到标准输出. 参数说 ...

  6. 【Linux】重定向(输入重定向 | 输出重定向)

    摘要 为了有效地让 Linux 程序协同工作,我们需要对命令输入输出进行重定向(Redirection),并将一个命令的输出通过管道(Pipes)连接到另一个程序的输入.本文将介绍如何在 Linux ...

  7. linux 输入、输出重定向的概念和用法详解(Day01)

    介绍重定向之前先来介绍几个重要的概念:(笔记不易---- 转载请注明出处) 1.linux 的标准输入与输出  linux标准输入设备指的是键盘,标准输出设备指的是显示器,标准错误输出指的是显示器. ...

  8. linux路由相关函数,Linux 路由 学习笔记 之十一 输入、输出路由查找相关的接口函数...

    对于路由功能模块的学习,也已经很长时间了.关于路由项的创建与查找.策略规则相关的创建与查找.路由缓存的创建与查找,都是分开来分析的,没有说明这些模块是如何配合使用的,以及模块之间的联系.本节就分析一下 ...

  9. 【shell】linux输出重定向|输出重定向2>1

    目录 即看即用 详细 知识铺垫 说明 [shell]输出重定向2>&1 即看即用 标准输出: ls thereisno 1> out.txt  标准输出重定向  也可以不加1写成 ...

最新文章

  1. python实战演练_python实战演练(三)购物车程序
  2. Redis 高负载排查记录
  3. 微生物生态学中的挑战:建立对于群落功能与动态的预测性认识
  4. 无盘服务器pnp,深入解读无盘PNP方法,无盘系统PNP并不神秘
  5. 【错误记录】Android 编译时技术版本警告 ( 注解处理器与主应用支持的 Java 版本不匹配 )
  6. 好好学python·函数进阶(递归函数,回调函数,闭包函数,匿名函数,迭代器)
  7. 瞬间几千次的重复提交,我用 Spring Boot + Redis 扛住了!
  8. [C/C++]C++标准
  9. (计算机组成原理)第五章中央处理器-第三节2:CPU专用数据通路
  10. [LeetCode]题解(python):012-Integer to Roman
  11. mysql 查询 int类型日期转换成datetime类型
  12. 《你的灯亮着吗》开始解决问题前,得先知道“真问题”是什么
  13. Prolog入门教程
  14. 这些好用的跨境电商插件,你都听说几个?
  15. 分布式技术一周技术动态 2016-10-09
  16. 三分钟读懂什么是动作捕捉
  17. hihocoder 第三周
  18. 高中毕业学计算机编码,高中毕业证书编号规则
  19. leetcode709. 转换成小写字母 最秀狼人做法(比狠多一点)
  20. mysql不区分大小写配置

热门文章

  1. 二部图最大权匹配_12,百度竞价推广账户搭建,关键词匹配-网络运营文字版
  2. pythontype函数使用_基础教程:python isinstance与type函数用法
  3. Java数组传参sql_Java中如何传一个数组作为筛选条件操作数据库(sql中foreach的使用)...
  4. 窗帘效果图css,vuejs、微信小程序窗帘效果
  5. 删除空值_空白单元格行,如何快速批量删除?简单方法,效率飞升
  6. vscode插件可以直接复制到_一款可以让代码“跳舞”的 VS Code 插件:Power Mode
  7. halcon与QT联合:(5.1)瓶盖检测以及QT界面搭建
  8. 3D相机(1):1、了解
  9. PCL:超详细的基于法向量和曲率的区域生长算法原理以及源码解读
  10. 机器学习中的数学基础:(1)实际应用中矩阵特征值与特征向量的几何意义