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$

「停止」メッセージを表示するには、Enter キーをもう一度押す必要がありましたが、すぐに表示されます。ご覧のとおり、Console.WriteLine通話に到達することはありません。

SIGINTを使用して送信しようとすると(ハンドラーが に設定されてkillいないため、プロセスを終了する必要があります)、 を使用してプロセスを再開するまで何も起こりません。e.Canceltruefg

フォアグラウンドでプロセスを開始し、それを中断してctrl-z使用するbgと、再びすぐに停止しますが、今度は送信SIGINTしてから再開するとfg、ハンドラーが呼び出されます。

イベント ハンドラーの割り当てを削除するConsole.CancelKeyPressと、プロセスはバックグラウンドで正常に実行されます。

Mono 2.10.8 と Debian 6.0.2 を使用しています。

他のすべてが失敗した場合は、 を使用して必要な機能を複製できますがMono.Unix.UnixSignal、誰かがこれに対する解決策を持っている場合は、ぜひ聞きたいです。

更新:Console.CancelKeyPress私の目的には別の問題があるようです。nohup入力がコンソールではなく /dev/nullになるようにプロセスを実行します。この状況では、CancelKeyPressを使用して SIGINT を送信しても、Mono はイベントをトリガーしませんkillUnixSignalでは、そうです。

4

0 に答える 0