当前位置: 首页 > news >正文

Linux 软件编程:文件IO、目录IO、时间函数

一、文件 IO

(一)基本概念

  1. 核心特性:文件 IO 是无缓存的 IO 操作,属于系统调用,直接与内核交互,适合通信、硬件设备操作等场景
  2. 与标准 IO 的区别
    • 标准 IO 是库函数(对系统调用的封装,可跨平台),文件 IO 是内核中的系统调用(仅能在 Linux 系统中使用)
    • 标准 IO 有缓存(效率高、实时性差),文件 IO 无缓存(实时性强)

(二)核心函数接口

1. 文件打开:open
  • 原型
    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(文件不存在则创建)、O_TRUNC(文件存在则清 0)、O_APPEND(追加模式)、O_EXCL(文件存在则报错)
    • mode:创建文件时的权限(如0664),仅flagsO_CREAT时有效
  • 返回值:成功返回新文件描述符(非负整数),失败返回 - 1
  • 特殊文件描述符:标准输入(0)、标准输出(1)、标准错误(2)
  • 文件描述符特点:非负整数,取尚未被占用的最小非负整数,存在上限(达上限后打开文件会报错)
2. 文件关闭:close
  • 原型int close(int fd);
  • 功能:关闭文件描述符
  • 参数fd为要关闭的文件描述符
  • 返回值:成功返回 0,失败返回 - 1
3. 文件读写
  • write(写入)

    • 原型ssize_t write(int fd, const void *buf, size_t count);
    • 功能:向文件描述符fd写入buf指向的count个字节数据
    • 返回值:成功返回实际写入的字节数,失败返回 - 1
  • read(读取)

    • 原型ssize_t read(int fd, void *buf, size_t count);
    • 功能:从文件描述符fd读取count个字节到buf指向的空间
    • 返回值:成功返回实际读到的字节数,读到文件末尾返回 0,失败返回 - 1
4. 偏移量定位:lseek
  • 原型off_t lseek(int fd, off_t offset, int whence);
  • 功能:重新定位文件描述符的偏移量
  • 参数
    • offset:偏移量(正数向后偏移,负数向前偏移)
    • whence:基准位置(SEEK_SET(文件开头)、SEEK_CUR(当前位置)、SEEK_END(文件末尾))
  • 返回值:成功返回新偏移量,失败返回 - 1
5. 标准 IO 与文件 IO 转换
  • fileno:根据文件流指针获得对应文件描述符
  • fdopen:根据已打开的文件描述符获得对应文件流指针
6. 打开方式对应表
标准 IO文件 IO
rO_RDONLY
r+O_RDWR
wO_WRONLY、O_CREAT、O_TRUNC, 0664
w+O_RDWR、O_CREAT、O_TRUNC, 0664
aO_WRONLY、O_APPEND、O_CREAT, 0664
a+O_RDWR、O_APPEND、O_CREAT, 0664

二、目录 IO

(一)操作流程

打开目录文件 → 读取目录项 → 关闭目录文件

(二)核心函数接口

1. 打开目录:opendir
  • 原型DIR *opendir(const char *name);
  • 功能:打开目录流并返回目录流指针
  • 参数name为目录文件的路径
  • 返回值:成功返回目录流指针,失败返回 NULL
2. 关闭目录:closedir
  • 原型int closedir(DIR *dirp);
  • 功能:关闭目录流指针
  • 参数dirp为要关闭的目录流指针
  • 返回值:成功返回 0,失败返回 - 1
3. 读取目录项:readdir
  • 原型struct dirent *readdir(DIR *dirp);
  • 功能:读取并返回下一个目录项的信息
  • 参数dirp为目录流指针
  • 返回值:成功返回包含目录项信息的结构体指针,失败或读到末尾返回 NULL
  • 结构体struct dirent

 关键成员

  • d_ino:inode 编号(通过 inode 定位文件磁盘位置)。
  • d_type:文件类型。
  • d_name:文件名(字符串)。
4. 获取当前工作目录:getcwd
  • 原型char *getcwd(char *buf, size_t size);
  • 功能:获得当前工作目录的绝对路径
  • 参数buf为存放路径的空间首地址,size为空间最大容量
  • 返回值:成功返回路径空间首地址,失败返回 NULL
5. 切换工作目录:chdir
  • 原型int chdir(const char *path);
  • 功能:切换当前工作路径
  • 参数path为目标路径
  • 返回值:成功返回 0,失败返回 - 1
