Linux基础--文件描述符

news2024/10/7 10:14:56

目录

一.C文件接口

1.hello.c写文件

2.hello.c读文件

3.输出信息到显示器

二、系统文件I/O

0.系统调用和库函数

1.open

2.write

3.read

4.close

三、文件描述符fd

1. 0 & 1 & 2

2.文件描述符分配规则

3.重定向

4.使用dup2系统调用

四、FILE



一.C文件接口

1.hello.c写文件

#include<stdio.h>
#include<string.h>


int main()
{
    FILE * fp = fopen("file","w");
    if(!fp)
    {
        printf("error");
    }

    const char * msg = "hello";
    int count = 5;
    while(count--)
    {
        //fwrite(const void * buffer,size_t size, size_t count, FILE * stream) 
        //buffer 数据存储的地址,size 读取的字节大小 count 要读多少个字节 stream 等待被写入的资源
        fwrite(msg,strlen(msg),1,fp);
        //返回值:返回写入元素的个数
    }

    fclose(fp);
    return 0;
}

2.hello.c读文件

#include<stdio.h>
#include<string.h>


int main()
{
    FILE * fp = fopen("file","r");
    if(!fp)
    {
        printf("fopen error");
    }

    char buf[1024];
    const char * msg = "hello";
    while(1)
    {
        //size_t fread(void * buffer, size_t size, size_t count, FILE * stream)
        //将stream中的文件读取count个size字节到buffer中
        ssize_t s = fread(buf,1,strlen(msg),fp);
        if(s > 0)
        {
            buf[s] = 0;
            prinf("%s",buf);
        }

        if(feof(fp))
            break;

    }

    fclose(fp);
    return 0;
}

3.输出信息到显示器

int fprintf(FILE * stream, cosnt char * format, ...)
stream是文件指针,表示要输出到的文件
format是格式化字符串
返回值是成功输出的字符个数

二、系统文件I/O

0.系统调用和库函数

fopen,close,fread,fwrite都是C库中的函数,称为库函数(libc)

open,close,read,write,lseek都是系统提供的接口,称为系统调用接口

可以认为,f#系列函数,都是对系统调用的封装,方便二次开发

1.open

返回值:返回值类型为int ,大于0,表示成功打开,这个数字称为文件描述符

#include<sys/types.h>
#include<stat.h>
#include<fcntl.h>

int open(const char * pathname, int flags);
int open(const char * pathname,int flags,mode_t mode)

pathname:要打开或者要创建的目标文件
flags:
        O_RDONLY:只读打开
        O_WRONLY: 只写打开
        O_RDWR : 读,写打开
        这三个常量,必须指定一个且只能指定一个
        O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
        O_APPEND: 追加写
mode:文件被新创建,指定权限为mode

2.write

#include<unistd>
//将buf中的nbyte个字节写到fd对应的文件中
ssize_t write(fd,const void * buf,size_t nbyte);
//写入成功返回写入文档的bytes,失败返回-1

3.read

#include<unistd.h>
//读取fd对应文件中的count个字符,放到buf缓冲区中
ssize_t read(int fd, void * buf, size_t count);
//成功返回读取的字节数
//返回0 表示已经读到了文件末尾
//失败返回-1,并设置errno

4.close

#include<unistd.h>
int close(int fd);
//成功返回0,出错返回errno

当一个进程终止时,内核对该进程所有尚未关闭的文件描述符,调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是对于一个长年累月运行的程序(比如网络服务器),打开的文件描述符一定要记得关闭,否则随着打开的文件越来越多,会占用大量文件描述符和系统资源

三、文件描述符fd

通过open函数,文件描述符就是一个整数

1. 0 & 1 & 2

  • Linux进程默认情况下有3个缺省打开的文件描述符,标准输入0,标准输出1,标准错误2
  • 0,1,2对应的物理设备一般是:键盘,显示器,显示器

文件描述符就是从0开始的整数。进程要读取文件,首先os创建进程pcb,从磁盘向内存中加载文件,这个过程创建struct_file,里面包含文件的各种属性。pcb中有一张表,存放文件描述符,表中存放struct_file指针,通过表中数组下标索引找到对应文件指针,进而访问文件。所以,本质上文件描述符就是该数据的下标,所以拿到了fd,就可以找到对应的文件。

2.文件描述符分配规则

