波奇学Linux: 文件描述符

文件和操作系统的关系

操作系统控制进程,文件的打开是在进程中进行。意味着用来控制进程的PCB必然有文件的信息,操作系统通过控制PCB的信息来控制文件的读写。

Q1:如何证明文件打开是在进程中进行?

编写c文件调用fopen来操作文件,c文件会被编译成可执行程序执行,即进程,实现进程中对文件操作。

C的文件操作和系统调用

文件调用必须通过系统调用

fopen,fclosed等库函数是用户接口,从硬盘读取文件时,对硬件操作时,必须调用操作系统的函数底层

文件操作库函数和底层函数的关系 

c文件操作库函数主要有fopen,fclose等

其中fopen第一个参数是文件名,第二个参数是打开模式

r:只读

r+:可读可写

w:只写,清空再写

w+:可读可写,清空再写,文件不存在创建

a:只写,追加写

a+:可读可读写,追加写

系统调用则用open函数 

 

其中 open函数中的 flags参数表示选项, mode表示文件权限

flags参数表示文件操作读,写,可读可写,参数是宏

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
//设置掩码为0
umask(0);
//创建只写文件,如果文件不存在时创建,新文件掩码是0666
int fd=open("log.txt",O_CREAT|O_WRONLY,0666); 
// 关闭文件
fclose(fd);
return 0;
}

因此我们可以推断 fopen的w+模式 必然是对open的封装,且对应的宏参数为O_WRONLY|O_CREAT|O_TRUNC

而不同的模式对应不同的宏参数组合。

宏参数控制的方法叫做比特位控制法

#define ONE (1<<0)
#define TWO (1<<1)
#define THREE (1<<2)
#define FOUR (1<<3)
void show(int flags)
{
if (flags&ONE) printf("hello function1");
if (flags&TWO) printf("hello function2");
if (flags&THREE) printf("hello function3");
if (flag&FOUR) printf("hello function4");
}
int main()
{
show(ONE);
ShoW(TWO);
show(ONE|THREE); // function3 和function1都打印
return 0;
}

 文件调用本质

在task_struct的指针中有files_struct的指针

files_struct结构体含有一个数组,数组中有file*指针,数组的下标就是fd,open的返回值file descriptor。

fd为1和为2都指向显示器文件,用引用计数解决这个问题。

file指针管理着文件,包含基本信息

关闭文件就是引用计数减一,同时释放file结构体

在Linux下一切皆文件

fd=0 stdin流,对应键盘文件

fd=1 stdout流 对应显示器文件

fd=2 stderr 显示器文件

向fd为1的文件,即向显示器输出hello Linux。

C语言的FILE* 必然会封装fd

同理库函数的printf等调用fd为1的文件。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 接入讯飞星火大模型实现对话

申请地址 https://xinghuo.xfyun.cn/sparkapi?scrprice 免费申请200万Token 开发文档 https://www.xfyun.cn/doc/spark/Web.html#_1-接口说明 页面最下面有相关demo可以参考 介绍 接口是以套接字的形式分段返回&#xff0c;而且非http请求&#xff0c;比较繁琐&#xff0c;官…

如何使用Airtest进行UI自动化测试

一、环境搭建 1、Airtest客户端下载 访问官网http://airtest.netease.com/&#xff0c;根据自己的系统下载相应的客户端安装&#xff1b; 2、python工具下载与环境搭建 在本地python环境中安装airtest和pocoui&#xff0c;然后用命令行运行脚本&#xff1b; 1、建议使用3.…

笔记:《NCT全国青少年编程能力等级测试教程Python语言编程二级》

NCT全国青少年编程能力等级测试教程Python语言编程二级 ISBN:9787302565857 绪论 专题1 模块化编程 考查方向 考点清单 考点 模块化编程 (一)模块化编程思想:结构清晰、降低复杂度;提高代码复用率;易于扩展、维护,方便阅读、优化。 …

猫头虎分享已解决Bug || RuntimeError: size mismatch, m1: [32 x 100], m2: [500 x 10]

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

奶茶点餐|奶茶店自助点餐系统|基于微信小程序的饮品点单系统的设计与实现(源码+数据库+文档)

奶茶店自助点餐系统目录 目录 基于微信小程序的饮品点单系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、商品信息管理 2、商品评价管理 3、商品订单管理 4、用户管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 …

【More Effective C++】条款2:使用C++转型操作符

C旧式转型的缺点包括&#xff1a; 没有类型安全检查&#xff1a;允许将任何指针转换为其他类型指针&#xff0c;可能导致未定义行为的错误&#xff1b;难以识别和维护&#xff1a;语法(type)expression 或 type(expression)在代码中难以被快速识别&#xff1b; 为了解决上述问…

算法||如何优化算法?算法如何评价和分析

目录 1.一个好的算法所具备的特性 2.算法分析‐‐‐评价算法 3.算法复杂度 4.时间复杂度 如何统计在程序中统计算法执行语句数 5.空间复杂度 6.程序优化的最核心思路: 总结 1.一个好的算法所具备的特性 正确: 符合语法,能够编译、链接 能够正确处理简单的输入…

