2010-04-29 5 views
3

C에서 입력 버퍼를 들여다 보거나 fgets 호출이 나중에 차단되는지 여부를 알기 위해 비슷한 속임수를 수행 할 수 있는지 궁금합니다. 자바() BufferedReader.ready를 호출하여이 같은 콘솔 입력 뭔가를 구현할 수 있습니다 이런 식으로 그런 일을 수행 할 수 있습니다fgets가 차단되는지 확인합니다.

while (on && in.ready()) { 
    line = in.readLine(); 
    /* do something with line */ 
    if (!in.ready()) 
    Thread.sleep(100); 
} 

이 허용하는 외부 스레드를 우아하게 종료 거짓에 설정하여 입력 루프 ; 나는 C와 비슷한 구현을 비 휴대용 트릭에 의지하지 않고 수행하고 싶다. 나는 이미 유닉스에서 신호에 의지하거나 (더 나은 것은 버퍼링을 처리하는 것을 재 요구한다) reimplement하여 "timed out fgets"를 만들 수 있다는 것을 안다. 그것은 recv/select의 상단에 있지만, 나는 창문에서도 작동하는 것을 선호합니다.

TIA는

+0

는 : http://msdn.microsoft.com/en-us/library/ms740141%28VS.85%29.aspx – nc3b

+3

@ nc3b : 윈도우'select' 함수는 소켓 작동 . –

+1

@Marcelo Cantos : 오, 죄송합니다. "> – nc3b

답변

1

소켓으로가는 추천 I/제한 사항과 밀리 초()로 바람직 폴링 결국 타임 아웃을 해석 할 O 루틴 (반환 값 = -1) 입력 버퍼 내의 데이터 가용성있다.
제 생각에는이 기능을 구현하기위한 비 차단 표준 I/O 기능은 없습니다.

0

소켓이나 파일 핸들에 대해 무엇을 말하고 있는지 확실하지 않습니다.

파일의 경우 차단이 없어야합니다. 이 함수는 즉시 (I/O 호출 자체와 함께) 반환됩니다. -

소켓의 경우 당신은 ioctlsocket 기능을 사용할 수 있습니다 : 보류 RCV 데이터가 있다면 다음 이야기 :

ULONG nSize; 
ioctlsocket(sock, FIONREAD, &nSize); 

다음 전송 비 차단 모드로 소켓 :

ULONG nEnable = 1; 
ioctlsocket(sock, FIONBIO, &nEnable); 

비 차단 모드 인 경우 소켓의 기능이 절대 차단되지 않습니다. 사용자가 요청을 이행 할 수 없으면 오류를 반환하고 오류 코드는 WSAEWOULDBLOCK

플러스 Windows의 경우 훨씬 더 효율적인 방법이 있습니다. 그것들은 다음과 같습니다 :

  • 중첩 된 I/O 사용. 이것은 중요하지 않지만 우수한 성능을 제공합니다.
  • 대기중인 이벤트와 소켓 연결. 이렇게하면 소켓이 비 차단 모드로 전환되고 네트워크 이벤트가 발생할 때 지정된 이벤트가 신호로 전달됩니다.
  • 창 핸들과 연결하십시오. 이것은 UI 지향 프로그램에 편리합니다.
선택이 너무 윈도우에서 작동
관련 문제