【Linux】:重定向和缓冲区

朋友们、伙计们,我们又见面了,本期来给大家带来关于重定向和缓冲区的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

目录

1. 重定向

1.1 输出重定向 

1.2 追加重定向

1.3 输入重定向

1.4 重定向系统调用接口

2. 标准错误stderr

3. 缓冲区

3.1 缓冲区存在的价值

3.2 缓冲区的刷新方式

3.3 分析样例 

3.4 用户缓冲区和内核缓冲区

3.5 何为刷新

3.6 FILE结构体


1. 重定向

重定向这个概念在前面Linux常见指令章节就介绍过它的指令以及用法,那么本节来一起深入了解一下重定向:

1.1 输出重定向 

echo 字符串 > 文件 :将本来输出在显示器文件(标准输出)上的字符串输出至指定的文件。

标准输出对应的文件fd是1。

下面用代码来实现一下重定向的功能:
 

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

#define FILE_NAME "log.txt"

int main()
{
    // 关闭标准输出
    close(1);
    int fd = open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0666);
    printf("fd: %d\n", fd);
    fprintf(stdout, "stdout->fd: %d\n", stdout->_fileno);

    // 刷新
    fflush(stdout);
    close(fd);
}

先看结果,再分析代码:

我们都知道文件fd的分配规则,是寻找最小的未被使用的fd进行分配,所以我们先把1号文件描述符关闭,然后再打开文件时,1号文件描述符就被新打开的文件分配走了,这些C语言打印函数,默认是往1号文件描述符对应的文件中打印,简单的说就是它们只认识1这个数字,并不会在乎这个文件到底是不是显示器文件,所以才会把数据打印到新打开的文件中。

至于这里为什么要加这个fflush用来刷新缓冲区在后续会详细介绍。

1.2 追加重定向

追加重定向直接把打开文件时的方式从清空改为追加即可:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

#define FILE_NAME "log.txt"

int main()
{
    // 关闭标准输出
    close(1);
    //int fd = open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0666);
    int fd = open(FILE_NAME, O_WRONLY | O_CREAT | O_APPEND, 0666);
    printf("fd: %d\n", fd);
    fprintf(stdout, "stdout->fd: %d\n", stdout->_fileno);

    // 刷新
    fflush(stdout);
    close(fd);
}


1.3 输入重定向

cat指令默认是从标准输入键盘文件中读取数据;

cat < 文件:本来从键盘读取数据,但是重定向为从指定的文件读取数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

stackY、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值