6. 创建目录:mkdir
  • 原型int mkdir(const char *pathname, mode_t mode);
  • 功能:创建目录文件
  • 目录权限说明
    • r:允许查看目录下文件名
    • w:允许在目录下新建文件
    • x:允许进入目录
7. 删除目录:rmdir
  • 原型int rmdir(const char *pathname);
  • 功能:删除目录文件(需确保目录为空)

三、时间函数

(一)时间类型

  1. time_t类型:表示从 1970-1-1 00:00:00 到当前的秒数,适用于时间计算逻辑
  2. struct tm类型:包含具体年月日时分秒等信息,用于时间细节处理
  3. 字符串类型(char *:由时间信息拼接的可读性字符串

(二)核心函数接口

1. 获取time_t时间:time
  • 原型time_t time(time_t *tloc);
  • 功能:返回 1970-1-1 到当前的秒数
  • 参数tloc为存放秒数的空间首地址(可传 NULL,直接通过返回值获取)
  • 返回值:成功返回秒数,失败返回 - 1
2. time_t struct tmlocaltime
  • 原型struct tm *localtime(const time_t *timep);
  • 功能:将time_t类型秒数转换为struct tm结构体时间(本地时间)
  • struct tm成员
    • tm_sec:秒(0-60)
    • tm_min:分(0-59)
    • tm_hour:时(0-23)
    • tm_mday:日(1-31)
    • tm_mon:月(0-11,0 代表 1 月)
    • tm_year:年(需加 1900 得到实际年份)
    • tm_wday:星期(0-6,0 代表周日
    • tm_yday:年内天数(0-365,1 月 1 日为 0)
    • tm_isdst:夏令时标志
  • 返回值:成功返回struct tm指针,失败返回 NULL
3. struct tm 转 time_tmktime
  • 原型time_t mktime(struct tm *tm);
  • 功能:将struct tm结构体时间转换为time_t类型秒数
  • 返回值:成功返回time_t时间,失败返回 - 1
  • 原型char *ctime(const time_t *timep);
  • 功能:将time_t类型时间转换为可读性字符串(如"Wed Jun 30 21:49:08 1993"
  • 返回值:成功返回字符串指针,失败返回 NULL

(三)时间转换关系

time_t ←(mktime)→ struct tm ←(localtime)→ time_ttime_t →(ctime)→ 字符串时间

http://www.xdnf.cn/news/1294435.html

相关文章:

  • VUE基础笔记
  • JS的学习5
  • 更改webpack默认配置项
  • 单片机启动流程详细介绍
  • 高防CDN和高防IP的各自优势
  • RabbitMQ:Windows版本安装部署
  • STM32H743开发周记问题汇总(串口通讯集中)
  • golang语言和JAVA对比
  • 一条n8n工作流
  • SVN提交服务器拒绝访问的问题
  • Linux 桌面到工作站的“性能炼金术”——开发者效率的 6 个隐形瓶颈与破解方案
  • 服务器硬件电路设计之 I2C 问答(五):I2C 总线数据传输方向如何确定、信号线上的串联电阻有什么作用?
  • 【MCP开发】Nodejs+Typescript+pnpm+Studio搭建Mcp服务
  • 从零到一:TCP 回声服务器与客户端的完整实现与原理详解
  • 基于UniApp的智能在线客服系统前端设计与实现
  • 人工智能入门①:AI基础知识(上)
  • 18.10 SQuAD数据集实战:5步高效获取与预处理,BERT微调避坑指南
  • InnoDB如何解决脏读、不可重复读和幻读的?
  • 公司项目用户密码加密方案推荐(兼顾安全、可靠与通用性)
  • HiSmartPerf使用WIFI方式连接Android机显示当前设备0.0.0.0无法ping通!设备和电脑连接同一网络,将设备保持亮屏重新尝试
  • antdv Modal的简单使用
  • Hive 创建事务表的方法
  • 18. parseInt 的参数有几个
  • 开源工具can-utils的使用
  • Docker 在 Linux 中的额外资源占用分析
  • 云计算-实战 OpenStack 私有云运维:服务部署、安全加固、性能优化、从服务部署到性能调优(含数据库、内核、组件优化)全流程
  • OpenCV常见问题汇总
  • Java JDK8环境配置
  • 基于Java的Markdown转Word工具(标题、段落、表格、Echarts图等)
  • 药房智能盘库系统:基于CV与时间序列预测的库存革命