Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Windows上向Perl发送信号?_C#_Perl_Signals - Fatal编程技术网

C# 如何在Windows上向Perl发送信号?

C# 如何在Windows上向Perl发送信号?,c#,perl,signals,C#,Perl,Signals,我有一些建立信号处理程序的perl代码: $SIG{'KILL'} = sub { .... }; 我的任务是将其移植到windows,我想知道如何从C#类生成此信号 我在System.Diagnostics.Process类中看到了Process.Kill方法,它似乎允许我创建(通过另一个方法)并终止我的进程,但我不知道如何让它将信号发送到perl脚本。您可能想到了术语信号处理程序,因为KILL无法捕获。无论如何,Windows不使用信号,虽然它允许您使用它们,但它只在一个线程内,不向其他进

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

$SIG{'KILL'} = sub {
....
};
我的任务是将其移植到windows,我想知道如何从C#类生成此信号


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

您可能想到了
术语
信号处理程序,因为
KILL
无法捕获。无论如何,Windows不使用信号,虽然它允许您使用它们,但它只在一个线程内,不向其他进程发送信号

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

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


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

作为操作系统,Windows不支持信号。Windows上的Perl模拟了

  • Ctrl-C

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


您是说使用C#中的
Process.Kill
不会触发分配给
$SIG{'Kill}
的Perl代码吗?不,当然不会触发
Process.Kill
调用
TerminateProcess
。但是终止进程不会导致目标进程中的用户代码在任何操作系统上运行(当句柄自动关闭时,驱动程序代码仍可能运行)<代码>杀死-9和终止过程非常类似于大脑中的子弹。没有可能的响应。PostMessage(..)变体可能是针对一些miniperl.c变体(基于GUI的perl解释器只是为了捕捉消息?),一些嵌入的XS代码,或者(猜它有点类似的隐藏)GTK窗口。是的,perl脚本可以创建窗口和接收消息,这很不寻常
WM_QUIT
实际上不是发送到窗口,而是发送到线程。只要线程正在运行一个消息循环,它实际上就不需要窗口。您认为可以详细说明一下“创建事件”的含义吗?在调用程序中,它是对Windows API CreateEvent的调用。NET调用它的方法是创建
EventWaitHandle
的实例。perl的方式是Win32::Event,我认为您必须使用命名事件而不是继承,因为.NET和perl似乎都没有提供通过数字句柄使用事件的方式。好的,perl确实提到了
get\u Win32\u IPC\u HANDLE
,但是生成一个唯一的事件名并将其传递到环境变量而不是句柄中可能会更容易。