输入重定向,输出重定向,管道相关内容及实现方法
近期,通过实现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); }
其实管道命令的实现方法也很简单,也运用了输入输出重定向
实现的方法就是将|左边的命令执行的结果保存至文件中,在运行|右边的命令时将再将刚刚文件中的内容传入|右边的命令去执行。
推荐阅读
-
Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)
-
输入重定向,输出重定向,管道相关内容及实现方法
-
linux学习(三)输入输出重定向和管道功能、cat命令、more命令
-
JS基于Location实现访问Url、重定向及刷新页面的方法分析
-
Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)
-
linux学习(三)输入输出重定向和管道功能、cat命令、more命令
-
输入输出,重定向,管道的实例介绍
-
输入重定向,输出重定向,管道相关内容及实现方法
-
输入输出,重定向,管道的实例介绍
-
JS基于Location实现访问Url、重定向及刷新页面的方法分析