今日学习内容

1. 文件IO与标准IO核心对比

特性标准IO文件IO
实现层C标准库Linux内核系统调用
缓冲机制全缓冲/行缓冲无缓冲(实时读写)
操作对象FILE*流指针整型文件描述符(fd)
移植性跨平台兼容Linux特有
典型应用场景普通文件操作硬件设备/特殊文件操作
性能特点减少系统调用(批量操作高效)实时响应(适合高频小数据)

2. 文件描述符(File Descriptor)

(1) 内核级文件访问句柄

  • 本质:整数标识符(索引内核文件表)
  • 预定义fd
    fd符号设备
    0STDIN标准输入
    1STDOUT标准输出
    2STDERR标准错误

(2) 生命周期管理

int fd = open("file.txt", O_RDWR);  // 获取fd  
read(fd, buf, size);                // 使用fd操作  
close(fd);                         // 释放fd(必须!)  

3. 文件权限控制:umask机制

(1) 权限计算规则

权限计算遵循公式:mode & ~umask

  • 查看umask:终端输入umask

4. 核心系统调用详解

(1) 文件打开:open

#include <fcntl.h>  
#include <sys/types.h>
#include <sys/stat.h>
int open(const char *pathname, int flags, mode_t mode);  

参数说明
pathname文件路径
flags打开标志
mode创建文件时的权限(仅O_CREAT时有效)

常用flags组合

场景flags组合
只读打开O_RDONLY
只写打开O_WRONLY
读写打开O_RDWR
创建文件O_CREAT
追加写入O_APPEND
清空文件O_TRUNC

(2) 数据读取:read

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);  

  • 返回值
    • 成功:实际读取字节数
    • 文件末尾:0
    • 错误:-1

(3) 数据写入:write

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);  

  • 返回值:实际写入字节数(可能小于请求值)

(4) 文件定位:lseek

#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);  

whence定位基准
SEEK_SET文件开头
SEEK_CUR当前位置
SEEK_END文件末尾

典型应用

lseek(fd, 0, SEEK_END);  // 定位到文件末尾  

(5) 文件关闭:close

 #include <unistd.h>int close(int fd);  // 成功返回0,失败返回-1  

打开的文件描述符必须显式关闭!

5. 代码

open.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int fd = open("./2.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);if(-1 == fd){printf("error\n");return -1;}printf("fd = %d\n", fd);close(fd);return 0;
}

​​​​write.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int fd = open("./2.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);if(-1 == fd){printf("error\n");return -1;}char *buf = "hello";write(1, buf, sizeof(buf));close(fd);return 0;
}

read.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int fd = open("./2.txt", O_RDONLY);if(-1 == fd){printf("error\n");return -1;}char buff[1024] = {0};ssize_t cnt = read(fd, buff, sizeof(buff));// printf("cnt = %ld\n", cnt);printf("buff = %s\n", buff);close(fd);return 0;
}

cats

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int fd = open(argv[1], O_RDONLY);if(-1 == fd){printf("error\n");return -1;}char buff[1024] = {0};while(1){ssize_t cnt = read(fd, buff, sizeof(buff));write(1, buff, cnt);if(0 == cnt){break;}}close(fd);return 0;
}

copy.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int fd = open(argv[1], O_RDONLY);if(-1 == fd){printf("error\n");return -1;}char buff[1024] = {0};while(1){ssize_t cnt = read(fd, buff, sizeof(buff));write(1, buff, cnt);if(0 == cnt){break;}}close(fd);return 0;
}

lseek.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int fd = open("./1.txt", O_RDONLY);if(fd < 0){printf("error\n");return -1;}off_t len = lseek(fd, 0, SEEK_END);printf("%ld\n", len);lseek(fd, 0, SEEK_SET);close(fd);return 0;
}

rizhi.c

#include <stdio.h>
#include <time.h>
#include <unistd.h>
FILE *fp = NULL;
int init_log()
{fp = fopen("./log.txt", "a");if(NULL == fp){printf("open error\n");return -1;}  return 0;
}int write_log(int level)
{time_t now = time(NULL);struct tm *pt = localtime(&now);const char *plevel = {0};switch (level) {case 2:  plevel = "ERROR";   break;case 1:  plevel = "WARNING"; break;case 0:  plevel = "INFO";    break;}fprintf(fp, "[%d-%d-%d %d:%d:%d] [%d]:%s\n", pt->tm_year+1900, pt->tm_mon+1,pt->tm_mday,pt->tm_hour, pt->tm_min, pt->tm_sec, level, plevel);return 0;
}void unint_log()
{fclose(fp);
}int main(void)
{init_log();int i;for(i = 0; i < 100; ++i){write_log(2);  write_log(0);write_log(1); }unint_log();return 0;
}


