Linux操作系统--基础I/O(上)

news2025/4/25 16:13:06

目录

1.回顾C文件接口

stdin、stdout、stderr

2.系统文件I/O

3.接口介绍

4.open函数返回值

5.文件描述符fd

5.1 0&1&2


1.回顾C文件接口

hello.c写文件

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

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

    const char *msg = "hello friend!\n";
    int count = 5;
    while(count--)
    {
        fwrite(msg,strlen(msg),1,fp);
    }

    fclose(fp);
    
    return 0;
}

hello.c读文件

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

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

    char buf[1024];
    const char *msg = "hello friend!\n";
    while(1)
    {
        //
        size_t s = fread(buf,strlen(msg),1,fp);
        if(s>0){
            buf[s] = 0;
            printf("%s",buf);
        }
        if(feof(fp)){//用于检测文件是否读到末尾
        break;
        }
    }

    fclose(fp);

    return 0;
}

输出信息到显示器

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

int main()
{
    const char *msg = "hello fwrite\n";
    fwrite(msg,strlen(msg),1,stdout);

    printf("hello printf\n");
    fprintf(stdout,"hello fprintf\n");
    return 0;
}

stdin、stdout、stderr

stdin(0):键盘文件 

stdout(1):显示器文件

stderr(2):显示器文件。(错误信息输出)
进程会默认打开键盘、显示器

三个流的类型都是FILE* ,fopen返回值类型,文件指针

2.系统文件I/O

操作文件,除了上述C接口,我们还可以采用系统接口来进行文件访问。(文件其实是在磁盘上的,磁盘是外部设备,访问磁盘文件其实是访问硬件。几乎所有的库只要是访问硬件设备,必定要封装系统调用,因为之前讲到过,操作系统并不相信用户,不会与用户直接接触,所以提供了接口给用户)

先来直接以代码的形式,实现上面一模一样的代码:

hello.c写文件

#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>

int main()
{
    umask(0);//修改默认权限掩码
    int fd = open("myfile",O_WRONLY|O_CREAT,0644);
    if(fd<0){
        perror("open");
        return 1;
    }

    int count = 5;
    const char *msg = "hello friend\n";
    int len = strlen(msg);

    while(count--)
    {
        write(fd,msg,len);//fd:后面讲, msg:缓冲区首地址, len:本次读取,期望写入多少个字节的数据, 
        //返回值:实际写了多少字节数据
    }
    
    close(fd);
    return 0;
}

hello.c读文件

#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>

int main()
{
    int fd = open("myfile",O_RDONLY);
    if(fd<0){
        perror("open");
        return 1;
    }

    const char *msg = "hello friend\n";
    char buf[1024];
    while(1){
        size_t s = read(fd,buf,strlen(msg));
        if(s>0){
            printf("%s",buf);
        }else{
            break;
        }
    }

    close(fd);
    return 0;
}

3.接口介绍

open

#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);

pathname:要打开或创建的目标文件

flags:打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。

参数:

        O_RDONLY:只读打开

        O_WRONLY:只写打开

        O_RDWR:读、写打开

                这三个常量,必须指定一个且只能指定一个

        O_CREAT:若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限

        O_APPEND:追加写

返回值:

        成功:新打开的文件描述符

        失败:-1

4.open函数返回值

在认识返回值之前,下来认识两个概念:

  1. 系统调用:系统调用是操作系统提供给用户程序的一种接口,用于让用户程序请求操作系统内核提供的服务。当用户程序需要执行一些特权操作(如文件操作、进程管理等),无法直接访问硬件资源,需要通过系统调用向操作系统内核发出请求。系统调用是通过中断或异常机制实现的,可以看作是用户程序与操作系统内核之间的桥梁。

  2. 库函数:库函数是一组提供特定功能的函数,被封装在软件库中以供程序开发者使用。库函数通常是由编程语言或第三方开发者编写的,用于简化开发过程、提高代码的可重用性和可维护性。库函数可以包含在标准库或第三方库中,程序可以通过链接库函数的方式来调用其中的功能
  • 上面的fopen fclose fread fwrite都是C标准库当中的函数,我们称之为库函数(libc)。
  • 而,open close read write lseek都属于系统提供的接口,称之为系统调用接口

系统调用接口和库函数的关系一目了然

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

