4

我在 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.Canceltrue),则在我使用 恢复进程之前什么都不会发生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是的,那么。

4

0 回答 0