我无法理解我的程序行为。
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/