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

本文详细介绍了Linux环境下标准输入、标准输出和输出重定向的概念与用法,通过实例展示了如何使用echo、cat命令以及文件描述符进行操作。还分享了如何通过代码实现文件内容的读取与重定向输出,帮助读者深入理解Linux系统中的文件操作。
摘要由CSDN通过智能技术生成

        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开发的圣经值得反复读。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西邮小菜机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值