使用双向 popen

使用双向 popen

FreeBSD 2.2.6 中添加了双向popen()功能,并且在 MacOS 中可用。我有一个 C 程序,它写入一个以换行符分隔的字符串流,我希望它能够将其通过管道传输到我编写的名为的 Perl 工具它从 STDIN 读取这样的流,对其进行缓冲,然后以多列、垂直排序的格式将其写入 STDOUT。

在C程序中,我使用:

FILE *cols_pipe = popen("cols", "r+");打开管道并启动;

fprintf( cols_pipe, "%s\n", word );将每个换行符终止的单词发送到 cols;和

while ((getline(&line_buf, &line_buf_len, cols_pipe)) != -1) {
     printf("%s", line_buf);
}

读回并打印重新格式化的行。当程序挂起时,getline()我意识到这是因为没有收到 STDIN 上的 EOF,但正在关闭列管(我能想到的发送 EOF 的唯一方法)会阻止我回读。

明显地,在读取所有输入之前无法开始写入输出。

关于如何实现这一目标有什么建议吗? C 程序是交互式的,所以我不想简单地从命令行调用它,并将 STDOUT 通过管道传输到

答案1

由于 Perl 程序(如所写)需要 STDIN 上的 EOF,并且实现此目的的唯一方法是关闭输入管道,因此这不适用于popen().然而,由于您拥有 Perl 代码,您可能会考虑添加一个命令选项来定义一个特殊标记,该标记指示“输入结束”,这在很大程度上遵循“heredocs”的宏伟传统,以便它可以识别输入流的结束并在输入管道不关闭的情况下开始响应。

相关内容