Linux中的文件描述符

1.系统调用接口和库函数的关系

  1. 函数:fopen fclose fread fwrite 都是c标准库当中的函数,也就是用户操作接口中ibc
  2. 系统调用:open close read write 都是系统调用提供的接口

c语言中接口底层封装的都是系统调用接口

FILE* stdin stdout stderr  都是c语言封装的结构体,必定封装特定文件描述符fd

2.文件描述符fd

文件描述符fd(File Descriptor) 是一个用于表示打开文件、套接字、管道或设备等资源的整数。在Linux中,所有执行I/O操作的系统调用都通过文件描述符来完成。

文件描述符的主要用途是允许程序对文件进行各种操作,如读写、关闭等。在程序刚启动的时候,默认有三个文件描述符,分别是:

  • 0:标准输入(stdin)
  • 1:标准输出(stdout)
  • 2:标准错误(stderr)

这些文件描述符都是预定义的,可以直接使用。

在Linux系统中,文件描述符是一个非负整数,用于指代被打开的文件。所有执行I/O操作的系统调用都通过文件描述符来完成。程序刚刚启动的时候,默认有三个文件描述符,分别是0(代表标准输入),1(代表标准输出),2(代表标准错误)。如果此时去打开一个新的文件,它的文件描述符会是3。

当我们创建文件时,操作系统要创建相应的数据结构来描述目标文件,结构体file就表示一个已经打开的文件对象。进程要调用open打开文件,需要通过PCB(task_struct)中的file*,找到指向的一张表file_struct,这个表最重要有一个指针数组,每一个指针指向file。本质上,文件描述符就是这个数组的下标,拿着文件描述符就可以找到对应的文件。 


Linux下一切皆文件 

struct file中除了上面的变量之外,其实还有函数指针,指向一个一个硬件的读(read)写(write)方法,通过结构体file就可以调用硬件,所以在Linux下一切皆文件。

3.dup2系统调用 

dup2 是一个在 Linux 系统中常用的系统调用,用于复制一个已存在的文件描述符,使其引用另一个文件描述符。如果目标文件描述符(第二个参数)已经打开,那么 dup2 会先关闭它,然后再进行复制操作。

  • 如果oldfd不是有效的文件描述符,调用失败,不关闭newfd
  • 如果oldfd是有效的文件描述符,newfd是和oldfd一样的,然后dup2()什么都不做,并且返回newfd 

本质就是用oldfd覆盖newfd

4. 模拟c语言的文件函数

c语言中当调用fwirte/printf/fputs函数时,其实是写入c语言自带的缓冲区,当遇到换行或者自带的缓冲区满了就会调用write系统接口,再写入文件的缓冲区。在减少fwrite时,减少调用write的调用,聚集数据一次性拷贝,调高整体效率,有效的提高c的使用效率。

缓冲区就是一块内存空间,本质就是用空间换取时间

  • 定义了一个结构体MyFILE,定义字符数组表示缓冲区,pos存储了多少数据,cap表示最大容量,fileno表示文件描述符,flushmode表示刷新模式(NONE_FLUSHLINE_FLUSHFULL_FLUS)。
  • my_open函数用于打开文件,设置一下掩码为0(umask的解释在这篇文章),通过调用open返回fd,然后为MyFILE动态开辟空间。
  • my_fflush函数用于刷新缓冲区,把缓冲区的数据通过系统调用写入文件的缓冲区。内核会在适当的时候(例如,当缓冲区满时,或者当显式请求刷新缓冲区时)将数据从内核缓冲区写入磁盘。
  • my_write函数把数据写入缓冲区中
