当前位置: 首页 > news >正文

Linux:文件描述符

文件描述符实际上就是一个小整数

0 & 1 & 2

·Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2.
·0,1,2对应的物理设备一般是:键盘,显示器,显示器

        所以输入输出还可以采用如下方式:

文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件。

文件描述符的分配规则

直接看代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{int fd = open("bite", O_RDONLY); if(fd < 0){ perror("open"); return 1;}printf("fd: %d\n", fd);close(fd);return 0;
}

试试关闭0或者2

int main()
{close(0);//close(2);int fd = open("bite", O_RDONLY); if(fd < 0){ perror("open"); return 1;}printf("fd: %d\n", fd);close(fd);return 0;
}

发现是结果是: fd: 0 或者 fd: 2 可见,文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。

重定向
那如果关闭1呢?

int main()
{close(1);int fd = open("bite", O_WRONLY|O_CREAT, 00644); if(fd < 0) { perror("open"); return 1;}printf("fd: %d\n", fd); fflush(stdout);  close(fd); exit(0);
}

此时,我们发现,本来应该输出到显示器上的内容,输出到了文件 "bite"当中,其中,fd=1。这种现象叫做输出重定向。常见的重定向有:>, >>, < 
那重定向的本质是什么呢?

相关文章:

  • ai写诗词,三款软件助你妙笔生花!
  • Cesium4Unreal - # 009 直接加载显示Shapefile
  • 返回给前端数据的封装
  • 【Spine学习13】之 制作受击动画思路总结(叠加颜色特效发光效果)
  • Go 基础丨字符串 string
  • 【已解决】better-scroll在PC端如何开启鼠标滚动以及如何始终显示滚动条
  • Vim基础操作:常用命令、安装插件、在VS Code中使用Vim及解决Vim编辑键盘错乱
  • 北方高温来袭!动力煤却不涨反跌的原因分析
  • 分支结构相关
  • JEnv-for-Windows 详细使用
  • 关于ReactV18的页面跳转传参和接收
  • 【干货分享】25地学考研推免夏令营汇总表
  • SpringBoot 多种优雅的线程池配置与使用(异步执行函数,反射机制,动态识别参数,有返回值)
  • 2024年6月20日 (周四) 叶子游戏新闻
  • redis 缓存jwt令牌设置更新时间 BUG修复
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • dva中组件的懒加载
  • EOS是什么
  • ES6系列(二)变量的解构赋值
  • export和import的用法总结
  • Java,console输出实时的转向GUI textbox
  • JavaScript创建对象的四种方式
  • KMP算法及优化
  • leetcode46 Permutation 排列组合
  • Linux下的乱码问题
  • PHP 7 修改了什么呢 -- 2
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Vultr 教程目录
  • XML已死 ?
  • 初探 Vue 生命周期和钩子函数
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 手写一个CommonJS打包工具(一)
  • 译自由幺半群
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #android不同版本废弃api,新api。
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #每日一题合集#牛客JZ23-JZ33
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #职场发展#其他
  • $nextTick的使用场景介绍
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (09)Hive——CTE 公共表达式
  • (2)Java 简介
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (javascript)再说document.body.scrollTop的使用问题
  • (搬运以学习)flask 上下文的实现
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...