一文搞懂Linux下的文件的标准输入标准输出输出重定向问题

Posted Linux bsping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文搞懂Linux下的文件的标准输入标准输出输出重定向问题相关的知识,希望对你有一定的参考价值。

        Linux下一切皆文件,所谓的终端那个黑框也可以视为一个文件,在Linux驱动开发中各个设备也可以被认为是文件操作,所以文件的操作很重要。我们通常将键盘叫做标准输入设备、将显示器叫做标准输出设备,下面由几个例子来解释文件的标准输入、标准输出、输出重定向。

一、命令行下的标准输入、标准输出、输出重定向

        在命令行中可以使用echo命令将想输的字符串输出在终端上,结果如下:

lzn@ubuntu:~$ echo abcdefdg
abcdefdg

        这就是标准输出。

        在终端中可以使用cat命令来展示标准输入,cat命令后加文件,会在终端展示文件内容,如果不加文件,则你从键盘输入什么消息,他就会在终端展示什么消息,结果如下:

lzn@ubuntu:~$ cat abc
这里是文件的内容
lzn@ubuntu:~$ cat
现在是键盘输入的内容
现在是键盘输入的内容
只有使用Ctrl+C才可以退出回到命令行
只有使用Ctrl+C才可以退出回到命令行
^C
lzn@ubuntu:~$

        这里展示的是标准输入,其实也包含了标准输出,因为也是在终端显示的信息。cat abc是查看abc文件的内容。

        重定向多用于输出重定向,所以下面只在终端做输出重定向的例子,输出重定向用>,>>,2>。输入重定向号用符号<表示,<表示输出重定向并覆盖以前的数据,<<表示输出重定向追加在以前的数据后。2>表示错误输出,最后还是会把数据输出在终端上即输出在标准输出设备上。下面是例子(test是我的测试文件):

lzn@ubuntu:~$ echo abcd
abcd
lzn@ubuntu:~$ echo abcd > test
lzn@ubuntu:~$ cat test
abcd
lzn@ubuntu:~$ echo efgh > test
lzn@ubuntu:~$ cat test
efgh
lzn@ubuntu:~$ echo abcd >> test
lzn@ubuntu:~$ cat test
efgh
abcd
lzn@ubuntu:~$ echo aaaaaaaa 2> test
aaaaaaaa
lzn@ubuntu:~$ cat test
注意:错误输出虽然不会输出在test文件里,但是还是会清空test文件,还有2>>重定向就不演示了。

        以上内容就是命令行中标准输入、输出、重定向的用法。

二、文件操作中的标准输入、输出、重定向用法

 

        每一个文件都有自己的文件描述符,系统会将0、1、2分配给标准输入、标准输出、错误输出。所以我们打开的文件名是从3开始的。当然我们也可以将文件描述符改为0、1、2,这里就不说了。 

        下面根据代码来展示标准输入输出、重定向的用法。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFMAX 32

int main(int argc,char **argv)    //argc表示执行文件后的参数数量,argv[]表示后面参数代表的                                    
                                    文件,argv[0]代表本段代码的文件名
{
        if(argc<2)
        {
                perror("少于1个文件!\\n");
                exit(1);
        }
        int fd0;
        if((fd0=open(argv[1],O_RDONLY))<0)    //打开文件并判断文件是否正确打开
        {
                perror("open error\\n");
                exit(1);
        }
        int len;
        char buf[BUFFMAX];
        while(1)
        {
                len=read(fd0,buf,BUFFMAX);    //read和write都是简单的函数,不懂可以去搜
                if(len>0)
                {
                        write(1,buf,len);     //这里1表示标准输出,就是将数据显示在终端上
                }
                if(len==0)
                        break;
        }
        close(fd0);
        exit(0);
}

        以上代码功能就是将文件的内容标准输出,当然输出的文件就是屏幕即终端界面,运行结果如下:

lzn@ubuntu:~$ ./a a.c    //执行a.c的代码来输出a.c的程序,以下是输出,只截取部分。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFMAX 32

        那如何将输出重定向到其他文件呢,只需要再打开一个文件,将其定向为输出位置,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFMAX 32

int main(int argc,char **argv)
{
        if(argc<2)
        {
                perror("少于2个文件!\\n");
                exit(1);
        }
        int fd0,fd1;
        if((fd0=open(argv[1],O_RDONLY))<0)
        {
                perror("open error\\n");
                exit(1);
        }
        if((fd1=open(argv[2],O_WRONLY))<0)
        {
            perror("open error\\n");
                  close(fd0);
            exit(1);
        }

        int len;
        char buf[BUFFMAX];
        while(1)
        {
                len=read(fd0,buf,BUFFMAX);
                if(len>0)
                {
                        write(fd1,buf,len);  //把刚才的1换成了另一个文件的文件描述符
                }
                if(len==0)
                        break;
        }
        close(fd0);
        close(fd1);
        exit(0);
}

        下面是执行结果:

lzn@ubuntu:~$ vim a.c
lzn@ubuntu:~$ gcc -o a a.c
lzn@ubuntu:~$ ./a a.c test   //执行a.c的代码将a.c程序重定向输出到test文件中。以下只是部分输                            
                               出
lzn@ubuntu:~$ cat test
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFMAX 32
int loop=0;

        以上就是文件操作中的标准输入、输出、重定向用法。感兴趣的可以去看看Unix环境高级编程,Linux开发的圣经值得反复读。

以上是关于一文搞懂Linux下的文件的标准输入标准输出输出重定向问题的主要内容,如果未能解决你的问题,请参考以下文章

Linux标准输入输出与重定向详解果断收藏

linux重定向标准输入输出,标准错误

Linux标准输入标准输出错误输出

Linux shell标准输入,标准输出,错误输出

Linux下Shell重定向

谈谈Linux下的数据流重定向和管道命令