Рекомендуется использовать sigaction вместо сигнала, но в обоих случаях это не даст того, что вам нужно. Если дочерний объект отправляет сигнал, пока предыдущий сигнал все еще обрабатывается, он станет ожидающим сигналом, но если будет отправлено больше сигналов, они будут отброшены (в системах, которые не блокируют входящие сигналы, сигналы могут быть доставлены до восстановления обработчик и снова приводит к отсутствующим сигналам). Для этого нет обходного пути.
Как правило, предполагает , что некоторые сигналы отсутствуют, и позволяет обработчику позаботиться о выходе из детей.
В вашем случае, вместо того, чтобы послать сигнал от ваших детей, просто позвольте детям прекратить. Как только они заканчиваются, обработчик SIGCHLD родителя должен быть использован для их получения. Использование waitpid
с параметром WNOHANG гарантирует, что родительский процесс поймает всех детей, даже если они все завершатся в одно и то же время.
Например, обработчик SIGCHLD, который подсчитывает количество возбужденных детей, может быть:
pid_t pid;
while((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
nrOfChildrenHandled++;
}