在file_struct 数组中,找到当前没有被使用的最小的一个下标,作为新的文件描述符

3.重定向

我们之前使用 > >> < 等符号,将数据重定向指定文件中。

重定向的本质就是:比如我们要往显示器上打印文件,应该对应1号fd,现在修改打印到myfile中,myfile是三号文件,即修改fd就可以重定向

4.使用dup2系统调用

#include<unistd.h>
int dup2(int oldfd, int newfd);

oldfd指向a.txt,newfd指向b.txt,调用成功后,newfd和b.txt关闭,newfd指向a.txt(oldfd被保留)

四、FILE

IO相关函数与系统接口对应,并且库函数封装系统调用,本质上任何文件都是通过访问fd来访问的

C库中的FILE结构体内部必定封装了fd


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

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

相关文章

为了做好农业,拼多多请来顶尖农业专家当独立董事

8月29日&#xff0c;拼多多发布截至6月30日的2023年第二季度业绩报告。财报显示&#xff0c;拼多多集团今年第二季度收入为523亿元&#xff0c;同比增长66%&#xff0c;远超市场预期。 财报发布的同时&#xff0c;拼多多还宣布&#xff0c;其董事会已聘任荷兰瓦赫宁根大学终身…

【办公自动化】使用Python批量处理Excel文件并转为csv文件

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

一文了解聚合支付

第四方支付是相对于第三方支付而提出的概念&#xff0c;又被称为“聚合支付”是指通过聚合第三方支付平台、合作银行、等多种支付工具进行的综合支付服务。 简言而之&#xff0c;把支付接口聚合到一个平台上面&#xff0c;来给商家或者个人来提供支付服务。 第四方支付集中了各…

为什么深度网络(vgg,resnet)最后都不使用softmax(概率归一)函数,而是直接加fc层?

这个问题很简单&#xff0c;并不是没有使用softmax&#xff0c;而是没有显式使用softmax。 随着深度学习框架的发展&#xff0c;为了更好的性能&#xff0c;部分框架选择了在使用交叉熵损失函数时默认加上softmax&#xff0c;这样无论你的输出层是什么&#xff0c;只要用了nn.…

【GO】LGTM_Grafana_Tempo(2) --- 官方用例改后实操

最近在尝试用 LGTM 来实现 Go 微服务的可观测性&#xff0c;就顺便整理一下文档。 Tempo 会分为 4 篇文章&#xff1a; Tempo 的架构官网测试实操跑通gin 框架发送 trace 数据到 tempogo-zero 微服务框架使用发送数据到 tempo 根据官方文档实操跑起来 tempo&#xff0c;中间根…

测试理论与方法----软件测试工作流程第一个环节:提取测试需求

测试理论与方法 一、软件测试流程 1、软件测试定义 软件&#xff1a;程序数据文档&#xff1a;不仅仅包含应用程序&#xff0c;还应该包含和这个程序相关的数据&#xff0c;文档 软件测试&#xff1a;测试的对象&#xff1a;应用程序&#xff0c;数据&#xff0c;文档 软件…

java八股文面试[数据库]——慢查询优化

分析慢查询日志 直接分析慢查询日志&#xff0c; mysql使用explain sql语句进行模拟优化器来执行分析。 oracle使用explain plan for sql语句进行模拟优化器来执行分析。 table | type | possible_keys | key |key_len | ref | rows | Extra EXPLAIN列的解释&#xff1a; ta…

六、事务-3.事务四大特性

1、原子性 事务是一组操作&#xff0c;这组操作是不可分割的最小操作单元&#xff0c;这组操作要么全部执行成功&#xff0c;要么全部执行失败。 如&#xff1a;三步转账操作&#xff0c;当中只要有一步操作失败了&#xff0c;整个就失败了。 2、一致性 事务完成时&#xff…

使用vs2019+opencv4.3.0搭建开发环境笔记

使用vs2019opencv4.3.0搭建开发环境笔记 1.软件下载适配2.opencv适配三级目录 3.运行第一个demo报错 参考&#xff1a; 博文 1.软件下载适配 首先是需要下载安装vs2019&#xff0c;下载社区版免费&#xff0c;安装过程基本点击就可 vs2019官网 opencv下载 opencv4.3.0 2.o…

MySQL事务原理、MVCC详解

事务原理 1 事务基础 1). 事务 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 2). 特性 原子性&#xff08;Atomi…

