Linux基础IO+文件fd

news2024/11/18 5:37:56

1:文件理解

  • 文件=内容+属性,因此空文件在磁盘上也占用空间。

  • 文件用路径名+文件名作为标识文件的唯一性。

  • 对文件的操作,就是对文件的内容+属性的操作。

  • 在linux中,如果没有指定文件路径,默认在当前路径下执行操作。

总结:在c语言中调用文件操作函数的时候,即使代码没有进行链接(二进制->可执行exe文件),也不会进行对文件的操作,只有程序运行起来,才有操作。因此对文件进行操作,就是进程对文件的操作。

文件操作也就是进程和被打开文件的关系。

1.1:c语言文件操作函数

FILE* fp = fopen(wjw.c,"r");//只读方式打开文件
if(fp == NULL)
{
perror("fail open");
return 1;
}
char buffer[] = "abcd";
fwrite(p,1,strlen(buffer),fp);

与fwrite差不多。

1.2:操作系统的文件操作函数

我们使用man 2 open命令查看系统级别的open函数,

第一个参数是文件名,第二个参数是一个标记位,第三个参数是文件权限。(linux默认掩码是0002)

1.2.1:标记位

以比特位传递选项,只能有一个比特位为1,也就是1,2,4,8.....选项可以是O_WRONLY,O_RDONLY,O_RDWR,O_CREAT(没有文件的时候创建该文件),O_TRUNC(有该文件的时候,覆盖文件内容),O_APPEND(追加)。

运用|可以将多个参数一起传入。

结果如上。

1.2.2:文件权限

第三个参数如果不传入,则会导致乱码。

因为系统默认掩码umask不为0,创建出来的文件权限是664,

因此如果想让代码设置的0666就是文件权限,可以使用umask(0),文件最大权限是666,目录最大权限是777,想要知道文件的权限可以使用“拿走的思想(减去)”,但是具体的计算规则是^~umask。

1.2.3:文件操作函数

  • read和write的第一个参数都是fd,fd是文件描述符,属于内核级别的东西。buf就是想要读或者写入的文件,第三个是操作系统级别的文件大小

  • 在c语言层次,我们读文件都是要读写到\0结束,但是\0是语言提供的,与操作系统没有关系,因此操作系统在识别的时候可能会出错,因此我们在传带\0的字符串的时候,需要用sizeof减1。

1.3:文件描述符fd

可以看到文件描述符是从3开始打印的,这是什么原因呢?

实际上我们系统还有3个文件,stdin,stdout,stderr,分别对应键盘,显示器,显示器。

其实在内核系统中有这样一组结构。

task_struct就是进程pcb,pcb中存储一个struct files_struct *files 的指针,找到struct files_struct数组,在这个数组中存在一个struct file*的指针数组fd_array,数组的下标就是文件描述符,数组的元素就是每一个被打开的文件的结构体。因此stdin和stdout和stderr是默认打开的文件,占用着下标0和1和2,所以此后打开的文件下标从3开始。

  • 文件描述符的分配规则:在文件描述符表按从小到大顺序寻找最小且没有被占用的fd。

1.3:重定向

当我们关闭0对应的stdin,

输出fd是0,这就是把本来在3号位置的文件重新定向到了0号对应的地方。

当我们关闭1(stdout)的时候呢

什么也没有打印,那么内容去哪儿了?此时我们引入重定向的概念。

实际上就是fd1指向的不再是stdout,而是新的这个log.txt文件,这种方式我们可以通过重定向函数dup2完成。而重定向的本质就是每个文件描述符都是一个内核中文件描述信息数组的下标,对应有一个文件的描述信息用于操作文件,而重定向就是在不改变所操作的文件描述符的情况下,通过改变描述符对应的文件描述信息(数组中的元素)进而实现改变所操作的文件

重定向有3种

1.3.1:重定向函数dup2

dup2的第一个参数是旧的fd,第二个是新的fd,其实使用起来就是把旧的fd对应的文件描述信息(当前下标对应的元素,也就是指向的某个文件的指针file*)替换新的fd对应的文件描述信息。

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

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

相关文章

react配置环境变量

前端项目开发一般会区分三个环境: 本地环境(及开发环境)— development,测试环境 — test,生产环境 — production。 本地环境就是自己开发调试用的,一般是node起一个本地的服务,用webpack做接…

使用Python实现高效摸鱼,批量识别银行卡号码并且自动写入Excel表格

每当有新员工入职,人事小姐姐都要收集大量的工资卡信息,并且生成Excel文档,看到小姐姐这么辛苦,我就忍不住要去帮她了… 于是我用1行代码就实现了自动识别银行卡信息并且自动生成Excel文件,小姐姐当场就亮眼汪汪的看着…

如何制定一个好计划?运用SMART原则

很多人面对目标总是给自己找各种借口,为自己找理由,如没时间、做不到、没人脉、在潜意识里告诉自己还没准备好。人的天性就是逃避困难、贪图享乐,而保证执行力就是跟惰性抗争的过程。 这个世界没有好做不好的工作,只有&#xff0c…

Java Springboot+VUE前后端分离网上手机商城平台系统设计和实现以及论文报告

Java SpringbootVUE前后端分离网上手机商城平台系统设计和实现以及论文报告 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收…

闭区间连续函数的性质+习题课(函数与极限总复习)——“高等数学”

