표준 루비 라이브러리 "io/wait"는 사용 가능한 입력이 있으면 nil이 아닌 값을 반환하는 IO 객체 ready?
에 대한 메서드를 제공하고 그렇지 않으면 nil 또는 false를 반환합니다. sysread
과 syswrite
과 같은 일부 메서드는 gets
및 read
과 같은 상위 수준 메서드와 함께 사용하는 것이 안전하지 않으므로 ready?
이 상위 수준 메서드와 혼합해도 안전한지 알고 싶습니다. 준비된 방법은 IO.select
에 의존하는 것보다 다소 유용하고 아마도 더 우아한 것처럼 보이지만, 놀랍게도 나는 많이 사용하지는 못했다. documentation에 read
또는 gets
과 함께 사용하는 것이 안전하지 않다는 것을 나타낼 수있는 것은 없으며 소켓을 읽거나 쓸 때 궁극적으로 예기치 않은 동작을 일으킬 수있는 호환되지 않는 방법을 혼합하지 않기를 바랍니다.루비의 "준비?" IO 메서드 (gets, puts 등)
편집 : 저는 Ruby 1.8.7을 사용하고 있습니다.
'ready?'메소드는 완전히 블로킹되지 않는 것처럼 보입니다. 나는 그 아래에 루비가 약간의 용량으로 소켓을 버퍼링하고 있거나 아주 짧은 타임 아웃으로'select'처럼 행동하고 있다고 가정합니다. –
몇 군데에 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) ' –
FIONREAD를 사용하여 ioctl의 동작을 자세히 살펴본 결과 IO (TCPSocket) 객체가 호출을 지원하는 한이 메소드가 "상위 수준"읽기 메소드와 함께 사용하는 것이 안전하다는 것을 알았습니다. 통찰력에 감사드립니다. –