Java CompletableFuture 详细使用教程与实践

一、Java CompletableFuture 详细使用教程 Java 8引入了一种强大的异步编程工具&#xff1a;CompletableFuture。它提供了一种处理异步计算的方式&#xff0c;使得你可以在计算完成时获取结果&#xff0c;或者将一个或多个 CompletableFuture 的结果组合在一起。本部分将详细解…

深入了解Kubernetes(k8s):安装、使用和Java部署指南(持续更新中)

目录 Docker 和 k8s 简介1、kubernetes 组件及其联系1.1 Node1.2 Pod1.3 Service 2、安装docker3、单节点 kubernetes 和 KubeSphere 安装3.1 安装KubeKey3.2 安装 kubernetes 和 KubeSphere3.3 验证安装结果 4、集群版 kubernetes 和 KubeSphere 安装5、kubectl 常用命令6、资…

Node.js 是什么?Node.js 安装及配置环境 入门指南!

Node.js 是一个基于 Chrome V8 引擎的开源、跨平台的 JavaScript 运行时环境。它允许开发者使用 JavaScript 构建高性能、可扩展的网络应用程序&#xff0c;使 JavaScript 能够在服务器端运行&#xff0c;而不仅仅局限于浏览器端。Node.js 的包管理器 npm&#xff0c;是全球最大…

浅谈安防视频监控平台EasyCVR视频汇聚平台对于夏季可视化智能溺水安全告警平台的重要性

每年夏天都是溺水事故高发的时期&#xff0c;许多未成年人喜欢在有水源的地方嬉戏&#xff0c;这导致了悲剧的发生。常见的溺水事故发生地包括水库、水坑、池塘、河流、溪边和海边等场所。 为了加强溺水风险的提示和预警&#xff0c;完善各类安全防护设施&#xff0c;并及时发现…

直播程序源码OAuth协议:开放授权的重要性

什么是OAuth协议&#xff1f; OAuth协议又称为开放授权协议&#xff0c;是一种开放标准协议&#xff0c;OAuth协议被开发出来&#xff0c;主要用于授权用户去访问第三方的应用程序。在直播程序源码平台中&#xff0c;为了方便用户或是对接其他应用的功能&#xff0c;常常需要与…

【防火墙】防火墙双机热备

华为防火墙部署在网络出口位置时&#xff0c;如果发生故障会影响到整网业务&#xff0c;为提升网络的可靠性&#xff0c;需要部署两台华为防火墙并组成双机热备 一、双机热备概述 1、双机热备介绍 双机热备需要两台硬件和软件配置均相同的华为防火墙&#xff0c;两台华为防火墙…

【数据结构】| 并查集及其优化实现

目录 一. 并查集基本概念处理过程初始化合并查询小结 二. 求并优化2.1 按大小求并2.2 按秩(高度)求并2.3 路径压缩2.4 类的实现代码2.5 复杂度分析 三. 应用LeetCode 128: 最长连续数列LeetCode 547: 省份数量LeetCode 200: 岛屿数量 一. 并查集基本概念 以一个直观的问题来引入…

动态规划(Dynamic programming)讲解(线性 DP 篇)

文章目录 动态规划&#xff08;Dynamic Programing&#xff09;第一关&#xff1a;线性DP第一战&#xff1a; C F 191 A . D y n a s t y P u z z l e s \color{7F25DF}{CF191A.\space Dynasty\enspace Puzzles} CF191A. DynastyPuzzles题目描述难度&#xff1a; ☆☆☆ \color…

参与线上活动赢GLMR!在韩国和新加坡遇见Moonbeam

随着8月进入尾声&#xff0c;月圆人团圆的中秋节也已经近在眼前&#xff0c;凉爽的秋天将会为大地带来新的气象。而今年秋天对于区块链产业以及Moonbeam来说与以往不同&#xff0c;将是一个热闹且充满活动的季节。 9月初将会迎来韩国最大的区块链活动&#xff0c;韩国区块链周K…

M1 Pro 新芯片安装python2 方案汇总

前言&#xff1a;磨刀不误砍柴工&#xff0c;环境装好&#xff0c;才能打工。M1 Pro 新芯片安装python2 文章目录 方案一 docker 容器构造环境&#xff08;如果涉及本地两个仓库需要关联则不适用&#xff09;方案二 使用 pyenv &#x1f680; 作者简介&#xff1a;作为某云服务…