5.文件描述符fd

文件描述符就是一个整数

5.1 0&1&2

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

所以输入输出还可以采用如下方式:

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

int main()
{
    char buf[1024];
    ssize_t s = read(0,buf,sizeof(buf));
    if(s>0)
    {
        buf[s]=0;
        write(1,buf,strlen(buf));
        write(2,buf,strlen(buf));
    }
    return 0;
}

而现在知道,文件描述符就是从0开始的整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files,指向一张表files_struct,该表最重要的部分就是包含一个指针数组,每个元素都是一个指向打开文件的指针。所以,本质上,文件描述符就是数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件。

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

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

相关文章

weibo_har鸿蒙微博分享,单例二次封装,鸿蒙微博,微博登录

weibo_har鸿蒙微博分享&#xff0c;单例二次封装&#xff0c;鸿蒙微博 HarmonyOS 5.0.3 Beta2 SDK&#xff0c;原样包含OpenHarmony SDK Ohos_sdk_public 5.0.3.131 (API Version 15 Beta2) &#x1f3c6;简介 zyl/weibo_har是微博封装使用&#xff0c;支持原生core使用 &a…

【MySQL数据库入门到精通-06 DCL操作】

一、DCL DCL英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访 问权限。 二、管理用户 1.查询与创建用户 代码如下&#xff08;示例&#xff09;&#xff1a; -- DCL 管理用户 -- 1.查询用户 use mysql; select *from user;-…

无感字符编码原址转换术——系统内存(Mermaid文本图表版/DeepSeek)

安全便捷无依赖&#xff0c;不学就会无感觉。 笔记模板由python脚本于2025-04-24 20:00:05创建&#xff0c;本篇笔记适合正在研究字符串编码制式的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 P…

第七部分:向量数据库和索引策略

什么是矢量数据库&#xff1f; 简单来说&#xff0c;向量数据库是一种专门化的数据库&#xff0c;旨在优化存储和检索以高维向量形式表示的文本。 为什么这些数据库对RAG至关重要&#xff1f;因为向量表示能够在大规模文档库中进行高效的基于相似性的搜索&#xff0c;根据用户…

查看MAC 地址以及简单了解

MAC地址 简介 MAC 地址&#xff08;Media Access Control Address&#xff09;&#xff0c;直译为媒体访问控制地址&#xff0c;又称局域网地址&#xff08;LAN Address&#xff09;、MAC 地址、以太网地址&#xff08;Ethernet Address&#xff09;、硬件地址&#xff08;Ha…

《100天精通Python——基础篇 2025 第2天:Python解释器安装与基础语法入门》

目录 一、Windows安装Python1.1 下载并安装 Python1.2 测试安装是否成功 二、Linux系统安装Python(新手可以跳过)2.1 基于RockyLinux系统安装Python(编译安装)2.2 基于Ubuntu系统安装Python(编译安装)2.3 macOS 安装python解释器 三、如何运行Python程序&#xff1f;3.1 Python…

MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能对比及 SQL 日志输出的详细说明,重点对比日志输出的配置差异

以下是 MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能对比及 SQL 日志输出的详细说明&#xff0c;重点对比日志输出的配置差异&#xff1a; 1. MyBatis 和 MyBatis-Plus 核心对比 特性MyBatisMyBatis-Plus定位基础持久层框架MyBatis 的增强版&#xff0c;提供代码生…

动手试一试 Spring Boot默认缓存管理

1.准备数据 使用之前创建的springbootdata的数据库&#xff0c;该数据库有两个表t_article和t_comment&#xff0c;这两个表预先插入几条测试数据。 2.编写数据库表对应的实体类 Entity(name "t_comment") public class Comment {IdGeneratedValue(strategy Gener…

Opencv图像处理:旋转、打包、多图像匹配

文章目录 一、图像的旋转1、使用numpy方法实现旋转1&#xff09;顺时针旋转90度2&#xff09;逆时针旋转90度 2、使用opencv的方法实现图像旋转1&#xff09;顺时针旋转90度2&#xff09;逆时针旋转90度3&#xff09;旋转180度 3、效果 二、多图像匹配1、模板2、匹配对象3、代码…

BOM与DOM(解疑document window关系)

