咨询文件锁定是否适用于默认文件描述符?

时间:2018-04-05 12:37:55

标签: c file-locking fcntl

例如,假设我有以下shell命令。

~]$ foobar 2>> foobar.log

上述命令将标准错误输出(stderr或文件描述符2)重定向到文件foobar.log,附加输出(>>而不是> {1}})。

现在,假设两个用户都运行完全相同的命令。在这种情况下,文件的输出是交错的,这使得它很难阅读。

程序可以利用"咨询文件锁定" (通过fcntl() C函数)作为文件上的操作系统级别互斥,实质上协调多个进程,以便在任何给定时间只有一个进程写入文件。因此,两个进程的输出不再交错,变得更容易阅读。

但是,shell如何实现上面的调用?如果他们使用pipe()系统调用,则咨询文件锁定将不起作用。另一方面,如果他们在调用dup()之前使用fork()/exec()(或其他变体),则咨询文件锁定应该有效。

在哪种情况下,咨询文件锁定是否应该在shell重定向标准输出(stdout,文件描述符1)和标准错误(stderr,文件描述符2)上工作?

2 个答案:

答案 0 :(得分:0)

fcntl()文件锁绑定到进程,而不是线程。因此,锁定附加到仅对该进程可用的内容的文件描述符似乎没用。不仅没有实际要锁定的文件(例如,机制必须以某种方式不同),锁定其自己的stderr的进程与其他人没有竞争锁定。

答案 1 :(得分:0)

根据@nos的评论,这可能取决于操作系统和文件描述符2所连接的文件类型。例如,如果将标准错误传送到另一个程序,则上述调用将不起作用,如下所示:

~]$ mkfifo pipe
~]$ cat pipe
~]$ foobar 2>> pipe

但是,如果将标准错误重定向到常规文件(如上例所示),那么咨询文件工作确实起作用,至少在Arch Linux上是这样。