例如,假设我有以下shell命令。
~]$ foobar 2>> foobar.log
上述命令将标准错误输出(stderr
或文件描述符2
)重定向到文件foobar.log
,附加输出(>>
而不是>
{1}})。
现在,假设两个用户都运行完全相同的命令。在这种情况下,文件的输出是交错的,这使得它很难阅读。
程序可以利用"咨询文件锁定" (通过fcntl()
C函数)作为文件上的操作系统级别互斥,实质上协调多个进程,以便在任何给定时间只有一个进程写入文件。因此,两个进程的输出不再交错,变得更容易阅读。
但是,shell如何实现上面的调用?如果他们使用pipe()
系统调用,则咨询文件锁定将不起作用。另一方面,如果他们在调用dup()
之前使用fork()/exec()
(或其他变体),则咨询文件锁定应该有效。
在哪种情况下,咨询文件锁定是否应该在shell重定向标准输出(stdout
,文件描述符1)和标准错误(stderr
,文件描述符2)上工作?
答案 0 :(得分:0)
fcntl()
文件锁绑定到进程,而不是线程。因此,锁定附加到仅对该进程可用的内容的文件描述符似乎没用。不仅没有实际要锁定的文件(例如,机制必须以某种方式不同),锁定其自己的stderr的进程与其他人没有竞争锁定。
答案 1 :(得分:0)
根据@nos的评论,这可能取决于操作系统和文件描述符2所连接的文件类型。例如,如果将标准错误传送到另一个程序,则上述调用将不起作用,如下所示:
~]$ mkfifo pipe
~]$ cat pipe
~]$ foobar 2>> pipe
但是,如果将标准错误重定向到常规文件(如上例所示),那么咨询文件工作确实起作用,至少在Arch Linux上是这样。