Rust语言之字符串

文章目录 一、字符二、字符串1.&str2.string创建字符串遍历字符串变更字符串指定位置插入字符串字符串拼接宏拼接&#xff08;format!&#xff09; 三、切片1.字符串切片2.数组&#xff08;向量&#xff09;切片 Rust语言设计官方教程 一、字符 Rust提供char为字符存储变量…

Qt知识点总结目录

一.Qt安装配置和创建项目 Qt所有版本下载地址 Qt安装配置教程windows版&#xff08;包括&#xff1a;Qt5.8.0版本&#xff0c;Qt5.12&#xff0c;Qt5.14版本下载安装教程&#xff09;&#xff08;亲测可行&#xff09; QT从入门到入土&#xff08;一&#xff09;——Qt5.14.…

Linux操作系统基础(八):Linux的vi/vim编辑器

文章目录 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 二、打开文件 三、VIM编辑器的三种模式(重点) 四、命令模式相关命令 五、底行模式相关命令 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 vi是visual interface的简称, 是Linux中最经典的文本编辑器 vi的核心设计思想…

技术精英求职必备:网络安全工程师简历制作全指南

简历编写核心原则 撰写针对网络安全工程师职位的简历时&#xff0c;关键在于准确展现您在网络安全领域的专业技能、项目经验和技术成就。简历应作为您展示安全策略制定、风险管理、入侵检测和响应能力的窗口。确保每一项经历和技能都紧密贴合网络安全工程师的角色要求。具体的…

在 Windows上恢复删除照片的 4 种有效方法

您是否曾在 Windows 7/8/10/11 中不小心删除过照片&#xff1f;如何轻松快速地恢复已删除的照片&#xff1f;在这里这篇文章列出了几种在Windows 11/10/8/7中恢复已删除照片的可行方法&#xff0c;而MiniTool数据恢复软件 是丢失照片恢复的最佳选择。 意外删除的照片 根据一项…

蓝桥杯官网练习题(翻转)

问题描述 小蓝用黑白棋的 n 个棋子排成了一行&#xff0c;他在脑海里想象出了一个长度为 n 的 01 串 T&#xff0c;他发现如果把黑棋当做 1&#xff0c;白棋当做 0&#xff0c;这一行棋子也是一个长度为 n 的 01 串 S。 小蓝决定&#xff0c;如果在 S 中发现一个棋子…

口腔助手|口腔挂号预约小程序|基于微信小程序的口腔门诊预约系统的设计与实现(源码+数据库+文档)

口腔小程序目录 目录 基于微信小程序的口腔门诊预约系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序前台界面实现 2、后台管理员模块实现 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文参考 七、最新…

20190726 ApacheHttpClient-自签证书与系统证书共存

要使用HTTPClient-4.5.2做一些连接&#xff1b;但是有的域名是使用的自签证书&#xff0c;有的是CA签发证书&#xff1b;同时又不想跳过证书验证又想使用一个HTTPClient&#xff1b; 如果单单实现验证只使用自签证书或者只使用CA证书的域名比较简单&#xff1b;前者只需要new l…

【调试】pstore原理和使用方法总结

什么是pstore pstore最初是用于系统发生oops或panic时&#xff0c;自动保存内核log buffer中的日志。不过在当前内核版本中&#xff0c;其已经支持了更多的功能&#xff0c;如保存console日志、ftrace消息和用户空间日志。同时&#xff0c;它还支持将这些消息保存在不同的存储…

Avalonia 虚拟化

应用虚拟化技术是管理大量数据时优化性能的一种方法&#xff0c;特别是在使用如Avalonia这样的UI框架时。虚拟化可以帮助减少内存使用并提高应用的响应速度&#xff0c;因为它只加载用户可以看到的元素&#xff0c;而不是全部数据。以下是Avalonia中使用虚拟化的一个基本例子&a…

根据loss 曲率自动微调学习率代码示例

根据loss 曲率自动微调学习率代码示例 代码代码解析代码 from tqdm import tqdm from yan import CvFo import paddle import pandas as pd import numpy as npdef get_loss(loss):loss = np.array

JavaScript 遍历文档生成目录结构

JavaScript 遍历文档生成目录结构 要遍历 HTML 文档并生成目录结构&#xff0c;你可以使用 JavaScript 来进行 DOM 操作和遍历。以下是一个简单的示例代码&#xff0c;演示了如何遍历文档中的标题元素&#xff08;例如 <h1>、<h2>、<h3> 等&#xff09;&…

Rust基础拾遗--核心功能

Rust基础拾遗 前言1.所有权与移动1.1 所有权 2.引用3.特型与泛型简介3.1 使用特型3.2 特型对象3.3 泛型函数与类型参数 4.实用工具特型5.闭包 前言 通过Rust程序设计-第二版笔记的形式对Rust相关重点知识进行汇总&#xff0c;读者通读此系列文章就可以轻松的把该语言基础捡起来…