【发布时间】:2013-01-23 23:32:48
【问题描述】:
我正在编写一个从 STDIN 上的匿名管道读取的 C++ (Windows) 客户端控制台应用程序。我希望能够按如下方式使用我的程序:
echo input text here | my_app.exe
并在应用程序中使用管道输入的文本执行某些操作
或
my_app.exe
然后在应用程序内部使用一些默认文本,而不是来自管道的输入。
鉴于第一种情况,我目前的代码可以从 STDIN 上的管道成功读取:
#include <Windows.h>
#include <iostream>
#include <string>
#define BUFSIZE 4096
int main(int argc, const char *argv[]) {
char char_buffer[BUFSIZE];
DWORD bytes_read;
HANDLE stdin_handle;
BOOL continue_reading;
unsigned int required_size;
bool read_successful = true;
stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
if (stdin_handle == INVALID_HANDLE_VALUE) {
std::cout << "Error: invalid handle value!\n\n";
} else {
continue_reading = true;
while (continue_reading) {
continue_reading = ReadFile(stdin_handle, char_buffer, BUFSIZE,
&bytes_read, NULL);
if (continue_reading) {
if (bytes_read != 0) {
// Output what we have read so far
for (unsigned int i = 0; i < bytes_read; i++) {
std::cout << char_buffer[i];
}
} else {
continue_reading = false;
}
}
}
}
return 0;
}
我知道我对匿名管道的唯一选择是使用 ReadFile 进行阻塞读取。如果我理解正确,关于我如何调用它,ReadFile 将继续从 STDIN 上的缓冲区读取,直到它检测到管道另一端的写操作结束(也许读取某种“写结束”令牌??)。我想知道是否有某种“开始写入”令牌将在缓冲区中,如果我可以在其中检查 STDIN BEFORE 我调用 ReadFile。如果是这种情况,我可以跳过调用 ReadFile 并使用一些默认文本。
如果没有办法做到这一点,我总是可以传入一个命令行参数,表示我不应该检查管道而只使用默认文本(或其他方式),但我更喜欢按照我指定的方式进行。
【问题讨论】:
标签: winapi visual-c++ pipe