【发布时间】:2012-07-05 21:43:01
【问题描述】:
QNX (Neutrino 6.5.0) 使用 ksh 的开源实现作为其外壳。很多提供的脚本,包括系统启动脚本,都使用了诸如
if ! test /dev/slog -ef /dev/slog; then
# do something
fi
检查文件系统中是否存在资源管理器。我已经搜索过,只能找到非常枯燥的解释,-ef 检查这两个参数是否实际上是同一个文件。由于指定的文件名相同,因此似乎只是减少了检查文件是否存在。
我已经检查了 test -a 和 test -e 的行为(根据我阅读过的各种文档,它们似乎都在检查任何类型文件的文件是否存在),它们似乎也可以工作。
-ef 和-a/-e 之间执行的检查有什么区别吗?是否正在使用 -ef 某种尝试来防止文件存在的竞争条件?
【问题讨论】:
-
似乎确实可以检查文件是否存在两个不同的 stat() 调用。只有在有人检查它的存在时,驱动程序/管理器才会删除 /dev 条目(例如,在关闭之后)?
-
@jhfrontz:我不完全确定你的意思,但(例如)/dev/slog 伪设备只有在驱动程序被杀死时才会被删除,这通常不会在中间发生对
test的调用,因为它是初始系统启动脚本的一部分。在 /dev/slog 的正常情况下,一个进程可以写入设备以记录到文件/控制台/内存,虽然它可能以不同的文件名结束,但 /dev 中暴露的设备应该与之前相同写入 /dev/slog。 -
我推测 stat'ing 设备有一些副作用(例如,提示驱动程序/经理做一些家务),例如第一个 stat() 调用(来自@987654332 @) 完成后,驱动程序删除/替换文件/设备——从而导致第二个 stat() 获取不同的信息,进而导致
test失败。我使用 QNX 已经有一段时间了,但the slogger man page 表明与 /dev/slog 交互会产生副作用(例如,取消链接会清除日志)。 -
我做了更多的挖掘 -
test -a和test -e相对较新。在某一时刻,它们似乎不是 QNX 使用的 Posix shell 的一部分(请参阅qnx.com/developers/docs/qnx_4.25_docs/qnx4/utils/s/sh.html。所以我现在怀疑这只是一种遗留模式。 -
@jhfrontz:感谢您的努力,提供最丰富的信息和有用的信息。