Я пишу Perl-скрипт, который запускает 4 одновременных идентичных процесса с разными входными параметрами (см. Справочную информацию здесь - остальная часть моего вопроса станет намного более понятной после прочтения этого).
Я выполняю системный вызов () для программы, которая генерирует данные (XFOIL, снова см. Ссылку выше). Моя одноядерная версия этой программы выглядит так:
eval{
local $SIG{ALRM} = sub{die "TIMEOUT"};
alarm 250;
system("xfoil <command_list >xfoil_output");
alarm 0;
};
if ($@){
# read the output log and run timeout stuff...
system('killall xfoil') # Kill the hung XFOIL. now it's a zombie.
}
По сути, запуск XFOIL должен занимать всего около 100 секунд - поэтому через 250 секунд программа зависает (предположительно, ожидая пользовательского ввода, которого она никогда не получит).
Проблема теперь в том, что если я сделаю killall в многоядерной версии моей программы, я собираюсь убить 3 других экземпляра XFOIL, и эти процессы генерируют данные. Поэтому мне нужно убить только зависший экземпляр, а для этого нужно получить PID.
Я не очень разбираюсь в вилках и тому подобном. Из того, что я могу сказать до сих пор, я запускаю exec ('xfoil') внутри дочернего процесса, который я разветвляю. Но PID exec () будет отличаться от PID дочернего процесса (или это? Это отдельный процесс, поэтому я бы предположил, что это так, но опять же у меня нет опыта с этим ..), так что это все еще не помогает, когда я хочу принудительно убить процесс, так как у меня все равно не будет PID. Как мне это сделать?
Спасибо огромное за вашу помощь!