如何在ActiveState Perl中轻松终止进程?

4

我需要使用特定的退出代码吗?

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配置文件出现问题。

1
如果它是窗口应用程序(而不是控制台应用程序),您可以向其消息队列发送退出消息。 - ikegami
2个回答

6

简短描述: 除了Windows的taskkill之外,其他常规方法都很强制。感谢mobmelpomene


Win32::Process文档没有说KillKillProcess方法的作用,但它们似乎非常直接。 Windows确实提供了如何终止进程的分级方式,请参见例如此贴在winapi通过优雅的方式终止,尽管它没有UNIX的信号。然而,该模块或kill(请参见结尾)显然未使用此功能。

Windows自己的taskkill应该会请求进程终止。 在您的系统控制台上运行taskkill /?以查询标志。这里是MS technet上的taskkill文档。例如,这将终止其子项的进程$pid

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

如果 GetProcessID() 方法没有返回真实的 ID,请查看下面的链接以获取其他方法。
我现在无法在 Windows 上进行测试。在此帖子的第二部分中有更多相关细节。
Perl 的 kill 在 Windows 上显然是强制性的。来自perlport

…… kill($sig, $pid) 终止由 $pid 标识的进程,并使其立即退出,退出状态为 $sig

感谢melpomene提供评论和文档链接。
我认为,exitcode 只告诉进程向系统报告其退出的内容。

taskkill命令的/F标志意味着“不客气地结束进程”。 - mob
@mob 啊,谢谢!已更正。我应该知道——F 很可能代表“力量”。 - zdim
Windowsзі»з»џжІҰжњ‰дүҰеЏ·гЂ‚ењЁWindowsдёЉпәЊkill $n, $pidеәғ制иү›зЁ‹$pidд»ӨзЉ¶жЂЃ$nйЂЂе‡ғгЂ‚ - melpomene
1
@melpomene 强制 它吗?它不会发送终止信号(Windows的等效信号),或者请求操作系统这样做,允许进程进行清理吗?如果 $n 使其以该状态退出,则发送终止应该允许其以那种方式实际退出?(目前在文档中找不到任何讨论。)我已经很久没有接触winapi了,但我认为有各种方法可以终止进程。我希望 kill 能够尊重这一点?谢谢您的评论。我现在看到它只是一个链接,正在阅读。 - zdim

1
据我所知,在Perl中,您只需执行以下操作:
kill -15 (pid)

谁可以在Perl中轻松终止一个进程


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接