pipe - D 编程 - 如何从 stdin 获取管道内容

标签 pipe d stdin readline readlines

我想在 D 程序的标准输入中获取管道内容(仅当它存在时)。

考虑以下因素

string output;
char[] buf;
while (stdin.readln(buf))
{
    output ~= buf;
}
return output;

如果您通过管道传输内容,这非常有用 例如

echo "poop" | test.exe

将打印出“poop”并继续执行。

但是,如果您只运行 test.exe,它会卡在那里等待 CTRL+C,然后再继续。

我想评估内容已通过管道传入的事实,以便在没有管道内容的情况下我不会执行 readline() 。

有什么线索吗?谢谢!

最佳答案

有两种方法可以做到这一点:询问标准输入上是否有超时的数据,或者查看标准输入是否是管道或用户交互式控制台。这两者都是特定于平台的; D std 库不包含检查它们的函数。既然你说的是exe,我就给Windows一个答案。 (如果您不在 Windows 上,您想要的 posix 函数可能是 selectisatty,请在网上搜索有关它们的信息。您也可以将文件设置为非-阻塞模式并尝试读取。)

要检查数据是否可用,您可以调用 WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 50)。第二个参数是以毫秒为单位的超时 - 50 足够快,对于用户来说它看起来基本上是即时的,同时给程序时间将内容通过管道传送给它。如果对象准备好,它将返回零;如果有可用数据。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032%28v=vs.85%29.aspx

WaitForSingleObjectSTD_INPUT_HANDLE 都是通过首先执行 import core.sys.windows.windows;

在 D 中定义的
import core.sys.windows.windows;
import std.stdio;

void main() {
        if(WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 50) == 0) {
                string output;
                char[] buf;
                while (stdin.readln(buf))
                {
                    output ~= buf;
                }
                writeln(output);
        }
}

要判断 stdin 是否是控制台......好吧,老实说,我不记得如何在 Win32 中执行此操作,需要立即执行!也许今晚我可以回来编辑它,但如果你能找到 C 解决方案,同样的事情也可以在 D 中完成。

另请参阅我对文件结尾问题的评论。

关于pipe - D 编程 - 如何从 stdin 获取管道内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28606452/

相关文章:

c - 如何正确使用dup2/close来连接这三个进程?

c++ - C++ 中的子进程命令

c++ - 支持管道(一个有用的 Hello World)

c - 如何将一个子进程中的 stdout 链接到 C 中另一个子进程中的 stdin?

string - 为什么不能将字符串键存储在关联数组中?

mysql - SQL查询无法处理引号

c++ - 有什么 C++ 可以比 D 做得更好,或者 D 不能做的吗? (多重继承的例子)

Python 子脚本消耗所有标准输入

ruby - STDIN 的非阻塞读取线?

c - 使用 fork() 产生内存映射