【发布时间】:2010-07-01 19:43:46
【问题描述】:
我有一个有趣的情况,我有一个 perl 监视脚本(使用 Linux::Inotify2)监视要放在某个目录中的文件,然后将它们交给 PHP 脚本进行处理。被监视的目录和其中的文件不属于运行监视脚本的用户,但是文件被转储到的整个目录树是 rwxr-xr-x 并且文件是世界可读的。
这是我的两难境地。当使用 system()、exec() 或``从 perl 脚本调用时,PHP 脚本无法打开传递给它的文件的文件句柄。但是,当使用同一有效用户从命令行手动运行脚本时,PHP 脚本可以打开 same 文件上的文件句柄。
有人知道为什么会这样吗?
【问题讨论】:
-
你传递的是句柄还是文件名?从问题中不清楚。
-
你得到什么错误信息?
-
我没有收到任何错误,PHP 子外壳返回没有错误。正如我在下面对答案的评论中提到的,PHP 脚本可以看到该文件存在,但无法在其上打开文件句柄。同样,从命令行运行 PHP 脚本:/usr/bin/php script.php 文件名可以正常工作,并且脚本可以打开文件“文件名”的句柄。但是在 perl 脚本中执行相同的操作: system("/usr/bin/php script.php filename") 会导致 PHP 脚本无法打开文件 'filename' 的句柄。
-
所以,在回答我自己的问题时,这似乎是一种竞争条件,perl 在文件完成传输到目录之前触发系统调用,而不是与系统调用本身。使用 Linux::Inotify2 和 IN_CREATE 的用户请注意,您需要在检查事件时添加 sleep 语句以允许文件传输/复制在尝试处理文件之前完成。