Perl 5.x 文档指出,它的 flock(..) 实现将使用以下本地调用之一,从 1 开始,如果不可用,则朝 3 工作:
没关系。但是,您可能已经注意到他们的免责声明,即不应在 NFS 上使用 flock(2)。该文档建议使用 -Ud_flock 标志来强制 Perl 使用 flock(2)。flock(2) 的手册页(在 Redhat 上)陈述了关于 NFS 问题的类似免责声明。
我的问题是,为什么!?!?我似乎找不到深入的文章或解释为什么 flock(2) 在 NFS 上不安全。
我已经在 Redhat(使用 flock(2) 的地方)和 Solaris(使用 fcntl(2) 的地方)用 C 和 Perl 编写了几个测试脚本。我运行了 strace/truss 以确保 Perl 确实分别使用了 flock(2) 和 fcntl(2)。我无法复制任何没有兑现锁的问题!是什么赋予了??
我有 2 个应用程序:
我目前从生产者那里写出中间结果,然后消费者从磁盘读取这些文件并产生最终结果。
我想通过将生产者的输出直接“流式传输”到消费者来最小化这个 I/O。
我碰到命名管道(mkfifo)和随后的例子在这里。这看起来很棒,但我无法确定的是实际是如何实现的?FIFO 队列是否只是通过文件进行缓冲?如果是这样,那可能对我没有帮助。我希望内容完全“通过内存”流式传输而不使用磁盘。也许这在整个流程中是不可能的?
我在 Redhat 系统上遇到了一个非常奇怪的问题。我们有一个 Gzip 压缩的 TAR 文件,其中包含数百个带有绝对路径的小文本文件。它只有 8 MB。我们将此文件复制到已安装的 ext3 HDD 后,它挂起,导致系统崩溃并重新启动。我认为操作系统最终会向“cp”进程发送一个 SIGTERM。sys 日志中的内容不多。
我无法进行太多调试,因为这是一个我无法直接访问的远程系统。我不是在寻找直接的答案,因为我没有提供很多信息。但是,我想有人可能会提到一些我还没有想到的东西,以激发进一步的独立调查。这有点具体,因此为了使其成为更一般的讨论: