gpt4 book ai didi

multithreading - Perl File::NFSLock 无法获取锁,错误为 EACCESS

转载 作者:行者123 更新时间:2023-12-03 12:58:06 26 4
gpt4 key购买 nike

我在 NFS 挂载上有一个文件,该文件针对在其上执行的每个操作都被锁定和解锁。
最初我使用 flock(filehandle, LOCK_EX|LOCK_NB)但该尝试失败了 I/O Error .
在浏览多个论坛时,我找到了一个可以使用的解决方案 File::NFSLock锁定/解锁 NFS 共享上的文件。但是,NFSLock 在第一次尝试锁定和解锁文件时成功,但是当 2 个进程同时尝试访问锁时,它会失败并返回 EACESS错误。
代码如下:

  • Process 1使用以下代码获取锁并在完成后释放锁:
  •     if ($lock = new File::NFSLock {
    file => $handle,
    lock_type => LOCK_EX|LOCK_NB,
    }) {
  • 现在 2 个进程产生了 fork命令( Process 2Process 3 )。当Process 2尝试使用上述步骤 1 中相同的代码锁定同一个文件,文件锁定失败,错误 Permission Denied . 15 秒后 Process 3试图获取锁也失败了 Permission Denied错误。
    当我执行 fuser -v在文件上,我可以看到 2 个进程 ID( Process 2Process 3 )已打开文件进行写入。

  • 互联网上很少有文件表明 The lock cannot be set because it is blocked by an existing lock on the file. Some systems use EAGAIN in this case, and other systems use EACCES但是在我的场景中似乎并非如此 Process 1已经释放了锁。
    另请注意,所有 3 个进程都是从同一个脚本生成的,因此不应该存在不同用户尝试获取锁的问题。
    谢谢你!

    最佳答案

    File::NFSLock 为其 file 需要一个文件路径——而不是文件句柄。范围。用文件路径替换文件句柄解决了这个问题。

    if ($lock = new File::NFSLock {
    file => $path, # Previously, I used file handle here.
    lock_type => LOCK_EX|LOCK_NB,
    }) {

    关于multithreading - Perl File::NFSLock 无法获取锁,错误为 EACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66525168/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com