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.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になるようにプロセスを実行します。この状況では、CancelKeyPress
を使用して SIGINT を送信しても、Mono はイベントをトリガーしませんkill
。UnixSignal
では、そうです。