news 2026/5/23 13:30:22

Linux环境编程第三天笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux环境编程第三天笔记

Linux环境编程第三天笔记

标准文件I/O与系统文件I/O
  1. 系统文件I/O是Linux内核提供的系统调用函数,无缓冲机制,直接与内核交互。

  2. 标准文件I/O是基于C标准库,实现的函数,在用户空间维护缓冲区

效率:标准I/O > 系统文件I/O

各类文件

在Linux中,文件分为7种

文件类型ls -l下的文件类型缩写特点
普通文件-存在于外部存储器种,用于存储普通数据
目录文件d用于存放目录项,是文件系统管理的重要文件类型
管道文件p用于进程间通信的特殊文件,也称命名通道FIFO
套接字文件s用于网络间通信的特殊文件
链接文件l用于间接访问另外一个目标文件,相当于Windows的快捷方式
块设备文件b块设备在应用层的访问接口
open和openat

调用open或openat可以打开或创建一个文件。

返回值:若成功,返回文件描述符,若失败,返回-1。

#include <fcntl.c> ​ int open(const char *path,int oflag); int open(const char *path,int oflag,mode_t mode);//mode为八进制权限 ​ int1 openat(int fd,const char *pa1th,int oflag)

path是打开或创建的文件名,oflag是函数的选项

情况path类型fd参数
1绝对路径任意值fd被忽略,openat等价于open
2相对路径已打开的目录fd相对于该目录文件描述符指向的目录
3相对路径AT_FDCWD相对于进程的当前工作目录
oflag的值效果
O_RDONLY以只读的形式打开文件
O_WRONLY以只写的形式打开文件
O_RDWR以读/写的形式打开文件
O_CREAT若文件不存在,创建文件
O_EXCL如果使用O_CREAT选项且文件存在,返回错误信息
O_NOCTTY如果文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制信息
O_TREAT如果文件已经存在,则删除文件中原有数据
O_APPEND以追加的形式打开文件
// 场景2:使用目录fd int dir_fd = open("/home", O_RDONLY | O_DIRECTORY);//打开目录 int fd4 = openat(dir_fd, "user/file.txt", O_RDONLY); // 在/home/user/file.txt // 场景3:使用openat + AT_FDCWD int fd2 = openat(AT_FDCWD, "data.txt", O_RDONLY);//默认工作目录为进程的启动目录 // 场景3:改变当前工作目录后 chdir("/tmp"); int fd3 = openat(AT_FDCWD, "temp.txt", O_RDONLY); // 在/tmp目录下打开temp.txt
close

可以调用close关闭一个打开的文件。

返回值:若成功,返回0,若失败返回-1

#include <unistd.h> int closen (int fd);

关闭一个文件时还会释放该进程加在该文件上的所有记录锁。

当一个进程终止时,内核自动关闭它所有的打开文件。

lseek

每个打开的文件都有一个与其相关联的“当前文件偏移量”,通常读写操作都从当前文件偏移量处开始,当打开一个文件时,偏移量默认为0。

lseek可以显示地为一个打开文件设置偏移量。

返回值:若成功,返回新的文件偏移量,若失败,返回-1。

#include <unistd.h> off_t lseek(int fd,off_t offset,int whence);
whence 值常量定义含义说明偏移量计算公式offset 取值范围
SEEK_SET0从文件开头开始偏移新偏移量 = offsetoffset ≥ 0(通常,负值可能导致错误)
SEEK_CUR1从当前位置开始偏移新偏移量 = 当前偏移量 + offset可正可负(正数向后,负数向前)
SEEK_END2从文件末尾开始偏移新偏移量 = 文件长度 + offset可正可负(正数超过文件尾,负数向前)

通过返回值可以用来测试文件是否可以设置偏移量

文件偏移量可以大于等于文件当前长度,这种情况下,文件下次写将加长该文件。

文件中未被写的字节都被读为0。

read

read函数可以从打开的文件中读数据

返回值:成功:读到字节数(若已到文件尾,返回0),失败:返回-1

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

参数buf为用户申请的缓冲区,参数count为要读取的字节数。

当从终端开始读时,通常最多一次读一行(如果标准输出是连接到终端,则它是行缓冲的,否则是全缓冲的)。

write

write可以向打开的文件写入数据

返回值:成功:返回写入的字节数;失败:返回-1

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

参数buf为用户申请的缓冲区,参数count要写入的字节数。

对于普通文件,写操作从文件当前偏移量处开始。

ioctl和fcntl

除非不得已,否则尽量使用fcntl。

#include <sys/ioctl.h> ​ int ioctl(int fd, unsigned long request, ...);
  • fd:文件描述符(通常是设备文件)

  • request:请求码(设备特定)

  • ...:可变参数,通常是指向数据的指针

