日期:2014-05-16  浏览次数:20749 次

fcntl的一个疑问
使用fcntl加上F_WRLCK锁,

struct flock lock;

lock.l_type = F_WRLCK;

lock.l_whence = SEEK_SET;

lock.l_start = 0;

lock.l_len = 0;

if(fcntl(fd,F_SETLK,&lock) == -1)

{

perror("fcntl");

return -1;

}

两个进程都写文件,在锁还没释放时,有一个进程会输出fcntl: Resource temporarily unavailable

但是,如果进程里检测到有锁时不停止写入,即继续写入,貌似仍然可以真的写入东西到文件,覆盖掉另外一个进程写入的内容。

这个锁难道只是做做样子?不是内核里面锁住的?不知道我的这个想法有没有错误?

------解决方案--------------------
楼主可以百度一下: 强制性记录锁.
------解决方案--------------------

这种文件锁属于劝告性锁:

调用fcntl(fd,F_SETLK,&lock)时如果该锁无法被调用者所在进程持有,该函数只返回错误并不阻塞;
如果是fcntl(fd,F_SETLKW,&lock)则阻塞等待获取锁,F_SETLKW中的W表示阻塞等待持有锁;

所以并不是做样子,就是这样的一种机制.