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

近期,通过实现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);
        }

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值