#include <fcntl.h> ​ int fcntl(int fd, int cmd, ... /* arg */ );
命令字 cmd变参 arg含义
F_DUPFDlong arg复制一个在数值上大于或等于 arg 并未使用的文件描述符,并且使其代表与 fd 相同的文件
F_DUPFD_CLOEXEClong arg作用和 F_DUPFD 一样,但新复制的描述符的 FD_CLOEXEC 状态会被置为 1
F_GETFDvoid获取 FD_CLOEXEC 状态
F_SETFDlong arg设置 FD_CLOEXEC 状态,若该状态位为 0 则意味着该 fd 在程序执行 execve () 加载新代码时将保持有效,否则该 fd 在新代码执行时将被关闭
F_GETFLvoid获取 status 状态
F_SETFLlong arg设置 status 状态 在 Linux 中,以下选项不可设置: O_RDONLY、O_WRONLY、O_RDWR、O_CREAT、O_EXCL、O_NOCTTY、O_TRUNC 以下的选项可以设置: O_APPEND、O_ASYNC、O_DIRECT、O_NOATIME、O_NONBLOCK
F_SETLKstruct flock *arg将 arg.l_type 设置为以下值意味着加锁: FD_RDLCK、FD_WRLCK 将 l_type 设置为以下值意味着解锁: FD_UNLCK 如果当前区域已经有冲突的锁存在,那么将立即返回 - 1,且 errno 将被设置为 EACCES 或 EAGAIN
F_SETLKWstruct flock *arg和 F_SETLK 一样,但在冲突的情况下将会阻塞等待
F_GETLKstruct flock *arg用 arg 中的信息检查是否有冲突,如果无冲突,则将 arg.l_type 设置为 FD_UNLCK,别的成员保持不变;如果有冲突,则 arg 将会储存当前冲突的锁的相关信息
F_GETOWNvoid获取收到由 fd 输入或输出状态改变而触发的信号 SIGIO 和 SIGURG 的进程或进程组 ID。进程 ID 用正整数表示,进程组 ID 用负整数表示
F_SETOWNlong arg设置接收由 fd 输入或输出状态改变而触发的信号 SIGIO 和 SIGURG 的进程或进程组 ID 为 arg。进程 ID 用正整数表示,进程组 ID 用负整数表示
F_GETOWN_EXstruct f_owner_ex *arg作用同 F_GETOWN,但还能获取线程的 TID,且只能适用于 Linux-2.6.32 及以后的版本
F_SETOWN_EXstruct f_owner_ex *arg作用同 F_SETOWN,但还能设置线程的 TID,且只能适用于 Linux-2.6.32 及以后的版本
F_GETSIGvoid获取由 fd 输入或输出状态改变而触发的信号
F_SETSIGlong arg设置由 fd 输入或输出状态改变而触发的信号
F_GETPIPE_SZvoid获取管道文件缓冲区的大小
F_SETPIPE_SZlong arg设置管道文件缓冲区的大小为 arg。arg 必须介于 Linux 内存页大小和系统支持的最大尺寸(见 /proc/sys/fs/pipe-size-max)之间
mmap

mmap可以在进程的虚拟内存空间种映射出一块内存区域,并指定一个文件,用文件数据初始化这块内存,文件数据和内存中的数据一一对应

#include <sys/mman.h> ​ void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数说明
addr内存映射的起始地址。 如果该参数为NULL,则系统将会自动寻找一个合适的起始地址 如果该参数为NULL,则系统会以此为依据寻找一个合适的起始地址。在Linux中一般为页地址的整数倍
length映射区域的大小(字节)
prot内存保护标志(按位或)PROT_EXEC:可执行PROT_READ:可读PROT_WRITE:可写PROT_NONE:不可访问
flags映射类型和特性(按位或)
fd文件描述符(匿名映射时为-1)
offset文件映射的偏移量(必须是页大小的倍数)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 1:59:50

Z-Image-Turbo_UI界面避坑指南:这些错误别再犯

Z-Image-Turbo_UI界面避坑指南&#xff1a;这些错误别再犯 在使用 Z-Image-Turbo_UI 界面进行本地图像生成时&#xff0c;很多用户虽然成功部署了模型&#xff0c;但在实际操作中仍会遇到各种“看似小问题、实则卡流程”的坑。这些问题不仅影响效率&#xff0c;还可能让用户误…

作者头像 李华
网站建设 2026/5/21 11:13:02

YOLOSHOW终极指南:零代码实现智能视觉检测的完整方案

YOLOSHOW终极指南&#xff1a;零代码实现智能视觉检测的完整方案 【免费下载链接】YOLOSHOW YOLO SHOW - YOLOv10 / YOLOv9 / YOLOv8 / YOLOv7 / YOLOv5 / RTDETR GUI based on Pyside6 项目地址: https://gitcode.com/gh_mirrors/yo/YOLOSHOW 还在为复杂的深度学习配置…

作者头像 李华
网站建设 2026/5/20 18:05:43

3分钟快速掌握:国家中小学智慧教育平台电子课本下载终极指南

3分钟快速掌握&#xff1a;国家中小学智慧教育平台电子课本下载终极指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 还在为找不到电子教材而烦恼吗&#xff1…

作者头像 李华
网站建设 2026/5/21 10:17:06

智能测试助手:AI驱动的新一代UI自动化测试平台

智能测试助手&#xff1a;AI驱动的新一代UI自动化测试平台 【免费下载链接】uirecorder UI Recorder is a multi-platform UI test recorder. 项目地址: https://gitcode.com/gh_mirrors/ui/uirecorder 在数字化转型浪潮中&#xff0c;企业面临着日益复杂的软件测试挑战…

作者头像 李华
网站建设 2026/5/21 10:21:47

3步搞定Zotero国标格式:学术写作效率翻倍指南

3步搞定Zotero国标格式&#xff1a;学术写作效率翻倍指南 【免费下载链接】Chinese-STD-GB-T-7714-related-csl GB/T 7714相关的csl以及Zotero使用技巧及教程。 项目地址: https://gitcode.com/gh_mirrors/chi/Chinese-STD-GB-T-7714-related-csl 想要快速掌握Zotero配置…

作者头像 李华
网站建设 2026/5/20 10:16:30

ET框架技术解析:Unity游戏开发的分布式架构解决方案

ET框架技术解析&#xff1a;Unity游戏开发的分布式架构解决方案 【免费下载链接】ET Unity3D 客户端和 C# 服务器框架。 项目地址: https://gitcode.com/GitHub_Trending/et/ET ET框架作为Unity3D客户端与C#服务器端一体化开发框架&#xff0c;通过创新的分布式架构设计…

作者头像 李华