Вы можете позвонить
int status;
pid_t waitpid(-1, &status, 0);
, чтобы дождаться любого изменения дочернего процесса. Таким образом, вам не нужно заранее указывать, какой pid следует отслеживать, и вы можете реагировать на любое изменение статуса. Таким образом, вам не нужно запускать один поток для каждого pid.
Что касается сигнальной части вашего вопроса: SIGCHLD
отправляется вашему процессу при выходе из дочернего процесса. Этот сигнал по умолчанию игнорируется, но вы, конечно, можете установить для него специальный обработчик сигнала.
Если вы хотите только получить указанные c pids, linux предоставляет параметр WNOWAIT
, который только сообщает о состоянии, но на самом деле не пожинает дочерний процесс. Теперь вы можете проверить, является ли pid одним из тех, которые вы хотите отслеживать, и если это так, снова вызвать waitpid()
без опции.
Если процессы не являются дочерними, waitpid()
нельзя использовать в генеральный. Один из вариантов - присоединить с помощью ptrace()
к этим 40 процессам, чтобы получить сигнал, если один из этих процессов завершится. Однако это может иметь нежелательные побочные эффекты.