BOM&#xff08;浏览器对象模型&#xff09; 定义与作用 BOM&#xff08;Browser Object Model&#xff09;提供与浏览器窗口交互的接口&#xff0c;用于控制导航、窗口尺寸、历史记录等浏览器行为 window&#xff1a;浏览器窗口的顶层对象&#xff0c;包含全局属性和方法&am…

数据仓库建设全解析!

目录 一、数据仓库建设的重要性 1. 整合企业数据资源 2. 支持企业决策制定 3. 提升企业竞争力 二、数据仓库建设的前期准备 1. 明确业务需求 2. 评估数据源 3. 制定项目计划 三、数据仓库建设的具体流程 1.需求分析​ 2.架构设计​ 3.数据建模​ 4.ETL 开发​ 5.…

时序约束 记录

一、基础知识 1、fpga的约束文件为.fdc&#xff0c;synopsys的约束文件为.sdc。想通过fpga验证soc设计是否正确&#xff0c;可以通过syn工具(synplify)吃.fdc把soc code 转换成netlist。然后vivado P&R工具通过吃上述netlist、XDC 出pin脚约束、fdc时序约束三个约束来完成…

基于SpringBoot的在线抽奖系统测试用例报告

一、项目背景 在线抽奖系统采用前后端分离的方法来实现&#xff0c;同时使用了数据库来存储相关的数据&#xff0c;redis来缓存验证码&#xff0c;RabbitMQ来缓存信息队列&#xff0c;同时将其部署到云服务器上。前端主要有登录页、后台管理页、活动列表页&#xff0c;抽奖页等…

26考研|数学分析:数项级数

数项级数这一章的开始&#xff0c;开启了新的关于“级数”这一新的概念体系的学习进程&#xff0c;此部分共包含四章的内容&#xff0c;分别为数项级数、函数项级数、幂级数以及傅里叶级数。这一章中&#xff0c;首先要掌握级数的相关概念与定义&#xff0c;重难点在于掌握判断…

likeadmin前端请求地址配置踩坑

likeadmin前端本地调试执行步骤 第一步&#xff1a;npm i 安装项目所有依赖 第二步&#xff1a;npm run dev 启动 报错&#xff0c;发送的请求没通&#xff0c;很显然请求的地址不存在 第三步&#xff1a;查找接口请求地址 配置 根目录下有个.env.production.example 文件…

计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解

概述 目标检测已经取得了长足的发展&#xff0c;尤其是随着基于 Transformer 的模型的兴起。RF-DETR&#xff0c;由 Roboflow 开发&#xff0c;就是这样一种模型&#xff0c;它兼顾了速度和精度。使用 Roboflow 的工具可以让整个过程变得更加轻松。他们的平台涵盖了从上传和标…

系统思考:技术与产品协同

在《第五项修炼》中&#xff0c;彼得圣吉指出&#xff1a;组织中最根本的问题&#xff0c;往往不是个别人的能力&#xff0c;而是思维的局限和系统之间的断裂。我最近要给一家互联网公司交付系统思考的项目&#xff0c;客户希望技术和产品的管理者一起参加&#xff0c;也问我&a…

面试之消息队列

消息队列场景 什么是消息队列&#xff1f; 消息队列是一个使用队列来通信的组件&#xff0c;它的本质就是个转发器&#xff0c;包含发消息、存消息、消费消息。 消息队列怎么选型&#xff1f; 特性ActiveMQRabbitMQRocketMQKafka单机吞吐量万级万级10万级10万级时效性毫秒级…

通过阿里云Milvus与通义千问VL大模型,快速实现多模态搜索

本文主要演示了如何使用阿里云向量检索服务Milvus版与通义千问VL大模型&#xff0c;提取图片特征&#xff0c;并使用多模态Embedding模型&#xff0c;快速实现多模态搜索。 基于灵积&#xff08;Dashscope&#xff09;模型服务上的通义千问 API以及Embedding API来接入图片、文…

使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解,包含代码示例和注释,最后以表格总结关键配置

以下是使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解&#xff0c;包含代码示例和注释&#xff0c;最后以表格总结关键配置&#xff1a; 1. 环境准备 Spring Boot 版本&#xff1a;2.7.x&#xff08;兼容 Spring Boot Admin 2.x&#xff09;Spring Boot…