文件流指针和文件描述符

2023-05-16

1.文件流指针和文件描述符的产生

fopen函数打开文件成功后会返回文件流指针,open函数打开文件成功后返回的是文件描述符.他俩的相同点是通过文件流指针和文件描述符都可以对文件进行操作.

2.fopen函数和open函数的介绍

fopen函数(库函数)

path:带有的路径的文件名,如果没有路径默认在当前文件下.

mode:

'r' 只读方式打开,将文件指针指向文件头,如果文件不存在,则返回空。
'r+' 读写方式打开,将文件指针指向文件头,如果文件不存在,则返回空。
'w' 写入方式打开,将文件指针指向文件头并将文件内容清空。如果文件不存在则创建。
'w+' 读写方式打开,将文件指针指向文件头并将文件内容清空。如果文件不存在则创建。
'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则创建。
'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则创建。
例如:FILE* fp = fopen("1.txt", "w+");

open函数(系统调用函数)

pathname:带有的路径的文件名,如果没有路径默认在当前文件下.

flags:打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“运算,构成flags

参数 :
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
        这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用 mode 选项,来指明新文件的访问权限
O_APPEND: 追加写
返回值: 成功:新打开的文件描述符,失败返回-1
例如:int p=open("1.txt", O_RDONLY|O_CREAT,0664);两个宏之间用 位图运算,0664是打开的文件的权限

3.文件描述符的介绍和怎么查看文件描述符

文件描述符是打开文件后返回的值,通过文件描述符可以操作文件,而每一个进程在运行时都会默认打开标准输入,标准输出,表述错误.这三个文件描述符.

打开一个文件然后进入死循环

int p=open("11.txt",O_RDWR | O_CREAT,0664);
    if(p<0)
    {
        return 0;
    }
    while(1)
    {

    }

用pa aux | grep mytext查看进程号

ll .proc/进程号/fd     查看进程打开的文件描述符.

 

 0:标准输入

1:标准输出

2:标准错误

3:程序里打开的文件的文件描述符

文件描述符就相当于文件的标记:标记的规则是最小数规则

在打开文件之前关闭标准输入文件,

 

 0代表的文件被关闭,所以打开文件后1.txt文件的文件描述符就是0;

4.从内核角度理解文件流指针和文件描述符

文件描述符:

每一个进程在内核里都是一个struct task_struct结构体:

结构体里看到了我们熟悉的pid

这是一个struct files_struct指针(描述的是当前进程打开文件的信息)

这个结构体指针指向的struct files_struct类型的变量,变量里里有一个struct file_rcu*fd_array[NR_OPEN_DEFAULT],这个结构体指针数组里的数组下表就是文件描述符,数组当中的元素是指针类型,指向了文件,所以通过文件描述符,就可以找到对应的文件.

图文关系如下:

文件流指针:

FILE可以在stdio.h的头文件里使用说明这个指针在这个文件里存在.直接cd /usr/include

打开包含头文件的文件夹,vim stdio.h.就能看到这个头文件里有啥了...(.h文件里基本上都是声明)

 

 第一个struct _IO_FILE是一个结构体的声明;

第二个是FILE指针是被重命名出来的,他的本来面目是struct _IO_FILE这个结构体

找到struct _IO_FILE结构体的办法:

在include文件下面进行搜索,grep struct _IO_FILE . -R(意思是在当前文件下进行递归搜索)

 打开结构体定义对应的文件libio.h,找到结构体的定义:

 char* _IO_read_ptr;   /* Current read pointer */     表示当前读到了哪个位置
 char* _IO_read_end;   /* End of get area. */   表示当前读区域的末尾
char* _IO_read_base;  /* Start of putback+get area. */  表示读区域的起始位置
char* _IO_write_base; /* Start of put area. */      写缓冲区的起始位置
char* _IO_write_ptr;  /* Current put pointer. */       写到了哪个位置
char* _IO_write_end;  /* End of put area. */          写缓冲区的末尾位置

文件描述符里包含这些指针,在文件进行读写的时候告诉函数应该从哪读;

int _fileno;  保存文件描述符的数值,

代码验证

#include<stdio.h>

int main()
{
    FILE*fp=fopen("1.text","w");
    printf("%d\n",fp->_fileno);
}

结果是

标准输入标准输出和标准错误分别是0,1,2,根据最小值规则,文件的文件标识符就是3

 图文匹配

