news 2026/4/16 12:39:28

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/4/16 12:34:38

伙伴+华为,书写智慧场馆的《北京梦华录》

1127年&#xff0c;孟元老写下《东京梦华录》&#xff0c;描绘了汴京的繁华盛景&#xff1a;“八荒争凑&#xff0c;万国咸通&#xff0c;集四海之珍奇&#xff0c;皆归市易。”在他笔下&#xff0c;皇城中的商贸中心也是“屋宇雄壮&#xff0c;门面广阔&#xff0c;望之森然&a…

作者头像 李华
网站建设 2026/4/12 20:23:52

苹果触控板在Windows系统上的精密驱动解决方案

苹果触控板在Windows系统上的精密驱动解决方案 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchpad 想要在Windows电…

作者头像 李华
网站建设 2026/4/14 3:50:13

Tabby终端革新体验:告别传统命令行困扰的全新解决方案

Tabby终端革新体验&#xff1a;告别传统命令行困扰的全新解决方案 【免费下载链接】tabby A terminal for a more modern age 项目地址: https://gitcode.com/GitHub_Trending/ta/tabby 你是否曾经在深夜调试代码时被刺眼的白色终端界面晃得眼睛生疼&#xff1f;或者在远…

作者头像 李华
网站建设 2026/4/15 20:16:54

如何快速下载网页视频:新手终极指南

如何快速下载网页视频&#xff1a;新手终极指南 【免费下载链接】m3u8-downloader m3u8 视频在线提取工具 流媒体下载 m3u8下载 桌面客户端 windows mac 项目地址: https://gitcode.com/gh_mirrors/m3u8/m3u8-downloader 还在为无法保存在线视频而烦恼吗&#xff1f;当你…

作者头像 李华
网站建设 2026/4/16 12:15:23

GPEN镜像踩坑总结,这些错误千万别再犯

GPEN镜像踩坑总结&#xff0c;这些错误千万别再犯 1. 引言&#xff1a;为什么GPEN人像修复值得尝试 你有没有遇到过这样的情况&#xff1f;一张老照片模糊不清&#xff0c;或者低分辨率的自拍在社交媒体上显得格外尴尬。现在&#xff0c;GPEN人像修复增强模型能帮你轻松解决这…

作者头像 李华
网站建设 2026/4/15 13:11:06

如何用Llama3-8B搭建对话系统?vllm+Open-WebUI完整指南

如何用Llama3-8B搭建对话系统&#xff1f;vllmOpen-WebUI完整指南 1. 为什么选择 Llama3-8B 搭建本地对话系统&#xff1f; 如果你正在寻找一个性能强、成本低、可本地部署的开源大模型来构建自己的对话应用&#xff0c;Meta-Llama-3-8B-Instruct 是目前最值得考虑的选择之一…

作者头像 李华