기본적으로 stdin에 입력이 있는지 테스트하고 싶습니다 (에코와 파이프처럼). 나는 작동하는 해결책을 찾았지만 추악하고 솔루션이 깨끗하다고 생각합니다. 리눅스에stdin에 C++ (윈도우 및/또는 리눅스)에 대한 입력이 있는지 테스트하십시오.
내가 이것을 사용
bool StdinOpen() {
FILE* handle = popen("test -p /dev/stdin", "r");
return pclose(handle) == 0;
}
내가 더 오류 처리를 추가해야한다고 알고 있지만,이 점 외에입니다. 창에
나는 이것을 사용 : 리눅스에 대한 괜찮지 만, 내가 파이프를 사용하지 않고 호출 할 수있는 해당 API를 (test -f $file
에 대한 같은 당신이 fopen($file, "r") != NULL
을)이 무엇인지 알고 싶어
bool StdinOpen() {
static HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD bytes_left;
PeekNamedPipe(handle, NULL, 0, NULL, &bytes_left, NULL);
return bytes_left;
}
. 나는 내가 할 수있는 암시가 open("/dev/stdin", "r")
이고 같은 일을하지만, 나는 그것을하는 가장 좋은 방법을 알고 싶다.
요약 : 당신은 창을위한 더 나은 솔루션을 알고 있다면, 나는 리눅스에 대한 test -p /dev/stdin
를 대체하는 데 사용할 수있는 API를 알고 싶어합니다.
표준 입력이 파이프가 아닌 파일 핸들 인 경우 'PeekNamedPipe' 솔루션이 실패합니다. 또한,'handle' 변수는 정적이어서는 안됩니다. 앱이 실행되는 동안 핸들이 리디렉션되면 나중에 자신을 놀라게 할 것입니다. –
@Billy : 핸들을 임의로 리디렉션 할 수 있다고 생각하지 않습니다. 물론, 당신은 당신이 stdin으로 생각하는 것을 바꿀 수도 있지만 오래된 손잡이는 여전히 거기에 있습니다. 그러나 나는 첫 번째 부분에 동의한다. – Mehrdad
Lionel B는 Linux 용 코드를 http://bytes.com/topic/c/answers/841283-how-make-non-blocking-call-cin에서 제공합니다. 토론의 가치도 있습니다. –