나는 일종의 같이, 리디렉션 stdin
파이프를 통해 데이터를 가져옵니다 윈도우 C 프로그램이 :, 리디렉션 된 파이프가 non-blocking stdin을 갖는 방법은 무엇입니까?
./some-data-generator | ./myprogram
문제는 '비 차단 방식으로 stdin
에서 읽을 수 있어야한다는 것입니다. 그 이유는 (1) 입력이 데이터 스트림이고 EOF
이없고 (2) 프로그램에서 언제든지 stdin
읽기 스레드를 중단 할 수 있어야합니다. fread
은 데이터가 없을 때 차단되므로 매우 어려워집니다.
유닉스에서 이것은 파일 디스크립터의 차단 모드를 fcntl
과 O_NONBLOCK
으로 설정할 수 있기 때문에 문제가되지 않습니다. 그러나 fcntl
은 창에 없습니다.
DWORD mode= PIPE_READMODE_BYTE|PIPE_NOWAIT;
BOOL ok= SetNamedPipeHandleState(GetStdHandle(STD_INPUT_HANDLE), &mode, NULL, NULL);
DWORD err= GetLastError();
을하지만이 ERROR_ACCESS_DENIED
(0x5
)와 함께 실패
SetNamedPipeHandleState
를 사용했습니다.
나는 무엇을해야할지 모르겠습니다. 이것은 실제로 불가능합니까 (!) 아니면 그냥 매우 난독 화입니까? 이 특정 문제에 대해서는 그물에있는 리소스가 다소 희박합니다.
PeekNamedPipe가 내가 찾고있는 것이었다. 그러면 블록되지 않도록 ReadFile을 호출 할 수있다. – paleozogt