Неблокирующий ТСР сервер на select`е. Подключаются писатель и читатель. Сервер принимает от писателя структуру с intами, сохраняет и отдаёт читателю при его подключении. Если писатель не подключается за время t, поля структуры становятся 0xffffffff и читатель различает таймаут писателя.
Если использовать один listen_fd на оба типа, то подключение читателя сбросит таймаут и не узнать о недоступности писателя.
Если listen_fd разные и в readfds внести listen_fd только писателя, то select не обработает подключение читателя. А если в fd_set включить listen_fd обоих, то подключение читателя опять обнулит таймаут.
На ум приходит fork(), где родитель при подключении читателя отправляет SIGUSR1 порождённому, а тот, принявший структуру от писателя или установивший её поля в 0xffffffff при таймауте, передаёт структуру родителю через pipe().
Как обработать ситуацию одним процессом, по возможности без тредов?