Как я могу аккуратно убить процесс в ActiveState Perl?

Мне нужно использовать определенный код выхода?

Win32::Process::Create(
    $ProcessObj,
    "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe",
    "firefox -no-remote -P $prof_name",
    0,
    NORMAL_PRIORITY_CLASS,
".")|| die ErrorReport();
$ProcessObj->kill(0);

Таким образом он убивает, но не осторожно, он создает проблемы с профилем Firefox.


person Paulo Cesar    schedule 10.06.2016    source источник
comment
Если это оконное приложение (в отличие от консольного приложения), вы можете отправить сообщение о выходе в его очередь сообщений.   -  person ikegami    schedule 11.06.2016


Ответы (2)


Коротко. Обычные методы, кроме taskkill Window, являются принудительными. Благодаря mob и melpomene < / а>.


В документации Win32::Process не говорится, какие методы Kill или KillProcess делают, но они кажутся довольно прямолинейными. Windows действительно предоставляет градацию того, как завершить процесс, см., Например, этот пост на изящном завершении через winapi, даже если он не имеет сигналов UNIX. Однако это, по-видимому, не используется ни модулем, ни kill (см. Конец).

Собственный taskkill Windows должен попросить завершить процесс. Запросите у него флаги, запустив taskkill /? в консоли вашей системы. Вот документация для taskkill on MS technet. Например, это завершает процесс его $pid вместе с его дочерними элементами.

my $pid = $ProcessObj->GetProcessID();
system("taskkill /t /pid $pid");

Если метод GetProcessID() не возвращает реальный идентификатор, см. Другие способы по ссылке ниже.

Я не могу сейчас протестировать Windows. Более подробная информация содержится во второй части this post.


Perl kill явно эффективен в Windows. Из perlport

... kill($sig, $pid) завершает процесс, идентифицированный $pid, и заставляет его немедленно выйти со статусом выхода $sig.

Спасибо melpomene за комментарий и ссылку на документацию.

Я полагаю, что exitcode только сообщает процессу, о чем сообщать системе при выходе.

person zdim    schedule 10.06.2016
comment
Флаг taskkill /F означает и не будь нежным - person mob; 11.06.2016
comment
@mob Ах, спасибо! Исправлено. Я должен был знать - F вполне может означать «сила». - person zdim; 11.06.2016
comment
В Windows нет сигналов. В Windows kill $n, $pid принудительно завершает процесс $pid со статусом $n. - person melpomene; 11.06.2016
comment
@melpomene заставляет это? Разве он не отправляет ему сигнал завершения (эквивалент Windows) или, возможно, просит ОС сделать это, позволяя процессу очиститься? Если $n заставляет его выйти с этим статусом, тогда отправка terminate должна позволить ему действительно выйти таким образом? (Не могу найти обсуждения этого в документации прямо сейчас.) Я давно не касался winapi, но думаю, что есть разные способы завершить процесс. Я ожидал, что kill выполнит это? Спасибо за комментарий. Я вижу, что это ссылка только сейчас, читаю - person zdim; 11.06.2016

Насколько я знаю, в Perl вы можете просто сделать

kill -15 (pid)

Кто аккуратно убивает процесс на perl

person Cth103    schedule 13.06.2016