首页 > 输入重定向,输出重定向,管道相关内容及实现方法

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

近期,通过实现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 ");                     return;                 }                 else if(pid2 == 0)                 {                     if(!(find_command(arg[0])))                     {                        printf("%s :command not found ",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 ");

                if(!(find_command(arg[i])))                {                     printf("%s :command not found ",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 ");                 exit(0);         }

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

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

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

更多相关:

  • 本文来自 运维人生 ,作者:fly是个稻草人链接:http://www.ywadmin.com/?id=76误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~说在前面的话针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收...

  • 原文来自SecIN社区—作者:WiHat0x00 什么是WebShell渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限,于是WebShell便应运而生。Webshell中的WEB就是web服务,shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权限,而...

  • 断电时文件系统发生了什么?硬盘又发生了什么?下一次开机时写到一半的文件在系统层面还在吗?在底层还在吗?更进一步的, 文件系统如何保证事务性, 会不会存在某种极端情况导致例如最后几个bit还没写完, 文件系统却认为它成功了的情况?回答不限任何文件系统,谢谢!下面是「北极」的回复分享断电的一瞬间,很多事情是无法确定的:1. 你无法确定...

  • 接到项目需求。需要搭建一个页面进行交互,慢慢来b (2).jpg使用python django框架进行页面的搭建在项目文件下打开窗口,输入命令;django-admin startproject helloword#在文件helloword/helloword/创建view.py在view.py文件中输入以代码from django....

  • 常见的错误集合解决方案(一)No.1提示错误'Microsoft.VC90.CRT,version="9.0.21022.8"把Microsoft.NET Framework 3.5.1下面的全部勾选上。No.2解决Qt Designer设计的图标但是VS生成不显示问题描述:在Qt designer中为菜单栏和工具栏设计的图标,但是...

  • 在DOS窗口执行了一些列命令完成某项工作后,如果要查看都执行了那些命令,该如何办呢?(前提:DOS窗口未关闭的情况下)     一、方法一:使用↑↓箭头上下翻看执行过的命令,此方式适宜执行命令较少的情况; 二、方法二:使用快捷键; F7快捷键查看所有执行过的命令 F3:调出上一条执行过的命令,调出后直接回车即可执行; F...

  • 在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢?下面笔者分享几种在linux下用过的清屏方法。 1、clear命令、这个命令将会刷新屏幕,本质上只是让终端显示页向后翻了一页,如果向上滚动屏幕还可以看到之前的操作信息。 2、Ctrl+l(小写的L)、这是一个清屏的快捷键,这个是笔者...

  • LINUX下用CTRL+R快速搜索HISTORY历史命令,快速索引到之前使用过的命令行语句 前提是,搜索已经使用的命令,否则是查不出来结果的。 ctrl+r 用途:反向搜索执行过的命令。(reverse-i-search) 1、任何目录下按住ctrl + r 2、输入历史命令中的字符串 ,比如 输入shut 会检索...

  • 刚开始接触linux,总有些简单的问题不知道怎么搞定,先将目前汇总的解决方法叫做"linux入门-1",后续在使用过程中逐步总结。   1. 连接 ADSL : sudo pon dsl-provider 断开 ADSL: sudo poff 查看 ADSL 状态: plog 2. dpkg 命令 dpkg 是 Debia...

  • 文章目录NVME 和 AHCI 性能比较NVME-CLI nvme工具使用1. 安装2. 命令综述3. 基本命令演示4. NVME 固件设备升级...

  • mongod备份还原常用命令   MONGODB启动 mongod --dbpath=c:/mongodb/data/ --logpath=c:/mongodb/logs/mongodb.log --logappend --fork --port=27017 --rest --profile=1 --slowms=500   ...