news 2026/4/18 9:42:42

Linux 基础 IO 核心知识点梳理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 基础 IO 核心知识点梳理

Linux 基础 IO(输入 / 输出)是操作系统与外部设备、文件进行数据交互的核心机制,其底层围绕文件描述符展开,遵循 “一切皆文件” 的设计理念。以下是基础 IO 的核心概念与操作梳理:

一、 核心概念

  1. 一切皆文件Linux 中,普通文件、目录、硬件设备(如键盘、显示器)、管道等都被抽象为文件,统一使用文件 IO 接口操作,简化了程序与不同设备的交互逻辑。

  2. 文件描述符(File Descriptor, FD)

    • 是内核分配给进程的非负整数,用于标识进程打开的文件,是进程访问文件的 “句柄”。
    • 进程启动时默认打开 3 个文件描述符:
      • 0:标准输入(stdin),对应键盘等输入设备
      • 1:标准输出(stdout),对应显示器等输出设备
      • 2:标准错误(stderr),对应显示器等错误输出设备
    • 新打开的文件会分配当前最小的可用文件描述符。
  3. 文件指针与 inode

    • 文件指针:内核维护的文件偏移量,记录当前读写位置,读写操作后会自动移动。
    • inode:存储文件的元数据(大小、权限、存储位置等),文件名仅用于映射到 inode,实际操作通过 inode 完成。

二、 基础 IO 操作(系统调用)

Linux 基础 IO 主要依赖系统调用函数,区别于 C 语言标准库的 IO 函数(如fopen/fread),系统调用直接与内核交互,更贴近底层。

1. 文件打开与关闭

  • 打开文件:open()函数原型:

    c

    运行

    #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:打开方式,常用取值:
      • O_RDONLY:只读
      • O_WRONLY:只写
      • O_RDWR:读写
      • O_CREAT:文件不存在则创建,需搭配mode指定权限
      • O_TRUNC:文件存在则清空内容
    • mode:创建文件时的权限(如0644),需与umask结合计算最终权限
    • 返回值:成功返回文件描述符,失败返回-1并设置errno
  • 关闭文件:close()函数原型:

    c

    运行

    #include <unistd.h> int close(int fd);
    • fd:要关闭的文件描述符
    • 返回值:成功返回0,失败返回-1
    • 注意:进程退出时会自动关闭所有打开的文件描述符,但显式关闭是良好编程习惯。

2. 文件读写

  • 读文件:read()函数原型:

    c

    运行

    #include <unistd.h> ssize_t read(int fd, void *buf, size_t count);
    • fd:文件描述符
    • buf:存储读取数据的缓冲区
    • count:期望读取的字节数
    • 返回值:成功返回实际读取的字节数;到达文件末尾返回0;失败返回-1
  • 写文件:write()函数原型:

    c

    运行

    #include <unistd.h> ssize_t write(int fd, const void *buf, size_t count);
    • 参数含义与read()类似,buf为要写入的数据缓冲区
    • 返回值:成功返回实际写入的字节数;失败返回-1

3. 文件偏移量调整:lseek()

用于修改当前读写位置(文件指针),函数原型:

c

运行

#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence);
  • offset:偏移量(可正可负)
  • whence:偏移基准:
    • SEEK_SET:从文件开头开始偏移
    • SEEK_CUR:从当前位置开始偏移
    • SEEK_END:从文件末尾开始偏移
  • 返回值:成功返回新的偏移量;失败返回-1
  • 示例:将读写位置移到文件开头:lseek(fd, 0, SEEK_SET);

三、 标准库 IO 与系统调用 IO 的关系

C 语言标准库的 IO 函数(fopen/fread/fwrite)是对系统调用的封装,核心区别:

特性系统调用 IO(open/read标准库 IO(fopen/fread
操作对象文件描述符(int文件指针(FILE*
缓冲区无(直接读写内核缓冲区)有用户态缓冲区(减少系统调用次数)
适用场景底层开发、精准控制普通应用开发、效率优先

四、 常见 IO 错误处理

  • 系统调用失败时会设置全局变量errno,可通过perror()strerror()打印错误信息:

    c

    运行

    #include <stdio.h> #include <errno.h> #include <string.h> // 方式1:perror 直接打印错误描述 if (open("test.txt", O_RDONLY) == -1) { perror("open error"); } // 方式2:strerror 获取错误描述字符串 if (open("test.txt", O_RDONLY) == -1) { printf("open error: %s\n", strerror(errno)); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 0:26:52

荆门园博园—— “园博园·仙侠奇遇” 主题跨年及元旦活动

荆门园博园&#xff1a;生态与文化的交融之地位于湖北省荆门市漳河新区的荆门园博园&#xff0c;是一座以“生态荆门&#xff0c;品质生活”为主题的大型生态文化园区。总占地面积2094亩&#xff0c;前身为废弃采矿区&#xff0c;通过生态修复与矿坑治理&#xff0c;如今已蜕变…

作者头像 李华
网站建设 2026/4/18 0:25:18

性能狂飙?关于《分布式系统性能优化:方法与实践》

【引】在很长一段时间里&#xff0c;老码农都在从事性能工程方面的工作。去年&#xff0c;还和朋友们合作出版了《性能之道》一书&#xff0c;但受限于篇幅和整体一致性&#xff0c; 有很多心得没有加入到那一本书中。很高兴收到福川老师的邀请&#xff0c;与梓晨和张程老师合作…

作者头像 李华
网站建设 2026/4/18 0:28:41

EmotiVoice语音合成与唇形同步技术结合前景展望

EmotiVoice语音合成与唇形同步技术结合前景展望 在虚拟偶像直播中&#xff0c;一句“今天真是令人兴奋的一天&#xff01;”如果只是机械地念出&#xff0c;观众可能毫无共鸣&#xff1b;但如果语气上扬、节奏轻快、音色亲切&#xff0c;甚至嘴角仿佛跟着语音微微上扬——那种沉…

作者头像 李华
网站建设 2026/4/17 8:00:02

EmotiVoice在婚礼司仪语音定制中的趣味应用

EmotiVoice在婚礼司仪语音定制中的趣味应用 在一场婚礼上&#xff0c;当熟悉的音色缓缓响起——那是远在千里之外的父亲声音&#xff0c;一字一句念出对女儿的祝福&#xff1b;或是已故长辈的语调再度回荡在礼堂中&#xff0c;讲述着家人的期许与温情……这些曾被认为只存在于电…

作者头像 李华
网站建设 2026/4/18 2:04:02

洛谷 P1551 题解

题目背景 若某个家族人员过于庞大&#xff0c;要判断两个是否是亲戚&#xff0c;确实还很不容易&#xff0c;现在给出某个亲戚关系图&#xff0c;求任意给出的两个人是否具有亲戚关系。 题目描述 规定&#xff1a;x 和 y 是亲戚&#xff0c;y 和 z 是亲戚&#xff0c;那么 x…

作者头像 李华
网站建设 2026/4/17 13:16:38

ur-rtde详细使用教程

打开终端&#xff0c;一键安装&#xff01; pip install --upgrade ur-rtde $ pip install --upgrade ur-rtde Defaulting to user installation because normal site-packages is not writeable Requirement already satisfied: ur-rtde in /home/robot/.local/lib/python3.…

作者头像 李华