2009-11-22 4 views
3

표준 루비 라이브러리 "io/wait"는 사용 가능한 입력이 있으면 nil이 아닌 값을 반환하는 IO 객체 ready?에 대한 메서드를 제공하고 그렇지 않으면 nil 또는 false를 반환합니다. sysreadsyswrite과 같은 일부 메서드는 getsread과 같은 상위 수준 메서드와 함께 사용하는 것이 안전하지 않으므로 ready?이 상위 수준 메서드와 혼합해도 안전한지 알고 싶습니다. 준비된 방법은 IO.select에 의존하는 것보다 다소 유용하고 아마도 더 우아한 것처럼 보이지만, 놀랍게도 나는 많이 사용하지는 못했다. documentationread 또는 gets과 함께 사용하는 것이 안전하지 않다는 것을 나타낼 수있는 것은 없으며 소켓을 읽거나 쓸 때 궁극적으로 예기치 않은 동작을 일으킬 수있는 호환되지 않는 방법을 혼합하지 않기를 바랍니다.루비의 "준비?" IO 메서드 (gets, puts 등)

편집 : 저는 Ruby 1.8.7을 사용하고 있습니다.

답변

3

저는 Ruby에 대한 많은 경험이 없지만 libc에 대한 많은 경험이 있습니다. 제 의견은 그렇습니다. 안전합니다.

"ready"는 tv_sec 및 tv_usec에 0이 붙은 timeval을 전달한 select()와 유사하게 동작합니다. 예를 들어, "ready"는 select() 또는 poll 그러면 "준비 중"의 단점은 당신이 회전 할 것이라는 것입니다 ... 준비가 끝난 후 타임 아웃을 할 수 있습니까?

+0

'ready?'메소드는 완전히 블로킹되지 않는 것처럼 보입니다. 나는 그 아래에 루비가 약간의 용량으로 소켓을 버퍼링하고 있거나 아주 짧은 타임 아웃으로'select'처럼 행동하고 있다고 가정합니다. –

+0

몇 군데에 io/wait Ruby 라이브러리의 실제 C 소스를 찾았습니다 (예 : http://cvs.opensolaris.org/source/xref/webstack/webstack/trunk/src/ruby-1.8.5). /ext/io/wait/wait.c) 대학 때부터 C로 저레벨 소켓 프로그래밍을 해보지는 않았지만, 초기 체크를 제외하고 실제 작업은'ioctl (file_num, FIONREAD & n) ' –

+0

FIONREAD를 사용하여 ioctl의 동작을 자세히 살펴본 결과 IO (TCPSocket) 객체가 호출을 지원하는 한이 메소드가 "상위 수준"읽기 메소드와 함께 사용하는 것이 안전하다는 것을 알았습니다. 통찰력에 감사드립니다. –