You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写reader.c以等待被锁定的文件解锁?附writer.c代码

编写reader.c实现等待文件解锁后操作

以下是符合需求的reader.c代码,它会等待writer.c释放文件锁后再执行读取操作:

#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h>
#include <fcntl.h>

int main() {
    // 以只读二进制模式打开目标文件
    FILE *fp = fopen("f.bin", "rb");
    if (fp == NULL) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    int fd = fileno(fp);
    // 请求共享锁,默认阻塞直到排他锁释放
    if (flock(fd, LOCK_SH) == -1) {
        perror("Failed to acquire lock");
        fclose(fp);
        return EXIT_FAILURE;
    }

    printf("Lock acquired, starting read...\n");
    int a;
    // 读取文件中的整数数据
    if (fread(&a, sizeof(int), 1, fp) != 1) {
        perror("Failed to read data");
        flock(fd, LOCK_UN);
        fclose(fp);
        return EXIT_FAILURE;
    }
    printf("Read value: %d\n", a);

    // 释放锁并关闭文件
    flock(fd, LOCK_UN);
    fclose(fp);
    return EXIT_SUCCESS;
}

核心逻辑说明

  • 锁机制匹配:和writer.c保持一致使用flock锁,flock是基于整个文件的跨进程锁,不同进程间的锁状态互通。
  • 阻塞等待:flock(fd, LOCK_SH)默认是阻塞调用,当文件被writer.c的排他锁(LOCK_EX)占用时,reader.c会自动休眠,直到锁被释放后再继续执行。
  • 锁类型选择:用LOCK_SH共享锁更合理,读操作不需要独占文件,多个reader.c进程可以同时获取共享锁,不会互相阻塞。如果需要独占式操作,可替换为LOCK_EX,同样会等待解锁。
  • 错误处理:添加了文件打开、锁获取、数据读取的异常判断,确保程序健壮性。

内容的提问来源于stack exchange,提问作者Vadim Kashtanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:25:13