Как работать с SIGTERM из разных ОС (Linux / Windows) - PullRequest
0 голосов
/ 19 июня 2020

Я создал ConsoleEventHandler на основе следующей описанной ссылки: https://www.meziantou.net/detecting-console-closing-in-dotnet.htm

У меня он отлично работает. В настоящее время я использую sh, он может обрабатывать SIGTERM как от Windows, так и Linux. Кто-нибудь знает, как его оптимизировать в C#? Следующий код необходимо оптимизировать в двух частях:

  1. может загружать Kernel32 в docker. В настоящее время он не работает в «System.DllNotFoundException: невозможно загрузить общую библиотеку Kernel32 или одну из ее зависимостей».
  2. Поддержка linux система;

Исходный код:

class Program
{
    // https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms686016.aspx
    [DllImport("Kernel32")]
    private static extern bool SetConsoleCtrlHandler(SetConsoleCtrlEventHandler handler, bool add);

    // https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms683242.aspx
    private delegate bool SetConsoleCtrlEventHandler(CtrlType sig);

    private enum CtrlType
    {
        CTRL_C_EVENT = 0,
        CTRL_BREAK_EVENT = 1,
        CTRL_CLOSE_EVENT = 2,
        CTRL_LOGOFF_EVENT = 5,
        CTRL_SHUTDOWN_EVENT = 6
    }

    static void Main(string[] args)
    {
        // Register the handler
        SetConsoleCtrlHandler(Handler, true);

        // Wait for the event
        while (true)
        {
            Thread.Sleep(50);
        }
    }

    private static bool Handler(CtrlType signal)
    {
        switch (signal)
        {
            case CtrlType.CTRL_BREAK_EVENT:
            case CtrlType.CTRL_C_EVENT:
            case CtrlType.CTRL_LOGOFF_EVENT:
            case CtrlType.CTRL_SHUTDOWN_EVENT:
            case CtrlType.CTRL_CLOSE_EVENT:
                Console.WriteLine("Closing");
                // TODO Cleanup resources
                Environment.Exit(0);
                return false;

            default:
                return false;
        }
    }
}
...