【Linux初阶】基础IO - 文件管理(深入理解文件描述符) | 重定向


一、文件管理引入

我们在前面的文章中就曾提及过,进程操作的本质:进程与被打开文件的关系

那么问题来了,一个进程可以打开多个文件吗?

可以 -> 系统中一定会存在大量被打开的文件 -> 被打开的文件需不需要被 OS管理起来呢?要的 -> 如何管理? -> 先描述,在组织 -> 操作系统为了管理对应的打开文件,必定要为文件创建对应的 内核数据结构标识文件 -> files_struct {} -> 包含了大量的文件属性

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


#define FILE_NAME(number) "log.txt"#number //宏中+#,使两个字符串具有链接特性

int main()
{
   
    umask(0);//设置当前进程的umask值

    int fd0 = open(FILE_NAME(1), O_WRONLY | O_CREAT | O_APPEND, 0666);
    int fd1 = open(FILE_NAME(2), O_WRONLY | O_CREAT | O_APPEND, 0666);
    int fd2 = open(FILE_NAME(3), O_WRONLY | O_CREAT | O_APPEND, 0666);
    int fd3 = open(FILE_NAME(4), O_WRONLY | O_CREAT | O_APPEND, 0666);
    int fd4 = open(FILE_NAME(5), O_WRONLY | O_CREAT | O_APPEND, 0666);

    printf("fd: %d\n", fd0);
    printf("fd: %d\n", fd1);
    printf("fd: %d\n", fd2);
    printf("fd: %d\n", fd3);
    printf("fd: %d\n", fd4);

    close(fd0);
    close(fd1);
    close(fd2);
    close(fd3);
    close(fd4);
}

在这里插入图片描述

通过观察上面的代码和对应的运行结果,我们发现了两个问题:

  1. fd获取的是文件操作符,那么为什么文件操作符是从3开始的呢?
  2. 为什么文件操作符是连续的小整数呢,这些连续的小整数是什么?

其实,这些连续的小整数就是数组的下标,至于为什么是数组下标,我们在后面结合其他知识再行讲解。


二、理解文件描述符

我们还是以 open的代码为例,我们知道,open接口调用成功后会返回文件描述符。实际上,文件描述符,就是一个整数

int fd = open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0666);

Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入(stdin)0, 标准输出(stdout)1, 标准错误(stderr)2。0,1,2对应的物理设备一般是:键盘,显示器,显示器。也就是说,在操作系统层面,我们可以把键盘和显示器理解成为文件

这就回答了我们上面的第一个问题:fd获取的是文件操作符,那么为什么文件操作符是从3开始的呢?
因为前三个文件描述符被占用了。下面ÿ

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值