2

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

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 有很长的延迟。这里有什么问题?谢谢!

4

1 回答 1

1

发生这种情况是因为您使用的是咨询锁定,即文件没有被物理阻止而无法打开,而是它将通过fcntl().

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

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

于 2013-03-05T15:39:42.563 回答