Linux中的文件描述符

news2024/11/21 0:13:41

目录

文件描述符

 系统调用 open

 为什么fd从3开始呢?

 为什么是0,1,2,3...呢?

文件描述符分配规则 

系统调用 close

系统调用 wirte

系统调用 read


文件描述符

在了解文件描述符之前,先了解关于操作文件的系统调用,C语言中的fwrite,fread等等对文件操作的函数不是系统调用,而是C语言对系统调用做的封装。

语言为什么对系统调用封装?

1.原生的系统接口,使用成本较高

2.不同系统系统接口不同,直接使用接口,语言不具备跨平台性

什么是跨平台性?

C语言穷举了所有OS系统的底层接口并进行条件编译去封装不同系统的系统调用,就让C语言写的程序在不同的OS下都能正常编译运行,就称C语言具有跨平台性。

 系统调用 open

参数含义是:open(文件路径,打开方式,权限) 

参数flag表示打开方式,用宏传递,有O_RDONLY只读,O_WRONLY只写,O_RDWR读写三者取一,可加O_CREAT,O_TRUNC等,添加参数时用 | 的方式,因为系统调用传递标记位,是位图结构来传递的,简单来说不同的比特位具有不同的含义,或上不同的宏就是给不同位标记。

参数mode表示权限传递八进制数字,比如0666就可以了,如果要防止系统默认权限掩码影响,可以先调用umask函数修改权限。

返回值:返回文件描述符,-1返回值代表错误

使用示例:

输出:

 为什么fd从3开始呢?

因为0表示标准输入,1表示标准输出,2表示标准错误,当程序运行的时候,这三个文件已经被默认打开了,在C语言封装的结构体FILE中就有fileno成员就是表示文件描述符,比如下面代码输出:

 为什么是0,1,2,3...呢?

内核中用struct file结构体描述被打开的 文件(被打开的文件在内存中),进程pcb中有struct files_struct *files指针,指向描述进程打开文件的结构体,结构体中有struct file*fd_array[]指针数组存放指针,指针指向内核打开的文件,内核打开的文件被OS用链表维护起来。

文件描述符分配规则 

从头遍历fd_array[]数组,找到一个最小的没有被使用的下标,比如关闭1号文件,打开新文件的文件描述符是1,往1文件中打印则会往新文件打印,先写到了缓冲区(语言级别)中 ,加\n也不刷新,因为写到磁盘的刷新策略是全缓冲,所以程序运行中除非强制刷新否则不刷新,程序退出会刷新。

使用系统调用dup2也可以完成上述的重定向操作,拷贝文件描述符对应的内容(本质是拷贝内核文件结构体指针),最终指向同一个文件 

注意:int dup2(int oldfd,int newfd) ,是将oldfd的内容拷贝到newfd,最后只剩oldfd,往newfd输出就会输出到oldfd文件,这就是输出重定向。

系统调用 close

函数原型:int close(int fd),参数就是要关闭的文件的文件描述符

注意,这里的关闭是进程关闭了文件,管理文件结构体的释放是OS的工作,文件内核结构中用计数器存储文件被打开的次数,进程关闭只需将指针数组对应下标内容改成NULL,并将计数器--即可。

系统调用 wirte

从buf中写入fd文件中,写入count字节,返回值类型是ssize_t表示有符号整数,写入失败就返回-1,写入成功就返回写入的个数。

系统调用 read

 返回值

>0,返回读取个数

=0 表示读取到了EOF

<0 读取失败

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

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

相关文章

Spring Cloud整体架构

Spring Cloud的中文名我们就暂且称呼它为“春云”吧&#xff0c;听上去是多么朴实无华的名字&#xff0c;不过呢一般名字起的低调的都是厉害角色&#xff0c;我们就看看Spring Cloud都提供了哪些靠谱功能吧。 技多不压身 我们前面说过&#xff0c;Spring Cloud是一款微服务架…

Aspect-based Sentiment Analysis with Opinion Tree Generation 论文阅读笔记

一、作者 Xiaoyi Bao、Wang Zhongqing、 Xiaotong Jiang、 Rong Xiao、Shoushan Li Natural Language Processing Lab, Soochow University, Suzhou, China Alibaba Group, Hangzhou, China 二、背景 作为细粒度的情感分析任务&#xff0c;ABSA 涉及了多个基本情感元素&am…

(八)汇编语言——数据处理的两个基本问题

目录 用于内存寻址的寄存器 bp 组合 两个基本问题 数据位置 立即数 寄存器 内存 数据长度 除法指令 dup指令 总结 接下来&#xff0c;我们要处理的是有关数据处理的两个基本问题&#xff0c;那么这两个基本问题是什么呢&#xff1f;我们先告诉大家这两个问题&#…

《操作系统-真象还原》15. 系统交互

文章目录fork 的原理与实现简介什么是 forkfork 的实现思路代码get_a_page_without_opvaddrbitmapcopy_pcb_vaddrbitmap_stack0copy_body_stack3build_child_stackupdate_inode_open_cntscopy_processsys_fork添加 fork 系统调用与实现 init 进程添加 fork 系统调用实现 init 进…

计算机网络复习之DL层(数据链路层)与LAN(Local Area Network局域网)

文章目录封装成帧透明传输字符计数法字符填充法零比特填充法违规编码法差错控制透明网桥网桥自学习转发表网桥的自学习和转发帧的步骤透明网桥工作原理交换机/路由器的广播域、冲突域冲突域广播域交换机/路由器的两域区别CSMA/CD协议PPP协议HDLC协议PPP和HDLC的对比简述IEEE802…

2. 数据类型、向量、向量索引、向量修改、向量运算

