我无法理解我的程序行为。
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程序。 我已经开始了一个将数据附加到某个文件的请求。 正如你所看到的,locking后延迟60秒。 然后我没有这个延迟重新编译的程序,并做了下一个请求。 第二个程序在// 1111和// 22222之间等待,直到第一个程序退出。 我期望第二个程序在等待5秒后用-1代码返回MyOpenWrite。 但是开放周期不会有延迟。 但LockFile有一个很长的延迟。 这里怎么了? 谢谢!
基于Windows中的文件名中的第一个字创build文件夹?
绘制二进制文件的直方图
比较大的XML文件
如何检查networking共享EXE文件是否被多个用户使用?
发生这种情况是因为您使用了建议性锁定 ,即文件没有被物理阻止被打开,而是通过fcntl()来协调读写器。
您的代码的两个版本都使用LockFile()的相同代码,这意味着第二个代码将等待第一个; open()调用不可能失败,除非文件不存在或不能打开读写。
如果你不想等待文件已经被锁定,你应该使用F_SETLK而不是F_SETLKW 。 如果无法获得锁定,则会立即返回-1 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。