#include <stdio.h>
#include <string.h>#define MAXCAP 1024
#define NONE_FLUSH (1<<1)//不缓冲
#define LINE_FLUSH (1<<2)//行缓冲 
#define FULL_FLUSH (1<<3) //全缓冲typedef struct MyFILE
{char buffer[MAXCAP];//缓冲区int pos;//存储了多少数据int cap;//容量是多少int fileno;int flushmode;//刷新模式}MyFILE;MyFILE* my_fopen(const char *path, const char *mode)
{umask(0);int fd = -1;if(strcmp(mode,"r")==0)fd = open(path,O_RDONLY);else if(strcmp(mode,"w")==0)fd = open(path,O_WRONLY|O_TRUNC|O_CREAT,0666);else if(strcmp(mode,"a")==0)fd = open(path,O_WRONLY|O_APPEND|O_CREAT,0666);else    return NULL;MyFILE* fp = (MyFILE*)malloc(sizeof(MyFILE));if(fp==NULL)    return NULL;fp->fileno = fd;fp->pos = 0;fp->cap = MAXCAP;fp->flushmode = LINE_FLUSH;return fp;
}void my_fflush(MyFILE* fp)
{if(fp->pos==0)  return;write(fp->fileno,fp->buffer,fp->pos);fp->pos = 0;}size_t my_fwrite(const void *ptr, size_t size,MyFILE* fp)
{memcpy(fp->buffer,ptr,size);fp->pos += size;//每次写入增加size长度if((fp->flushmode & LINE_FLUSH) && fp->buffer[fp->pos-1] == '\n')my_fflush(fp);else if((fp->flushmode&LINE_FLUSH) && fp->pos == fp->cap)my_fflush(fp);return size;}void my_fclose(MyFILE *fp)
{close(fp->fileno);free(fp); 
}

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

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

相关文章

[POI2008] STA-Station/洛谷P3478(树形dp)

[ P O I 2008 ] S T A − S t a t i o n ( 树形 d p ) \Huge{[POI2008] STA-Station(树形dp)} [POI2008]STA−Station(树形dp) 题目链接&#xff1a;[P3478 POI2008] STA-Station - 洛谷 文章目录 题意思路标程 题意 给定一个 n n n个点的树&#xff0c;请求出一个结点&#…

js无感删除url搜索部分,不刷新页面

如&#xff1a;把下面的网址 http://127.0.0.1:5173/?code3b9cc36e&state 改成 http://127.0.0.1:5173 history.pushState(null, 网站标题, location.origin)

TikTok越狱检测之二 <调试器检测>

来了&#xff0c;调试器检测。总结如下,多多指教: 检测app 是否被附加调试: 原理就是检测父进程是否 launchd启动&#xff0c;在OS X和iOS 系统中&#xff0c;用户环境始于launchd&#xff0c;为用户态出现的第一个进程&#xff0c;为所有的进程的祖先&#xff0c;launchd 的进…

Python模块、包和异常处理

大家好&#xff0c;在当今软件开发领域&#xff0c;Python作为一种简洁、易读且功能强大的编程语言&#xff0c;被广泛应用于各种领域。作为一名测试开发工程师&#xff0c;熟练掌握Python的模块、包和异常处理是提高代码可维护性和错误处理能力的关键。本文将和大家一起探讨Py…

SAP-MRP和采购申请

1、如果采购申请是手工创建的,跑MRP会不会被覆盖? 创建一个采购申请18089476,然后运行MRP-MD03,再用MD04查看下 从上图看,手工创建的采购申请被打上*号,没有被覆盖掉。 2、如果采购申请被审批了,会不会被覆盖掉? 首先创建一个独立需求MD61 然后库存消耗掉为0,运行M…

shell实现ssh服务防止暴力破解 —— 筑梦之路

实现原理 对系统登陆日志文件/var/log/secure&#xff0c;进行数据筛选&#xff0c;查找登陆失败的ip地址&#xff0c;然后将ip加入到黑名单中。 脚本内容 #!/bin/bash# 获取登陆失败的ip地址failedcat /var/log/secure|grep "Failed"|awk {print $11}|sort|uniq …

普源精电收购耐数电子——用“钞能力”拿下“量子”?

「量子市界」聚焦量子前沿&#xff0c;揭秘市场动态┃2024年4月30日&#xff0c;普源精电新增“量子科技”概念。 似乎一夜之间&#xff0c;新增“量子科技”概念的上市企业如雨后春笋般登场——普源精电就是其一。普源精电本就持有耐数电子32.26%股权&#xff0c;于4月2日发布…

c4d云渲染是工程文件会暴露吗?

在数字创意产业飞速发展的今天&#xff0c;C4D云渲染因其高效便捷而备受欢迎。然而&#xff0c;随着技术应用的深入&#xff0c;人们开始关注一个核心问题&#xff1a;在享受云渲染带来的便利的同时&#xff0c;C4D工程文件安全吗&#xff1f;是否会有暴露的风险&#xff1f;下…

【如何让论文中摘要后面的内容不出现在目录中】

首先选择摘要二字&#xff0c;设置为一级标题&#xff0c;然后选择摘要后面的内容设置为正文样式&#xff0c;再选择这一部分看一下是不是都是正文大纲级别&#xff0c;如果是那就可以了。 具体流程如下 1、选择摘要二字&#xff0c;设置为一级标题样式 2、选择摘要后面的文…

x264 码率控制原理:rate_estimate_qscale 函数

rate_estimate_qscale 函数 原理 函数功能:根据目前使用的实际比特数更新一帧的qscale;是一个复杂的决策过程,需要考虑多种因素,如帧类型、编码的复杂度、目标比特率、缓冲区大小等,以确保视频质量和文件大小之间的平衡。函数参数分析:x264_t *h :编码器上下文信息结构…

扩散模型学习1

DDPM 总体训练原理 https://www.bilibili.com/video/BV1nB4y1h7CN/?spm_id_from333.337.search-card.all.click&vd_sourcef745c116402814185ab0e8636c993d8f 讲得很好&#xff1a;每次都是输入t和noise-x的图像&#xff0c;预测noise之后得到和加入的noise比较&#xff1b…

LLM实战:当网页爬虫集成gpt3.5

1. 背景 最近本qiang~关注了一个开源项目Scrapegraph-ai&#xff0c;是关于网页爬虫结合LLM的项目&#xff0c;所以想一探究竟&#xff0c;毕竟当下及未来&#xff0c;LLM终将替代以往的方方面面。 这篇文章主要介绍下该项目&#xff0c;并基于此项目实现一个demo页面&#x…

Java并发: 锁和同步

在Java并发: 面临的挑战那一篇中我们提到锁和同步是实现并发安全(可见性/原子性)的方法之一。这一章我们来讲讲Java中的锁和同步的各种工具&#xff0c;包括: LockSupportAbstractQueuedSynchronizerJava内置的锁实现 1. LockSupport LockSupport是基于Unsafe的park/unpark实…

智能禁区监控:计算机视觉在人员禁区闯入检测中的应用

基于视觉分析的人员禁区闯入行为检测算法主要依赖于计算机视觉技术和深度学习算法。这些技术结合高性能的摄像头和图像处理硬件&#xff0c;实现了对监控区域内人员行为的自动识别和分析。具体来说&#xff0c;这种检测算法利用摄像头捕捉的视频数据&#xff0c;通过深度学习模…

Kubernetes 应用滚动更新

Kubernetes 应用版本号 在 Kubernetes 里&#xff0c;版本更新使用的不是 API 对象&#xff0c;而是两个命令&#xff1a;kubectl apply 和 kubectl rollout&#xff0c;当然它们也要搭配部署应用所需要的 Deployment、DaemonSet 等 YAML 文件。 在 Kubernetes 里应用都是以 …

nssctf——web

[SWPUCTF 2021 新生赛]gift_F12 1.打开环境后&#xff0c;这里说要900多天会有flag&#xff0c;这是不可能的 2.f12查看源码&#xff0c;然后在html中查找flag &#xff08;在最上方的栏目中&#xff0c;或者按ctrlf&#xff09; [SWPUCTF 2021 新生赛]jicao 1.打开环境是一段…

Fragment问题:java.lang.IllegalStateException

错误提示&#xff1a; Process: com.example.accountapp, PID: 3987 java.lang.IllegalStateException: Could not execute method for android:onClick …

Vue速成学习笔记

这两天速成了一下Vue&#xff0c;在这里记录一下相关的笔记&#xff0c;之后有时间详细学Vue的时候再来回顾一下&#xff01; 一、Vue理解 1、Vue的核心特征&#xff1a;双向绑定。 在网页中&#xff0c;存在视图和数据。在Vue之前&#xff0c;需要使用JavaScript编写复杂的逻…

web前端面试题

web前端面试题 1、前端如何实现优化性能 (1)减少网络时间 ①使用DNS缓存技术 ​ ②减少需要传输的文件尺寸 ​ ③加快文件传输速度 (2)减少发送的请求数量 ①利用浏览器缓存 ​ ②使用合并的图片文件 (3)提高浏览器下载的并发度 ①JS文件放在HTML文档最后 ​ ②使用多个域名 (…

音视频及H264/H256编码相关原理

一、音视频封装格式原理&#xff1a; 我们播放的视频文件一般都是用一种封装格式封装起来的&#xff0c;封装格式的作用是什么呢&#xff1f;一般视频文件里不光有视频&#xff0c;还有音频&#xff0c;封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式&#…