【Linux】基础IO

基础文件IO

  • C库的文件接口
  • 系统调用的文件接口
  • 文件描述符和文件流指针的关系
  • 重定向

C库的文件接口

在c语言中,会使用fopen,fclose,fseek,fread,fwrite等函数进行文件IO的操作
以fopen函数举例

//FILE*表示文件流指针,path表示打开文件的路径,mode表示以什么方式打开
FILE* fopen(const char* path, const char* mode);

而我们如何去查看FILE到底是什么呢?

1.使用man手册去查看fopen在哪个头文件声明的 man fopen(如果显示No manual entry for fopen,则需要进行man手册的安装yum install man-pages
2.安装完成后进入man手册,看到包含的是stdio.h文件
3.vim /usr/include/stdio.h进入头文件
4.搜索FILE,找到了FILE,是typedef struct _IO_FILE FILE;,说明FILE是一个结构体
5.光标移动到FILE中,按ctrl + ]进行跳转,(若无法跳转,先用ctags -R ./建立映射关系)
6.在FILE中,fileno就是文件描述符
在这里插入图片描述

而打开方式分别有r, w, r+, w+, a+等,不论哪种打开方式,都会返回一个FILE类型的文件流指针,因此我们使用时会这样调用

FILE fp = fopen("./1.txt", "r");

需要注意的是:上述的这些函数都是c库所定义的函数,由c库去维护。而当我们使用fopen去打开一个文件时,默认会打开一个文件,而这个文件就是文件描述符,文件描述符的设置次序为最小未使用

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

系统调用的文件接口

与c语言类似,操作系统也提供了文件IO的接口,open, close, lseek, write, read
以open函数举例;

// int 类型的返回值实际上就是文件描述符,pathname为创建的目标文件,flags打开文件的类型,
// 如果使用了O_CREAT,则需要传递第三个值,mode指明文件访问权限,传递一个八进制的三位数
int open(const char* pathname, int flags);
int open(const char* pathname, int flags, mode_t mode);

同样的,也会创建一个文件描述符
在这里插入图片描述

文件描述符和文件流指针的关系

总统来说:文件流指针包含了文件描述符,文件流指针是c库中维护的一个结构体,而文件描述符是linux内核维护的。

文件描述符:(fd_array[i]结构体指针数组的下标就是文件描述符)struct task_struct结构体中有一个struct files_struct结构体指针,指向了一个struct files_struct结构体,这个结构体中有一个struct file fd_array[i]结构体指针数组(被称为文件描述符表),这个数组内的每一个元素都是一个结构体指针struct file*,指向struct file这样一个结构体,这个结构体中描述了文件的信息(例如:文件大小,文件所有者,文件权限,文件在磁盘中的存储位置等)。

文件流指针:是在c库中定义的一个struct _IO_FILE{…}一个结构体,每个文件都有一个文件流指针,这个结构体中包含了文件的信息,同时也包含了文件描述符。

重定向

直到了文件描述符的本质,实际上重定向就是将文件描述符的对应的struct file* 指针的指向修改。
重定向的接口int dup2(int oldfd, int newfd);是将oldfd的值,拷贝到newfd中,重定向为oldfd。

例子:将标准输出重定向到tmp.txt中
在这里插入图片描述
在这里插入图片描述

linux so cool被输出到了tmp.txt中
在这里插入图片描述

分析:printf是将内容打印到屏幕中,实际上就是打印到标准输出,而dup2之后,标准输出被重定向到了fd也就是文件描述符为3的位置,而3指向的是tmp.txt文件,因此屏幕没有输出,而是将内容输出到tmp.txt中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/9320.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微信小程序】-- 自定义组件 - 父子组件之间的通信(三十八)

💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…

Flutter 生命周期原理

一 这里看一下StatefulWidget的生命周期 其本身是由两个类组成的&#xff0c;StatefulWidget 和 State 组成的。 class DemoWidget extends StatefulWidget {const DemoWidget({super.key});overrideState<DemoWidget> createState() > _DemoWidgetState(); }class _…

Properties

Properties概述&#xff1a; 是一个Map体系的集合类 Properties可以保存到流中或从流中加载 练习&#xff1a;Properties作为Map集合的使用 package com.aynu13;//练习&#xff1a;Properties作为Map集合的使用import java.util.Properties; import java.util.Set;public cla…

单机最快的队列Disruptor解析和使用

前言 介绍高性能队列Disruptor原理以及使用例子。 Disruptor是什么? Disruptor是外汇和加密货币交易所运营商 LMAX group 建立高性能的金融交易所的结果。用于解决生产者、消费者及其数据存储的设计问题的高性能队列实现。可以对标JDK中的ArrayBlockingQueue。是目前单机且…

【JavaWeb】1—JavaWeb概述

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…

人工智能中的移动端编程

移动端编程是现在新兴的主要编程领域之一&#xff0c;该领域聚集了非常多的开发人员。这主要得益于手机和平板电脑的快速普及&#xff0c;人们以前需要在台式机上完成的事情&#xff0c;现在都可以非常方便地在手机或平板电脑上完成。由于手机和平板电脑携带更加方便&#xff0…

