l_whence 的可能值及其含义

embedded/2024/9/24 5:38:25/

fcntl 函数中使用 struct flock 结构体进行文件锁定时,l_whence 成员用于指定文件锁操作的起始位置。它定义了文件锁的偏移量是相对于哪个位置的。l_whence 有以下几种可能的值,每种值的含义如下:

l_whence 的可能值及其含义

  1. SEEK_SET:

    • 含义: 文件偏移量是从文件的开头开始计算的。
    • 用途: 当 l_whence 设置为 SEEK_SET 时,l_start 的值是从文件开头的绝对位置。如果你想要锁定文件的某个绝对位置到指定的长度,可以使用这个值。
  2. SEEK_CUR:

    • 含义: 文件偏移量是从当前文件位置开始计算的。
    • 用途: 当 l_whence 设置为 SEEK_CUR 时,l_start 的值是相对于当前文件位置的偏移量。这适用于需要锁定从当前文件指针位置开始的区域。
  3. SEEK_END:

    • 含义: 文件偏移量是从文件末尾开始计算的。
    • 用途: 当 l_whence 设置为 SEEK_END 时,l_start 的值是相对于文件末尾的偏移量。这在需要锁定文件末尾的部分时很有用,例如在处理日志文件时。

使用 SEEK_SET

在示例代码中,l_whence 被设置为 SEEK_SET

#include <stdio.h>   
#include <stdlib.h>  
#include <fcntl.h>   
#include <errno.h>  
#include <sys/types.h> 
#include <unistd.h>  #define BUF_LEN 4096 int main(int argc, char *argv[]) {int ret = 0; struct flock test_lock = { // 定义一个 flock 结构体用于文件锁操作.l_whence = SEEK_SET, // 文件锁的起始位置设置为文件开始处.l_type = F_WRLCK // 设置文件锁为写锁(排他锁)};int fd = open("test.bin", O_RDWR);if (fd < 0) { printf("open file failed\n"); return 1;}printf("before lock file\n"); ret = fcntl(fd, F_SETLKW, &test_lock);if (ret < 0) { printf("lock file failed\n");close(fd); return 1; }printf("after lock file\n"); sleep(150); // 休眠150秒,用于模拟文件被锁定状态下的访问碰撞close(fd); return 0;
}

这表示锁定的起始位置是从文件开头计算的,锁定区域的起点由 l_start 指定。

使用 SEEK_CUR

如果你使用的是 SEEK_CUR ,锁定区域的起点将相对于当前文件指针位置进行计算。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>int main() {int fd = open("example.txt", O_RDWR);if (fd < 0) {perror("open failed");return 1;}struct flock lock;lock.l_type = F_WRLCK; // 写锁lock.l_whence = SEEK_CUR; // 相对于当前文件位置lock.l_start = 10; // 从当前文件位置偏移10字节开始锁定lock.l_len = 20; // 锁定20字节if (fcntl(fd, F_SETLKW, &lock) < 0) {perror("fcntl failed");close(fd);return 1;}printf("Locked 20 bytes starting 10 bytes from the current position.\n");// 进行一些操作...close(fd);return 0;
}

使用 SEEK_END

如果你使用的是SEEK_END,锁定区域的起点将相对于文件末尾的位置进行计算。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>int main() {int fd = open("example.txt", O_RDWR);if (fd < 0) {perror("open failed");return 1;}struct flock lock;lock.l_type = F_WRLCK; // 写锁lock.l_whence = SEEK_END; // 相对于文件末尾lock.l_start = -20; // 从文件末尾向回偏移20字节开始锁定lock.l_len = 20; // 锁定20字节if (fcntl(fd, F_SETLKW, &lock) < 0) {perror("fcntl failed");close(fd);return 1;}printf("Locked 20 bytes ending at the file end.\n");// 进行一些操作...close(fd);return 0;
}

总结

  • SEEK_SET: 锁定区域相对于文件开头。用于锁定文件的某个绝对位置到指定的长度。

  • SEEK_CUR: 锁定区域相对于当前文件位置。用于在文件当前位置基础上进行锁定。

  • SEEK_END: 锁定区域相对于文件末尾。用于锁定文件的最后部分或倒数部分。


http://www.ppmy.cn/embedded/103835.html

相关文章

38次8.28(docker03:容器网络,主从镜像)

1.容器网络 1.本地⽹络 bridge yum -y install bridge-utils 2.查看桥⽂件 yum provides *bin/brctl brctl show #使⽤docker network 查看桥 docker network ls 每⼀台dcoker host上的docker0所在⽹段完全⼀样&#xff0c;但是会造成跨主 机的容 器⽆法通信 3.host 与…

资源分享,打开夸克保存文件

这都是我自己的视频和资源&#xff0c;没有版权投诉&#xff0c;别搞了 ai小说推文视频教程 【创绘&#xff1a;一键出片教程】 创绘&#xff1a;一键出片教程_哔哩哔哩_bilibili 前端学习资料 链接&#xff1a;夸克网盘分享

2.10鼠标事件

目录 实验原理 实验代码 运行结果 文章参考 实验原理 在 OpenCV 中存在鼠标的操作&#xff0c;比如左键单击、双击等。对于 OpenCV 来讲&#xff0c;用户的鼠标操作被认为发生了一个鼠标事件&#xff0c;需要对这个鼠标事件进行处理&#xff0c;这就是事件的响应。下面我们…

基于vue框架的仓库物流信息管理系统设计和实现0a6d7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;供应商,商品分类,商品信息,商品入库,车辆信息,订单出库,订单发货,订单抵达,用户 开题报告内容 基于Vue框架的仓库物流信息管理系统设计和实现 开题报告 一、研究背景与意义 随着全球电子商务的蓬勃发展和物流行业的迅速崛起&#xff…

CAN协议通信 学习笔记

文章目录 1.CAN通信简介2.物理层2.1 CAN总线的电气特性2.2 CAN的位同步机制&#xff08;了解&#xff0c;用于理解CAN的初始化参数的配置原理&#xff09;硬同步方式重新同步方式 2.3 CAN对比其他常用协议的优势 3. 数据链路层3.1 CAN协议的数据帧3.2 仲裁机制3.3 访问控制3.4 …

【架构设计】安全架构设计

安全架构概述 在当今以计算机、网络和软件为载体的数字化服务几乎成为人类社会赖以生存的手段&#xff0c;与之而来的计算机犯罪呈现指数上升趋势&#xff0c;因此&#xff0c;信息的可用性、完整性、机密性、可控性和不可抵赖性等安全保障有位重要&#xff0c;为满足这些诉求&…

002.Python爬虫系列_初识协议

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

Anaconda3-2024安装教程(最新版)

下载链接&#xff1a;https://ga90eobypbb.feishu.cn/docx/BT76deA0YoQ5CfxOXNZcXdjin2f Anaconda3 是一个功能强大的 Python 数据科学平台。它集成了众多科学计算包&#xff0c;如 NumPy、Pandas、Matplotlib 等&#xff0c;方便用户快速搭建数据分析和科学计算环境。Anacond…