2017-01-09 3 views
1

Я думаю, что вопрос не новый: у меня есть поток, который следует читать с X-сервера (через XCB) и другого сервера, подключенного к TCP, поэтому требуется выбрать select.Безопасный способ выбора и xcb_poll_for_event работать вместе?

Что меня смущает, когда программа вернется из выбора, вы увидите, что на X-сервере есть данные, что делать, если данных недостаточно для события XCB? В этом случае xcb_poll_for_event() должен возвращать NULL, но когда вызов программы снова выбирается, он не блокируется, потому что в конце есть некоторые данные, поэтому программа попадает в состояние ожидания «занято».

Является ли это актуальной проблемой? Я так считаю, потому что каждое событие XCB состоит из большого количества байтов, и сервер может быть прерван во время отправки.

ответ

0

Как насчет установки SO_RCVLOWAT для XCB дескриптора с требуемым размером события XCB с использованием setsockopt(). Теперь дескриптор файла сокета будет выбирать только как читаемый, если есть хотя бы этот объем данных, считанных для чтения. Это обычный подход, который мы использовали при работе с сервером TCP, но не пробовал это с помощью XCB fd.

+0

Спасибо. Ранее я этого не знал, но здесь я не могу предсказать, сколько байтов необходимо для события XCB. Согласно http://man7.org/linux/man-pages/man7/socket.7.html, кажется, этот вариант работает не так, как ожидалось? «Системные вызовы select (2) и poll (2) в настоящее время не соответствуют настройке SO_RCVLOWAT в Linux и отмечают сокет, читаемый, когда доступен только один байт данных. Последующее чтение из сокета будет блокироваться до SO_RCVLOWAT байты ". – Danath

Смежные вопросы