I hit an infinite loop on gselect.c:58-59. After quick debugging I found that the problem is in loop xgselect.c:58-59: while(n_gfds > gfds_size) gfds_size *= 2; Problem is that: (gdb) p n_gfds $3 = 1 (gdb) p gfds_size $4 = 0 1. It seems that xgselect_initialize was not called as X system is initialized. 2. Is there a reason why the code is not using (much more efficient but equivalent) such code in the first place: if (ngfds > gfds_size) { gfds_size = 1 << g_bit_storage (ngfds); xfree (gfds); gfds = xmalloc (sizeof (*gfds) * gfds_size); } 3. The attached file get rids of initialization at all initializing at the cost of conditional freeing of gfds (and starting mallocing from 1 instead of 128). Best regards