【问题标题】:How do I send a signal to Perl on Windows?如何在 Windows 上向 Perl 发送信号?
【发布时间】:2010-09-11 01:17:51
【问题描述】:

我有一些建立信号处理程序的 perl 代码:

$SIG{'KILL'} = sub {
....
};

我的任务是将它移植到 Windows,我想知道如何从 C# 类生成这个信号。

我在System.Diagnostics.Process 类中看到了Process.Kill 方法,它似乎允许我创建(通过另一种方法)并终止我的进程,但我不知道如何让它向perl 发送信号脚本。

【问题讨论】:

  • 你是说使用C#中的Process.Kill不会触发你分配给$SIG{'KILL'}的Perl代码吗?
  • 不,当然不会触发。 Process.Kill 致电 TerminateProcess。但是杀死一个进程不会导致目标进程中的用户代码在 any 操作系统上运行(当句柄自动关闭时,驱动程序代码可能仍会运行)。 kill -9 <pid>TerminateProcess 非常类似于大脑中的子弹。无法回复。

标签: c# perl signals


【解决方案1】:

您可能正在考虑TERM 信号处理程序,因为无法捕获KILL。无论如何,Windows 不使用信号,虽然它允许您使用它们,但它仅在单个线程内,不会向其他进程发送信号。

尽管您有多种其他 IPC 机制,请求另一个进程正常退出的常用机制是 PostMessage(WM_QUIT),但这实际上只适用于 Perl 脚本通常不适用的图形应用程序。

在 Windows 上得到很好支持的方法是让父进程创建一个事件(使用可继承标志)并将句柄传递给子进程,将其放入环境中对于 Perl 来说非常方便。然后孩子可以执行一个动作来响应这个事件。

除了窗口消息和内核事件之外,您还可以使用任何套接字、管道、文件、邮槽、进程退出代码、共享内存、注册表项和 DDE 在 Windows 上的进程之间进行通信。

【讨论】:

  • PostMessage(..) 变体可能针对一些 miniperl.c 变体(基于 GUI 的 perl 解释器只是为了捕捉消息?),一些嵌入式 XS 代码,或者,(猜它有点类似引擎盖下)GTK 窗口。
  • 是的 Perl 脚本可以创建窗口和接收消息,这很不寻常。 WM_QUIT 实际上并没有发送到窗口,而是发送到线程。只要线程正在运行消息循环,它实际上就不需要窗口。
  • 您认为您可以详细说明“创建活动”的含义吗?
  • 在调用者中,它是对 Windows API CreateEvent 的调用。 .NET 调用它的方式是创建一个EventWaitHandle 的实例。 perl 方式是Win32::Event 我认为您必须使用命名事件而不是继承,因为.NET 和 Perl 似乎都没有提供通过数字句柄使用事件的方法。好吧,perl 确实提到了get_Win32_IPC_HANDLE,但是生成唯一的事件名称并将其传递到环境变量而不是句柄中可能会更容易。 search.cpan.org/~cjm/Win32-IPC/lib/Win32/Event.pm
【解决方案2】:

作为操作系统,Windows 不支持信号。 Windows 上的 Perl 具有对信号的仿真

  • Ctrl-C

  • 您可以向同一 Perl 程序的其他线程发送信号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2016-08-17
    • 1970-01-01
    • 2018-11-25
    • 2020-04-08
    • 2021-03-18
    相关资源
    最近更新 更多