我在 Linux 下的 Mono 中有一个控制台应用程序,它使用 Console.CancelKeyPress 来监听SIGINT
. 但是,此应用程序拒绝在后台运行,因为它总是立即停止。
这是一个简化的示例:
using System;
using System.Threading;
static class Program
{
static void Main()
{
Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
Console.WriteLine("Sleeping");
Thread.Sleep(100000);
Console.WriteLine("Done");
}
static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
Console.WriteLine("In handler.");
}
}
如果我尝试在 bash 下在后台运行此应用程序,结果如下:
~/test$ mono test.exe &
[1] 4516
~/test$
[1]+ Stopped mono test.exe
~/test$
我不得不再次按回车键才能看到“已停止”消息,但它会立即发生。如您所见,它永远不会到达Console.WriteLine
呼叫。
如果我尝试SIGINT
使用发送kill
(应该结束进程,因为处理程序未设置e.Cancel
为true
),则在我使用 恢复进程之前什么都不会发生fg
,此时它会立即结束(它永远不会进入处理程序)。
如果我在前台启动进程,然后用 中断它ctrl-z
并使用bg
,它会再次立即停止,只有这一次如果我发送SIGINT
然后用 恢复它fg
,处理程序会被调用。
如果我删除Console.CancelKeyPress
事件处理程序分配,该过程在后台运行就好了。
我正在使用 Mono 2.10.8 和 Debian 6.0.2。
如果一切都失败了,我可以复制我需要使用的功能Mono.Unix.UnixSignal
,但如果有人对此有解决方案,我肯定想听听。
更新:Console.CancelKeyPress
对于我的目的,似乎还有另一个问题。我将使用nohup
因此输入不是控制台而是 /dev/null 来运行我的进程。在这种情况下,Mono 永远不会触发CancelKeyPress
事件,即使您使用kill
. UnixSignal
是的,那么。