Eu basicamente quero testar se stdin tem entrada (como se você ecoasse e canalizasse). Encontrei soluções que funcionam, mas são feias e gosto que minhas soluções sejam limpas.
No linux, eu uso isso:
bool StdinOpen() {
FILE* handle = popen("test -p /dev/stdin", "r");
return pclose(handle) == 0;
}
Sei que devo adicionar mais tratamento de erros, mas não vem ao caso.
No Windows, eu uso isto:
bool StdinOpen() {
static HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD bytes_left;
PeekNamedPipe(handle, NULL, 0, NULL, &bytes_left, NULL);
return bytes_left;
}
Isso é bom para Linux, mas eu quero saber quais são as APIs equivalentes que posso chamar sem usar um pipe (como para test -f $ file
você do fopen ($ file, "r")! = NULL
). Tenho a impressão de que poderia abrir ("/ dev / stdin", "r")
e fazer a mesma coisa, mas quero saber a melhor maneira de fazer isso.
Resumo: Quero saber as APIs que posso usar para substituir test -p / dev / stdin
para linux e, se você souber uma solução melhor para Windows.