.net-core 应用程序:如何将 SIGTERM 发送到子进程?

Jov*_*vik 6 signals .net-core

在 Linux 上运行的 .net-core 应用程序是否可以向子进程发送 SIGTERM 信号?

我们正在考虑将我们的 .net 应用程序移植到 .net-core 并在 Linux 上运行它,以避免当前的信号实现(即CloseMainWindow()从父进程发送,并使用 pywin32 包,以及SetConsoleCtrlHandler()在子进程中)

sro*_*oll 5

受到https://github.com/mono/mono/blob/master/mcs/class/Mono.Posix/Mono.Unix.Native/Syscall.cs中的实现的启发,这里是一个实用程序类,应该可以执行您想要的操作

public static class ProcessUtils
{        
    [DllImport ("libc", SetLastError=true, EntryPoint="kill")]
    private static extern int sys_kill (int pid, int sig);
    
    public static void Kill(this Process process, Signum sig)
    {
        sys_kill(process.Id, (int) sig);
    }
}

public enum Signum : int {
    SIGHUP    =  1, // Hangup (POSIX).
    SIGINT    =  2, // Interrupt (ANSI).
    SIGQUIT   =  3, // Quit (POSIX).
    SIGILL    =  4, // Illegal instruction (ANSI).
    SIGTRAP   =  5, // Trace trap (POSIX).
    SIGABRT   =  6, // Abort (ANSI).
    SIGIOT    =  6, // IOT trap (4.2 BSD).
    SIGBUS    =  7, // BUS error (4.2 BSD).
    SIGFPE    =  8, // Floating-point exception (ANSI).
    SIGKILL   =  9, // Kill, unblockable (POSIX).
    SIGUSR1   = 10, // User-defined signal 1 (POSIX).
    SIGSEGV   = 11, // Segmentation violation (ANSI).
    SIGUSR2   = 12, // User-defined signal 2 (POSIX).
    SIGPIPE   = 13, // Broken pipe (POSIX).
    SIGALRM   = 14, // Alarm clock (POSIX).
    SIGTERM   = 15, // Termination (ANSI).
    SIGSTKFLT = 16, // Stack fault.
    SIGCLD    = SIGCHLD, // Same as SIGCHLD (System V).
    SIGCHLD   = 17, // Child status has changed (POSIX).
    SIGCONT   = 18, // Continue (POSIX).
    SIGSTOP   = 19, // Stop, unblockable (POSIX).
    SIGTSTP   = 20, // Keyboard stop (POSIX).
    SIGTTIN   = 21, // Background read from tty (POSIX).
    SIGTTOU   = 22, // Background write to tty (POSIX).
    SIGURG    = 23, // Urgent condition on socket (4.2 BSD).
    SIGXCPU   = 24, // CPU limit exceeded (4.2 BSD).
    SIGXFSZ   = 25, // File size limit exceeded (4.2 BSD).
    SIGVTALRM = 26, // Virtual alarm clock (4.2 BSD).
    SIGPROF   = 27, // Profiling alarm clock (4.2 BSD).
    SIGWINCH  = 28, // Window size change (4.3 BSD, Sun).
    SIGPOLL   = SIGIO, // Pollable event occurred (System V).
    SIGIO     = 29, // I/O now possible (4.2 BSD).
    SIGPWR    = 30, // Power failure restart (System V).
    SIGSYS    = 31, // Bad system call.
    SIGUNUSED = 31
}
Run Code Online (Sandbox Code Playgroud)