如何在 perl 中读/写命名管道?

Posted

技术标签:

【中文标题】如何在 perl 中读/写命名管道?【英文标题】:How read/write into a named pipe in perl? 【发布时间】:2013-11-12 14:41:48 【问题描述】:

我有一个脚本,它的输入/输出插入到命名管道。我尝试向第一个命名管道写入一些内容并从第二个命名管道读取结果,但没有任何反应。

我使用 open 然后 open2 然后 sysopen 没有成功:

sysopen(FH, "/home/Moses/enfr_kiid5/pipe_CGI_Uniform", O_RDWR);
sysopen(FH2, "/home/Moses/enfr_kiid5/pipe_Detoken_CGI", O_RDWR);
print FH "test 4242 test 4242" or die "error print";

没有出错但没有工作:我看不到打印的痕迹,测试语句没有写入第一个命名管道并尝试从第二个块读取进程。

【问题讨论】:

【参考方案1】:

在这里工作。

$ mkfifo pipe
$ cat pipe &
$ perl -e 'open my $f, ">", "pipe"; print $f "test\n"'
test
$ rm pipe

你真的不需要花哨的sysopen 东西,命名管道确实应该表现得像普通文件,尽管是半双工的。这恰好是您的代码和我的代码之间的差异,如果您真的需要这种打开模式,值得研究。

【讨论】:

\n 是这里的重要线索。 :) 没有它也可以工作(文件关闭事件“越过管道”),但它更好。我没想到那会是 OP 的问题……但是谁知道呢。 由于 OP 可能不会立即关闭文件,因此缓冲可能是一个问题。 老实说,我不太了解 OP 的意图。我刚刚写了一个在 Perl 中使用命名管道的示例。【参考方案2】:

您可能需要在打开管道后取消缓冲输出:

sysopen(...);
sysopen(...);

$old=select FH;
$|=1;
select $old;

print FH...

正如friedo 所说,在打印语句的末尾添加一个回车符(“\n”)!

【讨论】:

我尝试添加一个 \n 并设置缓冲,但没有任何反应。 尝试发布您的代码的完整列表并描述您的平台/环境,也许有人可以更轻松地提供帮助。

以上是关于如何在 perl 中读/写命名管道?的主要内容,如果未能解决你的问题,请参考以下文章

请教PHP里使用命名管道连接本机mysql如何写连接串

将子进程的 stdout 和 stderr 重定向到两个命名管道(然后从它们读回)

请教PHP里使用命名管道连接本机mysql如何写连接串? - 技术问答

shell 命名管道,进程间通信, ncat作http server

Java中命名管道的并发读/写(在Windows上)

在断开连接之前等待读取命名管道