fcntl的一个疑问

hongbin7698 2011-12-09 10:41:59
使用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

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

这个锁难道只是做做样子?不是内核里面锁住的?不知道我的这个想法有没有错误?
...全文
60 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-12-09
  • 打赏
  • 举报
回复
楼主可以百度一下: 强制性记录锁.
hongbin7698 2011-12-09
  • 打赏
  • 举报
回复
谢谢各位,明白了。原来:

建议性锁就是假定人们都会遵守某些规则去干一件事。用于协作进程间遵守规则而用。并不强制实施。

强制锁则是由内核执行的。
reactiveF 2011-12-09
  • 打赏
  • 举报
回复

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

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

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

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