c - 同时访问文件。奇怪的锁定行为

标签 c linux file locking

我无法理解我的程序行为。

int MyOpenWrite(char *name,int flags) {
    int fd;
       unsigned long tm;
    unsigned long t;

    tm=time(0)+5;  //5 seconds
    for (;;) {
        fd = open(name,flags,S_IREAD|S_IWRITE|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
        if (fd>0) break;
        if (time(0)>=tm) return -1;
    } 
    //1111111111111111111
    LockFile(fd);
        DelayInSeconds(60);
    //2222222222222222222222
    return fd;
}

int LockFile(int fd) //return 0 - OK; -1 - Error
{
    struct flock    lock;

    lock.l_type = F_WRLCK;
    lock.l_start = 0;
    lock.l_whence = SEEK_SET;
    lock.l_len = 0;
    return fcntl(fd,F_SETLKW,&lock);
}

这是cgi-bin程序。 我已经启动了一个将数据附加到某个文件的请求。 如您所见,它在锁定后延迟了 60 秒。 然后我没有延迟地重新编译了程序 并做了下一个请求。 第二个程序在//1111 和//22222 之间等待 直到第一个程序退出。 我预计第二个程序在等待 5 秒后以 -1 代码返回 MyOpenWrite。 但开盘周期没有延迟。 但是LockFile有很长的延迟。 这里有什么问题吗? 谢谢!

最佳答案

发生这种情况是因为您正在使用建议锁定,即文件并未在物理上被阻止打开,而是它将通过 fcntl() 协调读者和作者。

您的代码的两个版本对 LockFile() 使用相同的代码,这意味着第二个版本将等待第一个; open() 调用不太可能失败,除非文件不存在或无法打开进行读写。

如果您不想在文件已锁定时等待,您应该使用 F_SETLK 而不是 F_SETLKW。如果无法获得锁,将立即返回 -1

关于c - 同时访问文件。奇怪的锁定行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15226199/

相关文章:

在 C 函数中创建和访问 Fortran 动态数组

c++ - 无法读取使用相同代码在不同机器上写入的文件

C - 仅从 file.txt 读取奇数行的程序

android - 如何在android上从计算机读取文本文件

c - 我正在尝试写入寄存器 hi 的某些位以启动电源模式进入休眠状态

java - 在 Java 中将 C 的 uint32 转换为 int 的正确方法

c - 应用于位字段的 typeof/__auto_type 的 GNU C 替换/解决方法

c - 小端约定,并保存到二进制文件

linux - ubuntu终端检查进程是否正在运行

python - 如何通过 Python 计算 Linux 上具有特定标题的窗口的数量?