2017-01-09 1 views
1

나는 새로운 질문이 아니라고 생각한다 : 나는 X 서버 (XCB 경유)와 TCP로 연결된 다른 서버로부터 읽어야하는 스레드를 가지고 있으므로 select를 호출해야한다.select와 xcb_poll_for_event를 함께 사용하는 안전한 방법은 무엇입니까?

나를 혼란스럽게하는 것은 프로그램이 select에서 돌아 오면 X 서버 링크에 데이터가 있음을 알리는 것입니다. 데이터가 XCB 이벤트에 충분하지 않으면 어떻게해야합니까? 이 경우 xcb_poll_for_event()는 NULL을 반환해야하지만, 프로그램이 다시 select를 호출하면 결국 데이터가 일부 차단되어 차단되지 않으므로 프로그램이 "busy"대기 상태로 트랩됩니다.

이 문제가 유효한가요? 나는 각 XCB 이벤트가 많은 바이트로 구성되어 있기 때문에 서버가 전송 중에 중단 될 수 있다고 생각한다.

답변

0

어떻게 으로 setsockopt()를 사용하여 XCB 이벤트의 필요한 크기로 XCB의 FD의 SO_RCVLOWAT 설정에 대한. 이제 소켓의 파일 디스크립터는 최소한 읽어야하는 양의 데이터 읽기가있을 때만 읽을 수있는 것으로 선택한다. 이것은 TCP 서버를 다룰 ​​때 사용했던 일반적인 접근 방법입니다. XCB fd로 시도하지 않았습니다.

+0

감사합니다. 이전에는이 ​​옵션을 알지 못했지만 여기서는 XCB 이벤트에 필요한 바이트 수를 예측할 수 없습니다. http://man7.org/linux/man-pages/man7/socket.7.html에 따르면이 옵션이 예상대로 작동하지 않는 것 같습니다. "select (2) 및 poll (2) 시스템 호출은 현재 Linux에서 SO_RCVLOWAT 설정을 따르지 않으며 단일 바이트의 데이터라도 사용할 수있는 경우 소켓을 읽을 수 있도록 표시합니다. 소켓에서 후속 읽기는 SO_RCVLOWAT 바이트를 사용할 수 있습니다. " – Danath

관련 문제