课程视频链接&#xff1a;https://www.bilibili.com/video/BV19x411X7C6?p1 本笔记参照该视频&#xff0c;笔记顺序做了些调整【个人感觉逻辑顺畅】&#xff0c;并删掉一些不重要的内容 系列笔记目录【持续更新】&#xff1a;https://blog.csdn.net/weixin_42214698/category_…

【学习】Q learning、Q-learning for continuous actions、关于深度学习的猜想

文章目录一、Q learning评估状态值函数Vπ(s)MCTDdouble DQNdueling DQNprioritized replymulti-stepnoisy netdistributionalrainbow二、Q-learning for continuous actions三、关于深度学习的猜想一、Q learning value-based的方法&#xff0c;评论家不会直接决定行动。给定…

低度酒“百家争鸣”,谁能俘获年轻人的芳心?

【潮汐商业评论/原创】随着消费升级和女性消费力量的崛起&#xff0c;“她经济”逐渐成为新零售消费环境下一道“靓丽风景线”。女性消费者的消费偏好和消费习惯&#xff0c;正在促使低度酒、食品、服装、护肤、美妆、家居、育儿等行业发生新的变革。特别是酒水市场&#xff0c…

Spring Boot学习篇(八)

Spring Boot学习篇(八) 1.thymeleaf模板引擎使用篇(二) 1.1 配置通过地址栏直接访问html页面 1.1.1 在zlz包下创建filter包,其目录结构如下所示 1.1.2 在filter包下创建HTMLFilter类,其内容如下所示 package com.zlz.filter;import javax.servlet.*; import javax.servlet.…

启用分页机制

前言 本博客记录《操作系统真象还原》第五章第2个实验的操作~ 实验环境&#xff1a;ubuntu18.04VMware &#xff0c; Bochs下载安装 实验内容&#xff1a;启动内存分页机制 实验原理&#xff1a;内存分页机制 前置知识 前置知识可食用内存分页机制 代码 include/boot.in…

UML类图入门实战

介绍 UML——Unified modeling language UML (统一建模语言)&#xff0c;是一种用于软件系统分析和设计的语言工具&#xff0c;它用于帮助软件开发人员进行思考和记录思路的结果。 UML 本身是一套符号的规定&#xff0c;就像数学符号和化学符号一样&#xff0c;这些符号用于描述…

设计模式学习(二):Adapter适配器模式

一、什么是Adapter模式我们先举个例子&#xff1a;如果想让额定工作电压是直流12V的笔记本电脑在交流220V的电源下工作&#xff0c;应该怎么做呢?通常&#xff0c;我们会使用适配器&#xff0c;将家庭用的交流220V电压转换成我们所需要的直流12V电压。这就是适配器的工作&…

Hive数据仓库简介与安装

文章目录Hive数据仓库简介及安装配置一、数据仓库简介1. 什么是数据仓库2. 数据仓库的结构1&#xff09;数据源2&#xff09;数据存储与管理3&#xff09;OLAP服务器4&#xff09;前端工具3. 数据仓库的数据模型1&#xff09;星状模型2&#xff09;雪花模型二、Hive简介1. 什么…

【踩坑总结】解决pycharm下载依赖一直失败的问题

目录前言正文问题复现问题本质解决方案补充总结检查是否安装成功下载的依赖存在哪总结前言 pycharm下载依赖失败这个问题对于我来说已经是个老生常谈的问题&#xff0c;与之共交手三次。 首次交锋是在大二利用 树莓派 做图像采集传输时&#xff0c;在树莓派的ubantu上使用pyt…

docker 容器使用 loki 插件收集日志

相关资料: The log-opts in the /etc/docker/daemon.json is not relaoded - General Discussions - Docker Community ForumsRecently I want to use loki-log-driver to ship logs to the loki server. The docker-deamon is controlled by systemd. The /etc/docker/daemon…

Day2 Spring

1 BeanFactory 与ApplicationContext的关系BeanFactory与ApplicationContext的关系BeanFactory是Spring的早期接口&#xff0c;称为Spring的Bean工厂&#xff0c;ApplicationContext是后期更高级接口&#xff0c;称之为Spring 容器;ApplicationContext在BeanFactory基础上对功能…

Pytorch 多层感知机

一、什么是多层感知机 多层感知机由感知机推广而来&#xff0c;最主要的特点是有多个神经元层&#xff0c;因此也叫深度神经网络(DNN: Deep Neural Networks)。 二、如何实现多层感知机 1、导入所需库并加载fashion_mnist数据集 %matplotlib inline import torch import to…

java弹幕视频网站源码

简介 Java基于ssm的弹幕视频系统&#xff0c;用户注册后可以上传视频进行投稿&#xff0c;也可以浏览视频发送弹幕&#xff0c;在个人中心管理视频、管理弹幕、管理评论等。管理员可以管理视频弹幕评论&#xff0c;查看统计图。 演示视频&#xff1a; https://www.bilibili.c…

CVE-2020-0014 Toast组件点击事件截获漏洞

文章目录前言漏洞分析组件源码触摸属性漏洞利用POC分析漏洞复现漏洞修复总结前言 Toast 组件是 Android 系统一个消息提示组件&#xff0c;比如你可以通过以下代码弹出提示用户“该睡觉了…”&#xff1a; Toast.makeText(this, "该睡觉了…", Toast.LENGTH_SHORT)…

C语言文件操作-从知识到实践全程

目录 引入 文件的打开和关闭 文件如何使用程序来打开? 绝对路径需要转义字符 fopen函数 fclose函数 文件的打开方式(fopen第二参数const char* mode): 文件的顺序读写 fgetc和fputc的使用 fputc fgetc fgets和fputs的使用 fputs fgets perror的使用 fprint…