嵌入式Linux:文件锁

原创 美男子玩编程 2025-03-31 08:01

点击上方蓝色字体,关注我们


Linux 文件锁是一种用于管理多进程或多线程环境中资源访问的机制,确保只有一个进程或线程在特定时间内对文件进行操作,从而避免数据不一致的情况。


文件锁的应用广泛,比如数据库系统、文件共享系统和日志管理等。


Linux 提供了多种文件锁机制,包括 flock、fcntl 和 lockf,每一种方法各有其优缺点和适用场景。


1


使用 flock() 进行文件锁定

flock 是 Linux 中最简便的文件锁方法之一,它提供了对文件整体加锁的功能。


flock 只能提供“建议性锁”(advisory lock),即仅对遵循该机制的进程有效,不会强制阻止其他进程访问。


函数原型如下:


int flock(int fd, int operation);

参数说明

fd:文件描述符,用于指定需要加锁的文件。
operation:操作类型,用于控制锁的方式:
    • LOCK_SH:共享锁,允许多个进程对同一文件读取,不允许写入。
    • LOCK_EX:排它锁(写锁),确保只有一个进程能够写入文件。
    • LOCK_UN:解锁操作,释放锁。
    • LOCK_NB:非阻塞锁标志,与 LOCK_SH 或 LOCK_EX 组合使用。如果无法立即加锁,则返回错误并设置 errno 为 EWOULDBLOCK。

返回值:成功返回 0,失败返回 -1 并设置 errno。


使用示例


