第四部分:1---文件基础理解、C语言文件操作、Linux系统文件接口、使用一个变量传递多个标志位

news2024/12/25 23:51:18

目录

文件基础理解:

文件是如何组成的?

对文件操作的本质是什么?

文件被打开的本质是什么:

进程和文件的调度关系解析:

文件被打开后如何被管理(文件描述符/文件描述符表)?

文件描述符表和三个默认打开的文件:

C语言操作文件:

C操作文件的接口:

C打开文件的方式:

系统接口操作文件:

使用一个整形变量传递多个标志位:

文件基础理解:

文件是如何组成的?

  • 文件由两部分组成:文件的内容和文件的属性。

  • 文件内容是数据,文件属性也是数据。因此,文件内部存储文件的内容数据和属性数据。

对文件操作的本质是什么?

  • 对文件的操作就是对文件内容或文件属性的操作。操作文件属性可以包括更改文件权限、修改时间戳等,而操作文件内容则是读写文件中的数据。

文件被打开的本质是什么:

  • 文件可以分为已经打开的文件和未被打开的文件。要操作的就是被打开的文件==加载到内存的文件。

  • 打开一个文件,实际上是操作系统将文件从磁盘加载到内存的过程。这个过程需要操作系统访问磁盘,将文件的数据加载到内存中,才能进行进一步的操作。

进程和文件的调度关系解析:

  • 一个进程可以打开多个文件:操作系统为每个进程维护一个文件描述符表,用来管理该进程当前打开的文件。通过这个文件描述符表,进程可以同时对多个文件进行读写操作,每个文件都有一个独立的文件描述符用于标识和管理。

  • 多个进程也可以同时打开同一个文件:文件系统支持多个进程并发访问同一个文件。在这种情况下,操作系统为每个进程创建独立的文件描述符指向同一个文件。

文件被打开后如何被管理(文件描述符/文件描述符表)?

  • 文件在被打开后,操作系统会为其创建一个专用的结构体,用来管理该文件的状态和相关信息。

  • 进程通过文件描述符表统一管理该进程打开的文件,而文件描述符表是一个数组,数组的每个元素都是一个指向文件结构体的指针,即 struct file *fd_array[]。

  • 文件描述符是一个整数,进程通过这个整数来索引文件描述符表中的文件指针。

  • 当进程打开一个文件时,操作系统会在文件描述符表中分配一个空位,将新创建的文件结构体的地址存储在该位置,并将相应的文件描述符返回给进程。

文件描述符表和三个默认打开的文件:

  • 进程在运行时默认会打开三个标准输入输出流文件,即 stdin(标准输入)、stdout(标准输出)和 stderr(标准错误输出)。这三个流通常分别对应于键盘输入、显示器输出和错误信息输出。

  • 这三个标准流占据文件描述符表的前三个位置,即下标 0、1、2。stdin 对应文件描述符 0,stdout 对应文件描述符 1,stderr 对应文件描述符 2。

  • 在 C 语言中,这三个标准流的类型都是 FILE*。FILE 类型是 C 标准库提供的一个结构体类型,用于封装文件相关的信息。

printf("stdin->fd : %d\n",stdin->_fileno); //0
printf("stdout->fd : %d\n",stdout->_fileno); //1
printf("stderr->fd : %d\n",stderr->_fileno); //2

C语言操作文件:

C操作文件的接口:

文件操作函数功能
fopen打开文件
fclose关闭文件
fputc写入一个字符
fgetc读取一个字符
fputs写入一个字符串
fgets读取一个字符串
fprintf格式化写入数据
fscanf格式化读取数据
fwrite向二进制文件写入数据
fread从二进制文件读取数据
fseek设置文件指针的位置
ftell计算当前文件指针相对于起始位置的偏移量
rewind设置文件指针到文件的起始位置
ferror判断文件操作过程中是否发生错误
feof判断文件指针是否读取到文件末尾

C打开文件的方式:

C 打开文件的方式有:w、w+、r、r+、a、a+。这些模式决定了文件的打开方式以及读写权限。
w如果文件不存在,首先创建该文件,然后再打开。如果文件已经存在,打开文件后会清空文件中的所有内容==文件大小变为零。
w+以读写模式打开文件。在w的基础上加了写模式。
r只读模式打开文件。如果文件不存在,r 会返回错误并且不会创建文件。如果文件存在,r 允许读取文件内容,但不允许写入。
r+以读写模式打开文件。在r的基础上加了写模式。
a以追加模式打开文件。如果文件不存在,a 会创建文件;如果文件已经存在,a 打开文件时不会清空原有内容。任何新写入的数据都会被追加到文件末尾,保持文件中的原始数据不被修改。
a+以读写和追加模式打开文件。在a的基础上加了可以读取文件的功能。
FILE* fp = fopen("log.txt", "r"); //打开文件
if (fp == NULL) //判断是否成功打开
{
    perror("fopen");
    return 1;
}

