IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 一文搞懂Linux下的文件的标准输入、标准输出、输出重定向问题 -> 正文阅读

[系统运维]一文搞懂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开发的圣经值得反复读。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:59:45  更:2021-11-12 20:00:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:31:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码