不久前,我看到一篇关于使用fifo
?将消息从一个控制台窗口传输到另一个控制台窗口的文章。
我以前没有使用过它,也找不到我的文章链接。我该如何设置?
我希望打开两个控制台进行日志记录,并让一个控制台显示从另一个控制台发送的日志消息(实时)。
答案1
当通过 mkfifo 创建命名管道(或者您可以执行的任何其他操作)时,它会创建一个管道“文件”,该文件将保留在原处,直到它被删除(或者,在某些情况下,直到您的计算机重新启动,如果您忘记了)去掉它)。您可以简单地使用 mkfifo 创建自己的命名管道,因为它需要很少的参数,如下所示:
host # mkfifo -m 777 /tmp/corncob
这就是创建命名管道 /tmp/corncob 所需的全部内容。用于设置权限的 -m 标志不是必需的。通常,如果不包含它,新命名管道的默认权限集将是系统的默认权限集。另外,您还可以传递 -m 标志并设置 alpha 权限,而不是八进制,例如:
host # mkfifo -m a=rwx /tmp/corncob
创建完全相同的东西。您可以像删除文件一样删除命名管道。 rm,然后就消失了。
关于命名管道,您应该注意的一件事是,它们通常(据我所知)一次只能通过自身完全传递一个输入/输出流。也就是说,如果有一个进程向命名管道发送输入,并且有两个进程从命名管道读取数据,则只有其中一个读取进程会收到输出。还应该注意的是,如果存在这种情况,一旦接收输出的原始进程退出,另一个进程将开始从命名管道接收输出(如果它仍在尝试从中读取)。这是一个很长的句子还是我只是打字太快了? ;)
下面是我的意思的一个例子:
host-term1 # while :;do echo a b c d e >/tmp/corncob;sleep 15;done
host-term2 # tail -f /tmp/corncob
a b c d e
a b c d e
a b c d e
a b c d e
a b c d e
a b c d e
a b c d e
a b c d e
host-term3 # tail -f /tmp/corncob
host-term2 # ^C
host-term3 #
^C
a b c d e
a b c d e
a b c d e
a b c d e
答案2
使用该mkfifo
命令创建一个 fifo 队列,将输出通过管道传输到该队列(tee
如果您希望在两个终端上都输出,请使用而不是重定向),然后将cat
其输出到另一个终端上。请注意,fifo 会阻塞,因此您必须确保使用它的方式不会停止程序。