总结

  1. 文件IO核心价值
    • 直接内核交互 → 实时性保障
    • 设备文件操作唯一途径
  2. 系统调用
    操作关键注意
    open正确处理O_CREAT的mode参数
    read/write循环处理部分写入/读取
    lseek支持负偏移(向前回溯)
    close配对调用防止fd泄漏
  3. 嵌入式场景适配
    • 设备驱动开发必用文件IO
    • 日志系统优先选无缓冲写入(防断电丢失)
    • 敏感文件设置严格权限(open(..., 0600)

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

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

相关文章

数据结构之顺序表相关算法题

目录一、移除元素二、删除有序数组中的重复项三、合并两个有序数组总结一、移除元素 移除元素 - 力扣 思路一&#xff1a;就是创建一个临时数组&#xff0c;对原数组进行遍历&#xff0c;找出与val不同的数据放到新数组里&#xff0c;然后再将tmp中的数据导回原数组 这个思…

百胜软件×华为云联合赋能,“超级国民品牌”海澜之家新零售加速前行

报道显示&#xff0c;早在2012年海澜之家就开始布局数字化征程&#xff0c;并于近年对公司全流程信息化进行综合重构升级优化&#xff0c;在采销协同、业财一体等方面突破原有架构&#xff0c;通过信息化架构的增强为业务发展提供支撑。作为新零售重要组成部分的海澜电商信息化…

“Zen 5”: The AMD High-Performance 4nm x86-64 Microprocessor Core

Codenamed “Zen 5,” AMD’s next-generation, energy-efficient high-performance x86 core targets a wide array of client, server, and embedded markets. Fabricated in TSMC’s 4nm FinFET process, the 55mm2 core complex (CCX), shown in Fig. 2.1.1., contains 8.6…

Linux数据库:【表的约束】【表的基本查询】

目录 一.表的约束 1.1空属性 not null 1.2默认值 default ​空属性和默认值一起使用&#xff1f; 1.3列描述 comment 1.4 zerofill 1.5 主键 1.6 自增长 1.7 唯一键 1.8 外键 二. 表的基本查询 2.1 Create 2.1.1单行数据 全列插入 2.1.2多行数据 指定列插入 2…

AJAX RSS Reader

AJAX RSS Reader 引言 随着互联网的快速发展,信息量的爆炸式增长,用户对信息获取的便捷性和实时性提出了更高的要求。RSS(Really Simple Syndication)作为一种信息聚合技术,已经广泛应用于新闻、博客、论坛等网络平台。AJAX(Asynchronous JavaScript and XML)技术则提…

从实验室到落地:飞算JavaAI水位监测系统的工程化实践

一、飞算JavaAI平台简介飞算JavaAI是国内领先的软件开发智能平台&#xff0c;通过AI技术赋能软件开发全流程&#xff0c;帮助开发者实现"一人一项目&#xff0c;十人抵百人"的高效开发模式。平台核心优势包括&#xff1a; 智能代码生成&#xff1a;基于自然语言描述自…

前端Vite介绍(现代化前端构建工具,由尤雨溪开发,旨在显著提升开发体验和构建效率)ES模块(ESM)、与传统Webpack对比、Rollup打包

文章目录**1. 核心特性**- **极速启动**&#xff1a;- **按需编译与热模块替换&#xff08;HMR&#xff09;**&#xff1a;- **开箱即用**&#xff1a;- **生产环境优化**&#xff1a;- **插件系统**&#xff1a;**2. 工作原理****开发模式**- **基于 ESM 的按需加载**&#xf…

python sqlite3模块

十分想念顺店杂可。。。Python 的sqlite3模块是标准库中用于操作SQLite 数据库的工具。SQLite 是一款轻量级嵌入式数据库&#xff08;无需独立服务器&#xff0c;数据存储在单一文件中&#xff09;&#xff0c;适合小型应用、本地数据存储或原型开发。sqlite3模块提供了完整的 …

用 Python 绘制企业年度财务可视化报告 —— 从 Excel 到 9 种图表全覆盖

用 Python 绘制企业年度财务可视化报告 —— 从 Excel 到 9 种图表全覆盖在企业经营分析中&#xff0c;光看一堆财务数字很难直观发现规律和问题。 如果能将这些数据转化为可视化图表&#xff0c;不仅更美观&#xff0c;还能帮助管理层快速做出决策。今天&#xff0c;我就用 Py…

一次 Unity ↔ Android 基于 RSA‑OAEP 的互通踩坑记

这篇分享&#xff0c;记录我如何从“Base64 报错/平台不支持/解密失败”一路定位到“填充算法不一致”的根因&#xff0c;并给出两条稳定落地方案。同时整理了调试手册、代码片段和上线前自检清单&#xff0c;方便你复用。 背景 Unity 端用公钥加密一段紧凑 JSON&#xff08;i…

Go语言GC机制:高效并发回收解析

Go 语言的垃圾回收&#xff08;Garbage Collection&#xff0c;简称 GC&#xff09;是其自动内存管理的核心机制&#xff0c;旨在自动识别并回收不再被使用的内存&#xff0c;避免内存泄漏&#xff0c;减轻开发者的手动内存管理负担。Go 的 GC 算法经历了多次迭代优化&#xff…

imx6ull-驱动开发篇23——Linux 内核定时器实验

目录 实验程序编写 修改设备树文件 定时器驱动程序 timer.c 测试 timerApp.c Makefile 文件 运行测试 实验程序编写 本讲实验&#xff0c;我们使用正点原子I.MX6U-ALPHA 开发板&#xff0c;通过linux内核定时器周期性的点亮和熄灭开发板上的 LED 灯&#xff0c; LED 灯…

IPTV系统:开启视听与管理的全新篇章

在当今数字化飞速发展的时代&#xff0c;IPTV系统正以前所未有的姿态&#xff0c;重塑着我们的视听体验与管理模式。它不仅仅是一套技术系统&#xff0c;更是连接信息、沟通情感、提升效率的桥梁&#xff0c;为各个领域带来了全新的变革与发展机遇。从电视直播的角度来看&#…

PyTorch笔记9----------Cifar10图像分类

1.图像分类网络模型框架解读 分类网络的基本结构 数据加载模块&#xff1a;对训练数据加载数据重组&#xff1a;组合成网络需要的形式&#xff0c;例如预处理、增强、各种网络处理、loss函数计算优化器 数据加载模块 使用公开数据集&#xff1a;torchvision.datasets使用自定义…

飞凌OK3568开发板QT应用程序编译流程

飞凌OK3568开发板QT应用程序编译流程开发环境&#xff1a;ubuntu20.04&#xff08;主机&#xff09;、飞凌OK3568开发板一般在linux系统下开发用于ARM开发板的QT应用程序时&#xff0c;直接在主机上开发然后进行交叉编译即可&#xff0c;但有时候ARM开发板的厂家提供的SDK中可能…

飞算JavaAI合并项目实战:7天完成3年遗留系统重构

引言 企业数字化进程中&#xff0c;遗留系统改造始终是CIO面临的头号难题。某电商平台的实践数据显示&#xff1a;3年以上的Java项目平均存在47%的冗余代码&#xff0c;63%的架构设计不符合当前业务需求&#xff0c;进行系统性重构需要投入相当于原开发量200%的资源。传统&quo…

卫星速度增量和比冲及推力之间的关系

一、定义1.1.比冲&#xff08;Isp&#xff09;&#xff1a;比冲是衡量发动机性能的重要指标&#xff0c;反映了单位重量推进剂在发动机中产生的冲量&#xff0c;单位为米/秒&#xff08;m/s&#xff09;&#xff0c;代表燃料燃烧时喷流速度。这个单位与速度单位“米/秒”相同&a…

MATLAB绘制各种心形曲线

1.方程(1)心形线的经典隐函数方程为&#xff1a;(2)参数方程&#xff08;更平滑的心形&#xff09;&#xff1a;(3)极坐标心形线(4)参数方程&#xff08;3D心形&#xff09;(5)隐函数3D心形2. MATLAB代码clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn…

Django REST Framework视图

Django REST Framework (DRF) 视图类详解DRF 提供了丰富的视图类来构建 API&#xff0c;从基础到高级&#xff0c;满足不同复杂度的需求。以下是 DRF 的主要视图类及其使用场景&#xff1a;1. 基础视图类APIView所有 DRF 视图的基类&#xff0c;相当于 Django 的 View 类的增强…

Linux面试题及详细答案 120道(1-15)-- 基础概念

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…