各位CSDN的uu们你们好呀,今天我们的内容依然是关于连续函数的概念和性质及相关内容,之前的博客我们学习到了函数的连续性和函数的间断点,那今天,我们便来看看闭区间上连续函数的性质,好的,接下来就让我们进…

Webpack麻烦你不要靠的那么近,我怕Vite误会

某天,实施人员,让我修复了一个小问题,并需要快速的发布到正式环境上,我三下五除二修改了问题;开始了打包发布,以前并没有怎么注意到启动的问题,然而这次比较急,想在用户看到之前发布…

Java之初入JDBC-连接数据库

之前我们学完了Mysql 现在我们要学习怎么用JAVA来操作Mysql数据库(JDBC不止能操作Mysql还能操作如Redis等数据库) 概述 JDBC原理图 大致我们java语言开发者,指定一个接口 这个接口-包含了对数据库基本操作 然后不同数据库的开发厂商&#x…

HTML中引入CSS样式的第二种方式:样式块

<!-- 第二种方式&#xff1a;在head标签中使用style块&#xff0c;这种方式被称为样式块方式。 语法格式&#xff1a; <head> <style type"text/css"> 选择器 { …

Ragnar-lothbrok靶机总结

Ragnar-lothbrok靶机渗透总结 靶机下载地址: https://download.vulnhub.com/ragnarlothbrok/Ragnar-lothbrok.ova 打开靶机,使用nmap扫描出靶机的ip和所有开放的端口 可以看到靶机开放了21端口,80端口,443端口,3306端口 一般开放21端口,我们可以先尝试ftp的匿名登录 可以看到…

MySQL详解(一)——基础 1.0

MySQL基础 1. 数据库概述 1.1 什么是数据库 数据库是持久化数据的一种介质&#xff0c;可以理解成用来存储和管理数据的仓库&#xff01; 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。持久化的大多数时候是将内存中的数据存储在数据库中&…

CompletableFuture实现异步编排

为什么需要异步执行&#xff1f; 场景&#xff1a;电商系统中获取一个完整的商品信息可能分为以下几步&#xff1a;①获取商品基本信息 ②获取商品图片信息 ③获取商品促销活动信息 ④获取商品各种类的基本信息 等操作&#xff0c;如果使用串行方式去执行这些操作&#xff0c;假…

使用Python包组织代码

使用Python包(package)组织代码Python 通过包(package)的方式来组织代码&#xff0c;包是一种特殊的模块(module)。Python 的包有两种形式&#xff0c;分别是Regular packages 和 namespace packages。所谓 Regular packages 就是指含有__init__.py的目录&#xff0c;这样的包被…

Jeston TX1TX2 A100 Ubuntu_1804_ROS 系统清理系统缓冲日志

大家好&#xff0c;我是虎哥&#xff0c;我自己的系统&#xff0c;运行一段时间后&#xff0c;出现了存储空间不足&#xff0c;详细查了一下&#xff0c;发现ROS本身就占用了大量的日志空间&#xff0c;这个当然在编程阶段&#xff0c;通过少加打印的方式来优化&#xff0c;但是…

黑群晖安装记录

老姐公司黑群晖坏了。临危受命&#xff0c;尝试拯救硬盘文件。 看起来黑群晖启动了&#xff0c;但是在管理软件找不到黑群晖IP&#xff0c;尝试了各种方法都不行&#xff0c;放弃老群晖&#xff0c;直接拯救硬盘数据&#xff0c;看官网有HDD迁移模式&#xff0c;直接把硬盘插到…

【GD32F427开发板试用】8. 脉搏监控仪

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;hehung 之前发帖 【GD32F427开发板试用】1. 串口实现scanf输入控制LED 【GD32F427开发板试用】2. RT-Thread标准版移植 【GD32F427开发板试用…

动态内存开辟必看,一篇就能学会贯通

目录 为什么存在动态内存分配 动态内存函数的介绍 1.malloc函数和free函数 2.calloc函数 3.realloc函数 常见的动态内存错误 经典的笔试题 柔性数组 今天来介绍一下动态内存&#xff0c;让我们直入主题&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 为…

【Cocos新手入门】cocos creator 的研发思路和工具操作说明

本篇文章主要讲解cocos creator 的研发思路和工具操作说明 作者&#xff1a;任聪聪 日期&#xff1a;2023年1月29日 研发思路 关于cocos creator 工具说明 首先cocos creator 是一个编辑游戏界面的窗口&#xff0c;省去了我们日常开发游戏时频繁修改参数调整动画、场景的工作…

Siam R-CNN: 通过重检测进行视觉跟踪

Siam R-CNN: 通过重检测进行视觉跟踪Siam R-CNN: Visual Tracking by Re-DetectionContributionsMethodSiam RCNNVideo Hard Example MiningTracklet Dynamic Programming Algorithm实验总结更多Ai资讯&#xff1a;公主号AiCharm Siam R-CNN: Visual Tracking by Re-Detectio…

DMETL5单机版安装使用

DMETL5安装使用 1.创建dm8数据库 使用dm数据库配置助手dbca创建数据库 2.根据dmetl在线文档创建HOTEL模式 DROP USER IF EXISTS HOTEL CASCADE; DROP TABLESPACE IF EXISTS HOTEL; CREATE TABLESPACE HOTEL DATAFILE HOTEL.DBF SIZE 150 AUTOEXTEND ON NEXT 10; CREATE USE…

基于springboot的仓库管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…