linux学习(文件描述符)[12]

文章讲述了在C语言中,如何使用文件描述符进行输入重定向、输出重定向和追加操作,以及一切皆文件的概念,强调了标准输出、不同操作模式(如O_RDONLY、O_WRONLY、O_APPEND)和系统调用在实现文件操作中的作用。
摘要由CSDN通过智能技术生成

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

输出重定向

本质在OS内部,更改fd对应内容的指向

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

//myfile helloworld
//int main(int argc, char *argv[])
int main()
{
close(1);
    // 这里的fd的分配规则是: 最小的,没有被占用的文件描述符
    // 0,1,2 -> close(1) -> fd -> 1
    int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    if(fd < 0)
    {
        perror("open");
        return 1;
    }
    // 都应该是往显示器(标准输出)打印的!
    // 但是下面的都写入(显示)到了log.txt
    // 这是什么呢?输出重定向
    printf("fd: %d\n", fd); // stdout->FILE{fileno=1}->log.txt
    printf("fd: %d\n", fd);
    printf("fd: %d\n", fd);
    printf("fd: %d\n", fd);
    printf("fd: %d\n", fd);
    printf("fd: %d\n", fd);
    fprintf(stdout, "hello fprintf\n");
    const char *s = "hello fwrite\n";
    fwrite(s, strlen(s), 1, stdout);

    不关心
    fflush(stdout); 
    //stdout->_fileno == 1;
    close(fd); 
    return 0;
}

在这里插入图片描述
从上往下找,匹配数字最小的
在这里插入图片描述

输入重定向

     close(0);
    int fd = open("log.txt", O_RONLY);
    if(fd<0) 
    {
        perror("open");
        return 1;
    }

    printf("fd: %d\n", fd);

    char buffer[64];
    fgets(buffer, sizeof buffer, stdin);

    printf("%s\n", buffer);

追加重定向

    close(1);
    int fd = open("log.txt", O_WRONLY | O_APPEND | O_CREAT);
    if(fd<0) 
    {
        perror("open");
        return 1;
    }

    fprintf(stdout, "you can see me , success\n");

dup2(系统调用重定向)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如何理解一切皆文件?

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
一切都被描述为struct file

缓冲区

一块内存空间:存够一定数据就会刷新
在这里插入图片描述
刷新策略
1.立即刷新
2.行刷新(行缓冲)遇到\n
3.满刷新(全缓冲)
特殊情况
1.用户强制刷新(fflush)
2.进程退出
在这里插入图片描述
重定向后,fork导致次数增多(缓冲区刷新策略)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值