struct _IO_FILE{...}这个结构体是标准库当中的结构体,该结构体里上述的指针维护的缓冲区是标准库的缓冲区

5.文件描述符和文件流指针的关联

上述说到文件描述符是PCB里的一个数组的的下标,所以一个PCB里可以有多个文件描述符.等同于,PCB里包含进程打开的所有文件...而文件流指针的范围就比较小了,一个文件流指针只能保存一个文件的文件描述符,就是文件流指针只能代表一个文件.所以一个进程至少要打开三个文件,标准输入,标准输出,标准错误.

图文对比

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文件流指针和文件描述符 的相关文章

  • eclipse配置Tomcat

    文章目录 前言一 预先工作1 Tomcat是什么 xff1f 2 Tomcat下载3 安装Eclipse for Java EE 二 在eclipse中配置Tomcat 前言 目前开始了j2ee的学习 xff0c 为了给以后的学习做准备 x
  • MATLAB学习笔记(一)上:MATLAB基础知识

    笔记配套课程 xff1a 科学计算与MATLAB语言 中国大学MOOC 慕课 icourse163 org PART ONE xff1a MATLAB系统环境 1 命令行窗口中 xff0c 如果一条命令很长 xff0c 我们可以分成两行来输
  • H3C路由器基本配置命令

    1 system view 进入系统视图 2 sysname R1 配置路由器名字为R1 3 display clock 查看当前系统时间 4 clock datetime 00 00 00 2 26 2023 用户模式下修改系统时间 配置
  • ubuntu18.04双系统卸载并重装

    卸载ubuntu18 04 原文档 xff08 稍作整理 xff0c 方便自己使用 xff09 下载diskgenius工具 xff1a diskgenius 删除Ubuntu系统使用的几个分区 xff08 包括EFI分区 xff09 xf
  • 安装zed-ros-wrapper 并解决一些报错

    创建工作空间 如果没有工作空间 xff0c 先根据如下命令建立工作空间 source opt ros melodic setup bash mkdir p catkin ws src cd catkin ws catkin make cat
  • rtabmap+orbslam2+D435i建图

    配置rtabmap 参考 xff1a rtabmap安装与使用 配置orbslam2参考 xff1a ubuntu18 04 安装orb slam2并结合ZED运行 建图参考 xff1a Rtabmap 43 ORB SLAM2 43 D4
  • matlab2018a帮助文档设置为中文

    版本 xff1a matlab2018a 1 主页 预设 2 帮助 文档位置 xff08 第二个 xff09 简体中文 应用 确定 3 结果展示
  • Vue2与Vue3的生命周期一览

    Vue2与Vue3的生命周期 生命周期前言介绍Vue2的生命周期钩子函数Vue3的生命周期钩子函数setup函数Vue3新增生命周期 生命周期 前言介绍 生命周期也称生命周期回调函数 生命周期函数 生命周期钩子 每个 Vue 组件实例在创建
  • FreeRTOS入门

    文章目录 一 FreeRTOS简介二 学习任务三 学习内容多任务程序实现1 相关文件2 头文件的添加3 路径添加4 修改主函数main c 中代码5 将程序烧录到stm32开发板中6 最终结果 四 参考资料 一 FreeRTOS简介 Fre
  • 嘉立创SMT贴片打板流程

    说明 xff1a 打板平台 嘉立创下单助手 使用嘉立创EDA画板可参考以下过程 使用AD画板 xff0c 不同点是 xff08 1 xff09 导出的文件是PCB源文件压缩包 43 BOM表 43 坐标文件 xff08 2 xff09 确保
  • Android Studio安装超详细步骤(包括SDK安装不成功,模拟器无法创建等问题)

    本文主要介绍CPU 为AMD锐龙 和英特尔 两种类型在安装中出现的一些问题 xff0c 两种解决的方案不同 xff0c 所以首先查看属于哪种 xff0c 然后找相对应的安装方法 Android Studio的安装需要准备两个安装文件 xff
  • HTML+CSS仿写京东页面附代码(web前端大作业)

    学习前端时间不多 xff0c 看了两晚上就开始赶实训作业 xff0c 大家看看就行 先来看看效果 xff1a lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta
  • DIY组装无人机电机+电调+电池+桨叶搭配知识

    以下内容转载至下网址 有一点点修改 DIY组装无人机电机 43 电调 43 电池 43 桨叶搭配知识 xff08 转贴 xff09 多旋翼 模吧 moz8 com https www moz8 com forum php mod 61 vi
  • (每日一练)MATLAB二维插值

    在前面介绍了学习MATLAB的一维插值方法 xff0c 今天来学习MATLAB二维插值方法 首先来看二维插值函数的使用格式 xff1a z1 61 interp2 x y z x1 y1 39 method 39 其中x y z分别是我们给
  • Ubuntu18.04安装D435iSDK和ROS Wapper

    实验室新到D435i深度相机 xff0c 我想来跑跑开源算法 xff0c 安装驱动各种帖子很多 xff0c 我把我看到两篇最有用的帖子整理一下 帖子连接放在文末 1 安装Intel RealSense SDK 2 0 参考 xff1a ht
  • 【Ros控制机械臂学习笔记】move_group C++interface接口学习

    在完成机器人URDF模型建立 xff0c 利用moveit setup assistant配置生成robot moveit config文件夹之后 xff0c 接下来就是要的学习方向有两个 一个是向下位机走 xff0c 即上图的右面 xff
  • MATLAB校准磁力计

    初识magcal函数 语法 A b expmfs 61 magcal D A b expmfs 61 magcal D fitkind 描述 A xff0c b xff0c expmfs 61 magcal xff08 D xff09 返回
  • C语言练习之路--函数篇

    目录 一 前言二 选择题三 编程题1 乘法口诀表2 交换两个整数3 函数判断闰年4 函数判断素数5 递归实现n的k次方6 计算一个数的每位之和 xff08 递归实现 xff09 7 strlen的模拟 xff08 递归实现 xff09 8
  • 使用VOFA调试PID算法

    1 选用FireWater模式 这个模式下才支持多通道数据 2 代码编写 我使用的是cubemx和keil xff08 1 先在cubemx里把串口打开 我用的是401 xff08 2 打开我的Keil继续 span class token

