Жатва зомби-процессов через обработчик

Код, написанный ниже, предназначен для обработки полученных сигналов и пожинает зомби родительским процессом "из курса системного программирования CMU".

Q1. каково правило -1 "первый аргумент функции waitpid"? не должны ли мы передать пид зомби, которого мы пожинаем вместо этого?

Q2. Для цикла здесь, он проверяет всех зомби каждый раз, когда сигнал, полученный любым прецедентом зомби?

int ccount = 0;
void child_handler2(int sig)
{
int child_status;
pid_t pid;
while ((pid = waitpid(-1, &child_status, WNOHANG)) > 0) {
   ccount--;
   safe_printf("Received signal %d from process %d\n",sig, pid);
 }
}

void fork14()
have sent this signal
{
pid_t pid[N];
int i, child_status;
linux> ./forks 14
ccount = N;
signal(SIGCHLD, child_handler);
for (i = 0; i < N; i++)
   if ((pid[i] = fork()) == 0) {
      sleep(1); /* deschedule child */
      exit(0); /* Child: Exit */
   }

while (ccount > 0)
pause(); /* Suspend until signal occurs */
}

1 ответ

Решение

Q1. "-1" означает проверку всех дочерних процессов.

Q2. когда дочерний процесс умирает, ядро ​​отправляет сообщение своему родителю, чтобы пожинать его. И поскольку характер приема сигналов, которые не могут быть поставлены в очередь "не более одного, может быть получен за один раз", это может привести к отбрасыванию некоторых более поздних сигналов, если они получены до того, как обработчик завершит обработку предыдущего сигнала, а может и нет. Таким образом, мы не можем быть уверены, что у нас будет N зомби, так как некоторые из них могут быть обработаны обработчиком автоматически. Вот почему каждый раз, когда мы пожинаем зомби, мы проверяем , есть ли еще один зомби, чтобы пожать и пожать его или (их). Таким образом, проверка здесь состоит в том, чтобы предотвратить ожидание ребенка, который уже был пожинен, чтобы спасти родителя от замерзания, "если мы позволим ему ждать, когда пожнет зомби".

Другие вопросы по тегам