2009-05-15 1 views
6

나는 일종의 같이, 리디렉션 stdin 파이프를 통해 데이터를 가져옵니다 윈도우 C 프로그램이 :, 리디렉션 된 파이프가 non-blocking stdin을 갖는 방법은 무엇입니까?

./some-data-generator | ./myprogram 

문제는 '비 차단 방식으로 stdin에서 읽을 수 있어야한다는 것입니다. 그 이유는 (1) 입력이 데이터 스트림이고 EOF이없고 (2) 프로그램에서 언제든지 stdin 읽기 스레드를 중단 할 수 있어야합니다. fread은 데이터가 없을 때 차단되므로 매우 어려워집니다.

유닉스에서 이것은 파일 디스크립터의 차단 모드를 fcntlO_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를 사용했습니다.

나는 무엇을해야할지 모르겠습니다. 이것은 실제로 불가능합니까 (!) 아니면 그냥 매우 난독 화입니까? 이 특정 문제에 대해서는 그물에있는 리소스가 다소 희박합니다.

답변

3

주문 apprach에서 읽을 준비가 입력이 확인 :

  • 콘솔 모드를 들어, 당신은 GetNumberOfConsoleInputEvents()을 사용할 수 있습니다. 파이프 재 지정에
  • , 당신은 PeekNamedPipe()를 사용하여 핸들이 익명 파이프의 경우 작동하지 않습니다
+0

PeekNamedPipe가 내가 찾고있는 것이었다. 그러면 블록되지 않도록 ReadFile을 호출 할 수있다. – paleozogt

1

비동기 I/O를 사용하여 ReadFileEx() WIN32 호출과 같은 핸들에서 읽을 수 있습니다. CancelIo()를 사용하여 입력이 없을 경우 읽기를 종료하십시오.

참조 MSDN이 http://msdn.microsoft.com/en-us/library/aa365468(VS.85).aspx

+1

- 그것은 예를 들어 질문에 제공 될 것이다있다. 겹쳐진 (비동기) 익명 파이프에서는 I/O를 사용할 수 없습니다. –