Почему процессы, убитые в блоке-ловушке Сигнала, становятся зомби, а не прекращаются регулярно? - PullRequest
0 голосов
/ 12 июня 2018

Если я создал процессы с Process.new, их можно убить с помощью .kill.Однако они становятся зомби в ловушке Сигнала:

PROCESSES = {} of Int32 => Process

spawn {
  loop { sleep 1 }
}

spawn {
  x = Process.new("sleep", "100".split)
  x.kill
  sleep 0.4
  puts x.terminated?

  x = Process.new("sleep", "100".split)
  PROCESSES[x.pid] = x
}


Signal::INT.trap {
  Signal::INT.reset
  PROCESSES.each { |pid, x|
    puts "killing: #{pid}"
    x.kill
    sleep 1
    puts "killed #{pid}? #{x.terminated?}"
  }
}
sleep

Запуск этого кода с crystal run и отправка SIGINT процессу, всегда будет .terminated? возвращать true для процесса, потому что он находится всостояние зомби (<defunct>).

1 Ответ

0 голосов
/ 13 июня 2018

Процессы превращаются в зомби, когда их родитель не получает свой статус, то есть когда он не вызывает ни одну из функций семейства wait.

Для вашего примера вы должны сохранить экземпляр Processвокруг и позвоните Process#wait после отправки сигнала уничтожения.Если вы хотите сделать это одновременно для многих процессов, просто окружите каждый вызов wait spawn.

...