随机推荐

  • 基于 JSP+Mysql 学生成绩查询web系统

    文章目录 一 学习任务二 学习内容1 准备工作1 1 相关软件1 2 源代码 2 连接MySQL3 idea配置4 运行结果5 web访问 三 参考博客 一 学习任务 首先在Mysql中创建相应的学生成绩表 xff0c 然后基于 JSP 4
  • jquery获取指定元素的指定属性的值

    使用jquery获取指定元素的指定属性的值 xff1a 选择器 attr 34 属性名 34 gt 用来获取那些值不是true false的属性的值 选择器 prop 34 属性名 34 gt 用来获取值是true false的属性的值 例
  • Maven3.6.1下载安装基本使用 (初识)(自用)

    对MAVEN的粗浅认识 Apache Maven 是 项目管理与构建工具 基于POM xff08 项目对象模型 xff09 的概念 作用 提供了一套标准化的项目结构 粗浅理解就是 xff0c 通常eclipse xff0c idea等jav
  • VSCode代码格式化快捷键

    我们在编写代码和阅读别人代码的时候 xff0c 容易出现同级元素缩进没有对齐的情况 xff0c 我们需对代码进行格式化 xff0c 以方便自己和他人的阅读 在vscode中使用快捷键 Shift 43 Alt 43 F 使用示例 xff1a
  • for循环【C++】

    for循环 执行一个特定循环的控制结构 for 条件 条件判断 条件处理 执行体 xff1b 条件 条件判断和条件处理都不是必要的 xff0c 当三者都没有 xff0c 则相当于一个无限循环 条件不一定需要在括号内声明和初始化 xff0c
  • 基于深度强化学习的智能船舶航迹跟踪控制

    基于深度强化学习的智能船舶航迹跟踪控制 人工智能技术与咨询 昨天 本文来自 中国舰船研究 xff0c 作者祝亢等 关注微信公众号 xff1a 人工智能技术与咨询 了解更多咨询 xff01 0 引 言 目前 xff0c 国内外对运载工具的研究
  • 面向区块链的高效物化视图维护和可信查询

    面向区块链的高效物化视图维护和可信查询 人工智能技术与咨询 来源 xff1a 软件学报 xff0c 作者蔡 磊等 摘 要 区块链具有去中心化 不可篡改和可追溯等特性 可应用于金融 物流等诸多行业 由于所有交易数据按照交易时间顺序存储在各个区
  • 基于深度学习的磁环表面缺陷检测算法

    基于深度学习的磁环表面缺陷检测算法 人工智能技术与咨询 来源 xff1a 人工智能与机器人研究 xff0c 作者罗菁等 关键词 缺陷检测 xff1b 深度学习 xff1b 磁环 xff1b YOLOv3 xff1b 摘要 在磁环的生产制造过
  • 基于PX4的地面无人车避障系统及路径规划研究

    基于PX4的地面无人车避障系统及路径规划研究 人工智能技术与咨询 来源 xff1a 动力系统与控制 xff0c 作者姜琼阁等 关键词 地面无人车 xff1b 避障 xff1b PX4 xff1b 摘要 地面无人车避障及路径规划是指 xff0
  • 基于图像的数据增强方法发展现状综述

    基于图像的数据增强方法发展现状综述 人工智能技术与咨询 2022 03 22 20 57 点击蓝字 关注我们 来源 xff1a 计算机科学与应用 xff0c 作者冯晓硕等 关键词 数据增强 xff1b 图像数据集 xff1b 图像处理 xf
  • 基于改进SSD算法的小目标检测与应用

    人工智能技术与咨询 点击蓝字 关注我们 来源 xff1a 计算机科学与应用 xff0c 作者刘洋等 关键词 SSD xff1b 深度学习 xff1b 小目标检测 摘要 xff1a 摘要 针对通用目标检测方法在复杂环境下检测小目标时效果不佳
  • Excel线性回归分析

    文章目录 一 学习任务二 学习内容1 1 高尔顿数据集进行线性回归分析1 1 1 父母身高平均值和其中一个子女身高进行回归分析1 1 2 父子身高回归方程1 1 3 母子身高回归方程 1 2 Anscombe四重奏数据集进行回归分析 一 学
  • 组网雷达融合处理组件化设计与仿真

    人工智能技术与咨询 点击蓝色 关注我们 关键词 xff1a 组网雷达 点迹融合 航迹融合 组件化设计 仿真 摘要 数据融合处理是多雷达组网的核心 以典型防空雷达网为参考对象 xff0c 采用组件化设计方式 xff0c 将组网数据融合处理过程
  • 人工智能 知识图谱

    关于举办 2022年数字信息化培训项目系列 知识图谱Knowledge Graph构建与应用研修班线上课程的通知 各有关单位 一 培训目标 本次课程安排紧密结合理论与实践 xff0c 深入浅出 xff0c 循序渐进 从基本概念讲起 xff0
  • 深度学习(Deep Learning)

    知识关键点 1 人工智能 深度学习的发展历程 2 深度学习框架 3 神经网络训练方法 4 卷积神经网络 xff0c 卷积核 池化 通道 激活函数 5 循环神经网络 xff0c 长短时记忆 LSTM 门控循环单元 GRU 6 参数初始化方法
  • 基于深度学习的机器人目标识别和跟踪

    如今 xff0c 深度学习算法的发展越来越迅速 xff0c 并且在图像处理以及目标对象识别方面已经得到了较为显著的突破 xff0c 无论是对检测对象的类型判断 xff0c 亦或者对检测对象所处方位的检测 xff0c 深度学习算法都取得了远超
  • 零基础Linux版MySQL源码方式安装+配置+远程连接完整图解 无坑实录

    无论开发还是运维 xff0c 项目环境搞不定 xff0c 还真让你干不成活 xff0c MySQL在不同场景 不同平台下安装方式也不同 xff0c 本次主要分享centos7下MySQL源码rpm方式安装 xff0c 其它方式后续分享 xf
  • C++,友元,语法+示例,非常详细!!!!

    友元概念 友元的目的就是让一个函数或者类 访问另外一个类中的私有成员 友元的关键字为 friend 友元的几种实现 全局函数做 友元类做 友元成员函数做 友元重载函数做 友元 全局函数做 友元 include lt iostream gt
  • STL——STL简介、STL六大组件

    一 STL是什么 STL standard template library xff1a C 43 43 标准模板库 xff0c 是C 43 43 标准库的重要组成部分 xff0c 不仅是一个可复用的组件库 xff0c 还是一个包罗数据结构
  • 文件流指针和文件描述符

    1 文件流指针和文件描述符的产生 fopen函数打开文件成功后会返回文件流指针 open函数打开文件成功后返回的是文件描述符 他俩的相同点是通过文件流指针和文件描述符都可以对文件进行操作 2 fopen函数和open函数的介绍 fopen函