阿里云版GPT官宣,我们问了它10个问题

4月7日&#xff0c;阿里云宣布自研大模型“通义千问”&#xff0c;目前已开始邀请用户测试体验。 阿里达摩院在NLP自然语言处理等前沿科研领域早已布局多年&#xff0c;并于2019年启动大模型研发&#xff0c;通义千问便是其最新成果&#xff0c;相当于阿里云版的“ChatGPT”。 …

网络编程之输入ip地址解析不出来域名

网络编程之输入ip地址解析不出来域名 1.解决方案 设置本机的域名解析服务器 1. 查看域名的ip ping 域名 找到如下图路径下的hosts文件 赋予权限 添加域名和ip地址的对应关系。域名和ip之间采用空格隔开。 代码测试 代码详见&#xff1a;网络编程---实验2 查找Internet地址和用…

腾讯云轻量应用服务器16核32G28M处理器带宽流量性能测评

腾讯云轻量应用服务器16核32G28M带宽&#xff0c;28M带宽下载速度峰值可达3584KB/s&#xff0c;折合3.5M/秒&#xff0c;16核32G28M带宽3468元15个月&#xff0c;折合每月231元&#xff0c;系统盘为380GB SSD盘&#xff0c;免费6000GB月流量&#xff0c;折合每天200GB流量&…

系统集成项目管理工程师案例分析考点汇总(成本、质量、人力)

项目成本管理常见考点1. 成本估算、成本预算的步骤2. 成本估算、成本预算的区别与联系3. 成本估算困难或不准的原因4. 成本失控的原因5. 成本超支、进度落后采取的措施6. 成本超支、进度超前采取的措施项目质量管理常见考点1. 质量管理计划的内容2. 质量保证与质量控制的联系3.…

「解析」Matplotlib 绘制折线图

相比于【优雅】matplotlib 常见图、【优雅】matplotlib 3D图 而言&#xff0c;折线图使用的频率会更高一些&#xff0c;在此整理下最近使用 Matplotlib 绘制折线图常用的一些配置&#xff0c;小伙伴们只需要修改对应的 aug_list、list 即可直接使用 # !/usr/bin/env python …

在线Plist文件格式转Json文件格式

Plist文件是一种用于存储应用程序配置信息的文件格式&#xff0c;其中包含应用程序的各种设置和数据。在过去&#xff0c;Plist文件通常是以 .plist 格式存储的。然而&#xff0c;随着时间的推移&#xff0c;人们开始使用 JSON 格式来存储更复杂的数据结构和数据。如果您需要将…

77-Linux_网络编程

网络编程一.主机字节序列和网络字节序列二.套接字地址结构1.通用socket地址结构2.专用的socket地址结构3.IP地址转换函数一.主机字节序列和网络字节序列 主机字节序列分为大端字节序和小端字节序&#xff0c;不同的主机采用的字节序列可能不同。 大端字节序是指一个整数的高位…

二 、Locust自定义用户(场景)

二 、自定义用户&#xff08;场景&#xff09; 一个用户类代表了你系统中的一种用户/场景。当你做一个测试运行时&#xff0c;你指定你想模拟的并发用户的数量&#xff0c;Locust将为每个用户创建一个实例。你可以给这些类/实例添加任何你喜欢的属性&#xff0c;但有一些属性对…

shell 脚本编写

文章目录练习题目&#xff1a;1.编写函数&#xff0c;实现打印绿色0K和红色FAILED,判断是否有参数&#xff0c;存在为0k&#xff0c;不存在为FAILED2.编写函数&#xff0c;实现判断是否无位置参数&#xff0c;如无参数&#xff0c;提示错误3.编写函数实现两个数字做为参数&…

uniapp - 实现车牌号键盘与格子间隔显示组件,汽车牌照录入支持自定义样式、新能源等(附带组件完整源码,开箱即用,稍微改改就能用)

效果图 uniapp 全平台兼容,车牌号键盘输入、分格显示功能示例源码,注释很多! 可以直接复制一下,然后自己改改样式或功能就能使了。 示例源码 复制,运行。 &

ReRes 谷歌浏览器插件使用

安装&#xff1a; 本插件是chrome插件&#xff0c;有条件者可以直接在chrome商店下载安装&#xff1b; 条件有限者&#xff1a; CSDN 下载 ReRes找到插件的github路径&#xff0c;本文插件点击 ReRes下载到本地并解压在chrome浏览器地址栏输入chrome://extensions/进入扩展页…

MySQL存储引擎

存储引擎MySQL体系结构存储引擎简介存储引擎特点存储引擎选择总结MySQL体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层 第二层架构主要完成大多数的…

集成时间序列模型提高预测精度

使用Catboost从RNN、ARIMA和Prophet模型中提取信号进行预测 集成各种弱学习器可以提高预测精度&#xff0c;但是如果我们的模型已经很强大了&#xff0c;集成学习往往也能够起到锦上添花的作用。流行的机器学习库scikit-learn提供了一个StackingRegressor&#xff0c;可以用于…
最新文章