Minoru sigaction глобален, он сработает в любом треде и оповестит select. А sigtimedwait ждёт только в одном треде, и если SIGCHLD прилетит не к нему, он так и будет ждать аж до окончания таймаута. А другой тред поймает SIGCHLD и применит к нему default disposition, то есть, в данном случае, проигнорирует
Minoru думаю, что с семафорами невозможно, потому что wait-timeout использует self-pipe trick дважды: один пайп для сигналов, пойманных текущим тредом, а второй — для сигналов, пойманных другими тредами