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

时间:2013-03-05 14:22:28

标签: 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秒后在MyOpenWrite中返回-1代码。 但开放周期没有延迟。 但是LockFile有很长的延迟。 这里有什么不对? 谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

如果您不想在文件已被锁定时等待,则应使用F_SETLK代替F_SETLKW。如果无法获得锁定,则会立即返回-1