int fd = open("example.txt", O_RDWR);if (flock(fd, LOCK_EX | LOCK_NB) == -1) {    perror("Failed to lock the file");    // 处理加锁失败的情况}// 执行文件操作flock(fd, LOCK_UN); // 解锁

flock()的注意事项:

  • flock 仅支持对整个文件进行加锁,无法精确到文件的某一部分。
  • 因为是建议性锁,其他不使用文件锁的进程依然可以访问文件内容。

2


使用 fcntl() 进行文件锁定

fcntl 提供了更灵活的文件锁定机制,包括文件区域锁定功能,并支持建议性锁和强制性锁。


相比 flock,fcntl 更复杂且功能强大。


函数原型如下:


int fcntl(int fd, int cmd, ... /* struct flock *flockptr */ );

与锁相关的 cmd

F_GETLK:检测文件是否有锁冲突。会根据当前文件的锁状态更新 struct flock 指针的值。
F_SETLK:非阻塞加锁。用于添加或删除锁,若加锁失败,立即返回。
F_SETLKW:阻塞加锁。若无法立即加锁,进程会等待至锁可用。


struct flock 结构体:

struct flock 用于描述锁的详细信息:

l_type:锁类型,可设为 F_RDLCK(读锁,共享锁),F_WRLCK(写锁,排它锁)或 F_UNLCK(解锁)。
l_whencel_startl_len:用于定义锁区域的偏移量和长度。与 lseek() 函数中的 offset 和 whence 参数类似。
l_pid:锁持有者的进程 ID,主要用于检测文件锁冲突时(F_GETLK)。


使用示例


int fd = open("example.txt", O_RDWR);struct flock lock;lock.l_type = F_WRLCK;    // 设置写锁lock.l_whence = SEEK_SET;lock.l_start = 0;         // 从文件头开始加锁lock.l_len = 0;           // 锁定整个文件// 尝试加锁if (fcntl(fd, F_SETLK, &lock) == -1) {    perror("Failed to lock the file");    // 处理加锁失败的情况}// 执行文件操作lock.l_type = F_UNLCK;    // 解锁fcntl(fd, F_SETLK, &lock);

fcntl() 的高级功能和注意事项:

  • 文件区域锁定:支持对文件的特定区域进行加锁,适用于需高精度锁的应用。
  • 强制性锁:支持配置为强制性锁,这样不遵守锁机制的进程也会被阻止访问。
  • 动态锁范围:如果 l_len 设置为 0,锁的范围将从 l_start 开始一直延伸到文件的末尾,且文件扩展时锁区域也会相应扩展。

3


使用 lockf() 进行文件锁定

lockf 是 fcntl 的一个封装函数,简化了使用复杂度。


lockf 本质上依赖于 fcntl 实现,支持文件区域锁定,但不支持强制性锁。


函数原型如下:


int lockf(int fd, int cmd, off_t len);
cmd:控制加锁或解锁行为:
    • F_LOCK:阻塞方式加锁。
    • F_TLOCK:非阻塞方式加锁。
    • F_ULOCK:解锁。
    • F_TEST:测试是否能够加锁。
len:指定锁区域的长度。设置为 0 表示锁定到文件末尾。


使用示例如下


int fd = open("example.txt", O_RDWR);if (lockf(fd, F_LOCK, 0) == -1) {    perror("Failed to lock the file");    // 处理加锁失败}// 执行文件操作lockf(fd, F_ULOCK, 0); // 解锁

lockf 适用于简单的文件锁需求,特别是在锁定整个文件区域时使用方便。


但其功能较 fcntl 有限,通常在精确控制不要求特别高的场景中使用。


Linux 中的文件锁机制提供了灵活的多进程并发控制方案。


flock 简单且适用于整个文件锁定,而 fcntl 更灵活,能够锁定文件的某个区域,并支持阻塞/非阻塞操作。


lockf 作为 fcntl 的封装简化了操作,适合简单的锁需求。


根据应用场景的具体需求选择合适的锁机制是实现高效文件管理的关键。

点击阅读原文,更精彩~

美男子玩编程 多领域、有深度的开发者交流平台
评论 (0)
  • 引言在语音芯片设计中,输出电路的设计直接影响音频质量与系统稳定性。WT588系列语音芯片(如WT588F02B、WT588F02A/04A/08A等),因其高集成度与灵活性被广泛应用于智能设备。然而,不同型号在硬件设计上存在关键差异,尤其是DAC加功放输出电路的配置要求。本文将从硬件架构、电路设计要点及选型建议三方面,解析WT588F02B与F02A/04A/08A的核心区别,帮助开发者高效完成产品设计。一、核心硬件差异对比WT588F02B与F02A/04A/08A系列芯片均支持PWM直推喇叭
    广州唯创电子 2025-04-01 08:53 143浏览
  •        在“软件定义汽车”的时代浪潮下,车载软件的重要性日益凸显,软件在整车成本中的比重逐步攀升,已成为汽车智能化、网联化、电动化发展的核心驱动力。车载软件的质量直接关系到车辆的安全性、可靠性以及用户体验,因此,构建一套科学、严谨、高效的车载软件研发流程,确保软件质量的稳定性和可控性,已成为行业共识和迫切需求。       作为汽车电子系统领域的杰出企业,经纬恒润深刻理解车载软件研发的复杂性和挑战性,致力于为O
    经纬恒润 2025-03-31 16:48 79浏览
  • 引言随着物联网和智能设备的快速发展,语音交互技术逐渐成为提升用户体验的核心功能之一。在此背景下,WT588E02B-8S语音芯片,凭借其创新的远程更新(OTA)功能、灵活定制能力及高集成度设计,成为智能设备语音方案的优选。本文将从技术特性、远程更新机制及典型应用场景三方面,解析该芯片的技术优势与实际应用价值。一、WT588E02B-8S语音芯片的核心技术特性高性能硬件架构WT588E02B-8S采用16位DSP内核,内部振荡频率达32MHz,支持16位PWM/DAC输出,可直接驱动8Ω/0.5W
    广州唯创电子 2025-04-01 08:38 133浏览
  • REACH和RoHS欧盟两项重要的环保法规有什么区别?适用范围有哪些?如何办理?REACH和RoHS是欧盟两项重要的环保法规,主要区别如下:一、核心定义与目标RoHS全称为《关于限制在电子电器设备中使用某些有害成分的指令》,旨在限制电子电器产品中的铅(Pb)、汞(Hg)、镉(Cd)、六价铬(Cr6+)、多溴联苯(PBBs)和多溴二苯醚(PBDEs)共6种物质,通过限制特定材料使用保障健康和环境安全REACH全称为《化学品的注册、评估、授权和限制》,覆盖欧盟市场所有化学品(食品和药品除外),通过登
    张工13144450251 2025-03-31 21:18 102浏览
  • 在智能交互设备快速发展的今天,语音芯片作为人机交互的核心组件,其性能直接影响用户体验与产品竞争力。WT588F02B-8S语音芯片,凭借其静态功耗<5μA的卓越低功耗特性,成为物联网、智能家居、工业自动化等领域的理想选择,为设备赋予“听得懂、说得清”的智能化能力。一、核心优势:低功耗与高性能的完美结合超低待机功耗WT588F02B-8S在休眠模式下待机电流仅为5μA以下,显著延长了电池供电设备的续航能力。例如,在电子锁、气体检测仪等需长期待机的场景中,用户无需频繁更换电池,降低了维护成本。灵活的
    广州唯创电子 2025-04-02 08:34 46浏览
  • 据先科电子官方信息,其产品包装标签将于2024年5月1日进行全面升级。作为电子元器件行业资讯平台,大鱼芯城为您梳理本次变更的核心内容及影响:一、标签变更核心要点标签整合与环保优化变更前:卷盘、内盒及外箱需分别粘贴2张标签(含独立环保标识)。变更后:环保标识(RoHS/HAF/PbF)整合至单张标签,减少重复贴标流程。标签尺寸调整卷盘/内盒标签:尺寸由5030mm升级至**8040mm**,信息展示更清晰。外箱标签:尺寸统一为8040mm(原7040mm),提升一致性。关键信息新增新增LOT批次编
    大鱼芯城 2025-04-01 15:02 149浏览
  • 文/郭楚妤编辑/cc孙聪颖‍不久前,中国发展高层论坛 2025 年年会(CDF)刚刚落下帷幕。本次年会围绕 “全面释放发展动能,共促全球经济稳定增长” 这一主题,吸引了全球各界目光,众多重磅嘉宾的出席与发言成为舆论焦点。其中,韩国三星集团会长李在镕时隔两年的访华之行,更是引发广泛热议。一直以来,李在镕给外界的印象是不苟言笑。然而,在论坛开幕前一天,李在镕却意外打破固有形象。3 月 22 日,李在镕与高通公司总裁安蒙一同现身北京小米汽车工厂。小米方面极为重视此次会面,CEO 雷军亲自接待,小米副董
    华尔街科技眼 2025-04-01 19:39 68浏览
  • 职场之路并非一帆风顺,从初入职场的新人成长为团队中不可或缺的骨干,背后需要经历一系列内在的蜕变。许多人误以为只需努力工作便能顺利晋升,其实核心在于思维方式的更新。走出舒适区、打破旧有框架,正是让自己与众不同的重要法宝。在这条道路上,你不只需要扎实的技能,更需要敏锐的观察力、不断自省的精神和前瞻的格局。今天,就来聊聊那改变命运的三大思维转变,让你在职场上稳步前行。工作初期,总会遇到各式各样的难题。最初,我们习惯于围绕手头任务来制定计划,专注于眼前的目标。然而,职场的竞争从来不是单打独斗,而是团队协
    优思学院 2025-04-01 17:29 87浏览
  • 文/Leon编辑/cc孙聪颖‍步入 2025 年,国家进一步加大促消费、扩内需的政策力度,家电国补政策将持续贯穿全年。这一利好举措,为行业发展注入强劲的增长动力。(详情见:2025:消费提振要靠国补还是“看不见的手”?)但与此同时,也对家电企业在战略规划、产品打造以及市场营销等多个维度,提出了更为严苛的要求。在刚刚落幕的中国家电及消费电子博览会(AWE)上,家电行业的竞争呈现出胶着的态势,各大品牌为在激烈的市场竞争中脱颖而出,纷纷加大产品研发投入,积极推出新产品,试图提升产品附加值与市场竞争力。
    华尔街科技眼 2025-04-01 19:49 73浏览
  • 提到“质量”这两个字,我们不会忘记那些奠定基础的大师们:休哈特、戴明、朱兰、克劳士比、费根堡姆、石川馨、田口玄一……正是他们的思想和实践,构筑了现代质量管理的核心体系,也深远影响了无数企业和管理者。今天,就让我们一同致敬这些质量管理的先驱!(最近流行『吉卜力风格』AI插图,我们也来玩玩用『吉卜力风格』重绘质量大师画象)1. 休哈特:统计质量控制的奠基者沃尔特·A·休哈特,美国工程师、统计学家,被誉为“统计质量控制之父”。1924年,他提出世界上第一张控制图,并于1931年出版《产品制造质量的经济
    优思学院 2025-04-01 14:02 104浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