微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么fcntl在尝试解锁文件时从不返回错误?

如何解决为什么fcntl在尝试解锁文件时从不返回错误?

| 我写了一个简单的程序来帮助我测试fcntl文件锁定。参数'set \'锁定了我的测试文件。参数“ get \”告诉我文件是否被锁定。参数'un \'尝试解锁文件。 在一个外壳中,我运行该程序来锁定文件。我保持文件打开状态并等待输入。
$ ./lock set
file is locked
hit enter to release lock with a call to fcntl
在另一个外壳程序中,我运行程序来锁定文件。由于文件已被锁定,因此无法正常工作。我运行程序来检查锁。我被告知锁不可用。所有这一切都按预期进行。
$ ./lock get
locking is not possible
$ ./lock set
locking file Failed
如果我尝试在第二个外壳中解锁文件会怎样?当使用l_type = F_UNLCK调用时,fcntl似乎从未向我返回错误
$ ./lock un
unlocked
file either was successfully unlocked or was already unlocked
$ ./lock get
locking is not possible
$ ./lock set
locking file Failed
我知道我的解锁代码很好。如果我回到外壳一并让程序解锁:
$ ./lock set
file is locked
hit enter to release lock with a call to fcntl

unlocked
hit enter to close the file
我可以在shell 2中确认结果:
$ ./lock get
locking is possible
我只在整个文件上使用排他写锁:
  fl.l_type = F_WRLCK;
  fl.l_whence = SEEK_SET;
  fl.l_start = 0;
  fl.l_len = 0;
  fl.l_pid = -1; // used by F_GETLK only

  result = fcntl(fd,F_SETLK,&fl);
这是我进行解锁的方式:
  fl.l_type = F_UNLCK;
  fl.l_whence = SEEK_SET;
  fl.l_start = 0;
  fl.l_len = 0;
  fl.l_pid = -1; // used by F_GETLK only

  result = fcntl(fd,&fl);
  if (!result)
  {
    printf(\"unlocked\\n\");
  }
我正在使用RHEL 5.5。 您能解释这种fcntl行为吗?谢谢! 编辑:手册页似乎暗示着解锁操作只应由锁所有者使用:\“以及被显式F_UNLCK删除,记录锁会在进程终止或关闭任何文件自动释放描述符指的是持有锁的文件。\“     

解决方法

因为...这就是它的工作方式? 在Unix系统上,建议使用锁。您可以通过尝试获取锁来使用它们,并且只有成功后才做您想做的事情。 这包括解锁文件。因为整个系统是自愿的,所以没有什么可以阻止您从另一个进程中解锁文件,因此您的程序总是可以成功地这样做。     ,更重要的是,这就是POSIX指定他们要做的事情。这与他们就文件锁所做的唯一甚至是最可疑的决定相去甚远(后者是当打开任何具有文件描述符的进程时,必须放弃给定文件在系统范围内的所有锁)文件
close()
)。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。