Ответ 1
В Linux несколько дочерних элементов, заканчивающихся до чтения SIGCHLD
с помощью signalfd()
, будут сжаты в один SIGCHLD
. Это означает, что когда вы читаете сигнал SIGCHLD
, вы должны очистить после завершения всех оставшихся детей:
// Do this after you've read() a SIGCHLD from the signalfd file descriptor:
while (1) {
int status;
pid_t pid = waitpid(-1, &status, WNOHANG);
if (pid <= 0) {
break;
}
// something happened with child 'pid', do something about it...
// Details are in 'status', see waitpid() manpage
}
Я должен отметить, что я действительно видел это сжатие сигнала, когда два дочерних обработанных завершались одновременно. Если я сделал только один waitpid()
, один из оставшихся детей не был обработан; и указанная выше петля зафиксировала его.
Соответствующая документация:
- http://man7.org/linux/man-pages/man7/signal.7.html "В отличие от этого, если несколько экземпляров стандартного сигнала доставляются, пока этот сигнал заблокирован, тогда только один экземпляр очередь"
- http://man7.org/linux/man-pages/man3/sigwait.3p.html "Если перед вызовом sigwait() есть несколько ожидающих экземпляров одного номера сигнала, определяется, есть ли при успешном возврате любые оставшиеся ожидающие сигналы для этого номера сигнала."