为什么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删除,记录锁会在进程终止或关闭任何文件时自动释放描述符指的是持有锁的文件。\“     

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)