Я просто беру этот пример с lwm
:
https://github.com/jamesfcarter/lwm/blob/9483c2a7d7e2b765b0a329b8f694f8a9110d0918/lwm.c#L195-L205
if (select(max_fd, &readfds, NULL, NULL, NULL) > -1) {
if (FD_ISSET(dpy_fd, &readfds)) {
while (XPending(dpy)) {
XNextEvent(dpy, &ev);
dispatch(&ev);
}
}
}
Может кто-нибудь объяснить, что происходит под капотом в упрощенной форме?
Вот мой дубль:
Вы проверяете, доступна ли клавиатура или мышь для чтения в readfs
?
Если да, то выспрашивают, есть ли какие-либо ожидающие события в очереди событий X Server
.Но для того, чтобы это имело смысл, X Server
, вероятно, будет иметь read
те точные те же fd
, делать необходимые вызовы функций и создавать затем структуры данных, а затем сообщать, что есть какое-то событиеимеется в наличии?Возможно даже, что он все еще не готов и XPending
может сказать, что ничего не доступно (в зависимости от того, блокируется он или нет) и пропустить его во время этого select
вызова?
Теперь, если действительно есть ожидающее событие, XNextEvent
может обработать его.Но это может даже обработать больше , чем то, что было доступно, когда произошел выбор?Допустим, за это время произошло 3-4 клика, и он может просто обработать его?
Другими словами, когда мы имеем дело с X
вызовами, будет select
s полностьюнадежны?Это правильный способ сделать это или есть лучшие способы?
Мое понимание select
основано на простых сценариях, таких как echo, где select означает, что я готов обрабатывать вещи, но когда дело доходит до сложногоПри такой обработке, имеет ли смысл делать select
напрямую?
Редактировать: я понимаю, что это не чтение с клавиатуры или мыши напрямую, а отображение fd
https://github.com/jamesfcarter/lwm/blob/9483c2a7d7e2b765b0a329b8f694f8a9110d0918/lwm.c#L193. Iне знаете, какой дисплей будет иметь fd
, но все же, когда дисплей будет готов fd
, мы могли бы просто вызвать XPending и XNextEvent API?Может даже быть вероятность, что в течение этой доли секунды могло произойти что-то дополнительное, что также будет обработано?