//...文件的访问逻辑

fclose(fp); //使用完文件后关闭

 

系统接口操作文件:

  • 打开文件只能由操作系统完成,之前的c的函数打开文件就是对系统调用的封装。

#include <sys/types.h>//调用系统接口需要包含的三个头文件
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode); //返回值:打开成功返回文件描述符,否则返回-1
//pathname: 要打开或创建的目标文件。
//flags: 打开文件时,可以传入多个参数选项,用一个或者多个常量进行“或”运算,构成flags。
//mode_t mode:在文件不存在时,如果需要创建后打开,则要使用这个参数指定文件的访问权限

O_RDONLY: 只读打开 
O_WRONLY: 只写打开 
O_RDWR : 读,写打开  //这三个常量,必须指定一个且只能指定一个 

O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限 
O_APPEND: 追加写
    
int fd = open("myfile", O_WRONLY|O_CREAT, 0644);
  • 发现w的功能相当于封装了O_WRONLY|O_CREAT,所以可以推得:C打开文件的方式实际就是对系统接口常量的封装。

使用一个整形变量传递多个标志位:

  • 一个整型变量有32个比特位,如果要一次传递多个标志位,就能够每次使用32位中的一位实现一个int类型最多可以传递31个标志位。

#include<stdio.h>
#define T1 1
#define T2 (1<<1)
#define T3 (1<<2)
#define T4 (1<<3)

void print(int flags) //使用一个int整形接收多个标志位
{
    if(flags & T1) printf("T1\n"); //判断标志位对应位置是否为1
    if(flags & T2) printf("T2\n");
    if(flags & T3) printf("T3\n");
    if(flags & T4) printf("T4\n");    
}

int main()
{
    print(T1);
    print(T2);
    print(T3);
    print(T4);
    print(T1 | T2);
    return 0;
}

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

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

相关文章

深度学习——基础知识

深度学习的重点在于优化&#xff0c;其中很重要的步骤在于如何调参&#xff0c;会涉及到一些微积分等数学知识。不同于以往接触到的数值运算&#xff0c;深度&#xff08;机器&#xff09;学习都是关于张量Tensor&#xff08;向量&#xff09;的计算&#xff0c;Python中最常用…

【oj刷题】滑动窗口篇:滑动窗口的应用场景和注意事项

前言&#xff1a; 滑动窗口其实基本原理还是双指针&#xff0c;但在双指针中左右指针可能会有回退操作&#xff0c;而滑动窗口的左右指针只会向前走&#xff0c;不会回退&#xff0c;下面就来讲解一下滑动窗口的概念和具体操作&#xff08;主要是例题讲解&#xff09; 目录 一、…

【 Linux】基础命令及常用小技巧

文章目录 Linux基础命令常用小技巧基本命令pwd : print work directory 打印当前的工作目录cd : change driectory 改变当前工作目录ls: list 查看指定目录下的文件mkdir: make directory 创建目录 文件操作命令查找命令管道命令和过滤命令wc : word count 单词统计echo 输出命…

Hotohiko Sakamoto算法,以及用其计算星期几【算法 15】

探索Hotohiko Sakamoto算法&#xff1a;构建素数排列的奥秘 在算法领域&#xff0c;Hotohiko Sakamoto算法以其独特的构造方式和深刻的数学背景&#xff0c;吸引了众多算法爱好者和研究者的关注。本文将带您一起探索Hotohiko Sakamoto算法的核心思想&#xff0c;了解它是如何构…

深度学习_GPT2Block详解(casual attention)

一、GTP2Block 整体结构 1.1 block准备 import torch from torch import nn from transformers import GPT2Model, GPT2Config from transformers.models.gpt2.modeling_gpt2 import GPT2Blockcfg GPT2Config() print(cfg.add_cross_attention) blk GPT2Block(cfg, layer_…

“汉语新解” Prompt新高度,火爆的李继刚

“汉语新解” prompt 是由李继刚设计的一个用于启发人工智能模型进行创意性文本生成的指令模板。这个 prompt 的设计初衷是为了让AI能够以一种独特的方式解析和重新诠释常见的中文词汇&#xff0c;从而产生出具有深刻洞察力和幽默感的文本内容&#xff0c;仿佛是由鲁迅或林语堂…

Linux线程同步:深度解析条件变量接口

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f351;Linux线程同步&#x1f409;条件变量---实现线程同步&#x1f4a7;同步概念与竞态条件&#x1f406;条件变量接口*初始…

sqli-labs靶场自动化利用工具——第13关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生&#xff0c;或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢&#xff1f;可能有些人会说不是有sqlmap&#…

每日OJ_牛客_马戏团(模拟最长上升子序列)

目录 牛客_马戏团&#xff08;模拟最长上升子序列&#xff09; 解析代码 牛客_马戏团&#xff08;模拟最长上升子序列&#xff09; 马戏团__牛客网 搜狐员工小王最近利用假期在外地旅游&#xff0c;在某个小镇碰到一个马戏团表演&#xff0c;精彩的表演结束后发现团长正和大…

《基于深度半监督学习的目标检测综述》泛读

基于深度半监督学习的目标检测方法分为 1、生成式方法 2、一致性正则化方法 3、基于图的方法 4、伪标记方法和混合方法 然后基于常用数据集 对典型方法进行了性能对比&#xff0c;最后分析了其挑战和发展趋势&#xff0c;旨在为相关研究提供参考 收获就是&#xff1a; 1…

Redis -- 全记录(面试)

目录 All : 缓存穿透 缓存击穿 互斥锁 逻辑过期 比较 : 缓存雪崩 redis怎么和数据库保持一致 双写一致性 : 延迟双删 : 保证强一致性 : 允许一定的延迟 基于mq的异步通知 基于Canal的异步通知 总结 Redis的持久化 RDB AOF 总结 Redis数据过期策略 惰性删除…

【算法专题】搜索算法

二叉树剪枝 LCR 047. 二叉树剪枝 - 力扣&#xff08;LeetCode&#xff09; 本题要求我们将全部为0的二叉树去掉&#xff0c;也就是剪枝&#xff0c;当我们举一个具体的例子进行模拟时&#xff0c;会发现&#xff0c;只关注于对其中一个子树的根节点进行剪枝&#xff0c;由于我…

Docker部署MySQL8.0.39报错解决方案

Docker部署MySQL8.0.39报错解决方案 2024-09-11T06:09:09.317582Z 0 [Warning] [MY-010139] [Server] Changed limits: max_open_files: 1024 (requested 8161) 2024-09-11T06:09:09.317586Z 0 [Warning] [MY-010142] [Server] Changed limits: table_open_cache: 431 (reques…

李彦宏内部讲话曝光,谈大模型三大认知误区:智能体还是非共识

“外界对大模型有相当多的误解&#xff0c;”近日据媒体报道&#xff0c;李彦宏的一则内部讲话曝光。在最近一次和员工交流中&#xff0c;李彦宏谈及三个大模型认知误区&#xff0c;涵盖了大模型竞争、开源模型效率、智能体趋势等热点话题。 李彦宏认为未来大模型之间的差距可…

【Axure教程】高级搜索

高级搜索可以通过使用精确的关键词或短语&#xff0c;帮助用户找到特定的内容。尤其在面对大量搜索结果时&#xff0c;通过过滤条件缩小范围&#xff0c;能够节省时间。他允许用户使用多个条件进行组合&#xff08;例如条件匹配、模糊搜索、区间筛选等&#xff09;来精准获取相…

购物车装载状态检测系统源码分享

购物车装载状态检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

瑞幸卖奶茶,霸王茶姬不慌

瑞幸和霸王茶姬&#xff0c;打不起来。 转载定焦&#xff08;dingjiaoone&#xff09;原创 作者 | 苏琦 编辑 | 魏佳 最近&#xff0c;瑞幸因为联名游戏大作《黑神话&#xff1a;悟空》无法核销套餐被骂上热搜&#xff0c;但业内人士更关注的&#xff0c;是它不久前推出的轻乳…

【网络安全】-rce漏洞-pikachu

rce漏洞包含命令执行漏洞与代码执行漏洞 文章目录 前言 什么是rce漏洞&#xff1f; 1.rce漏洞产生原因&#xff1a; 2.rce的分类&#xff1a; 命令执行漏洞&#xff1a; 命令拼接符&#xff1a; 常用函数&#xff1a; 代码执行漏洞&#xff1a; 常用函数&#xff1a; 分类&…

AI算力池化技术助力运营商打造智算生态

数字经济时代&#xff0c;算力已成为国民经济发展的重要基础设施。随着数字化转型的不断深入和人工智能技术的广泛应用&#xff0c;构建以新型智算中心为核心的智能算力生态体系正驱动着数字经济快速发展&#xff0c;成为人工智能赋能千行百业的重中之重。 2022年2月&#xff…

Vulnhub-RickdiculouslyEasy靶场(9个flag)

flag1 端口9090有一个flag flag2 13337端口 flag3 使用dirb进行扫描网站的80端口&#xff0c;发现一些敏感文件 访问80端口&#xff0c;没有发现有效信息 访问passwords目录 访问FLAG.txt 再返回访问passwords.html文件 查看页面源代码发现一个密码 flag4 之前扫描到了robo…