如何在golang中发送中断信号?

The*_*chu 7 signals interrupt go interrupt-handling

我目前正在尝试实现一个可以在Google Go中调用中断信号的函数.我知道如何拦截来自控制台的中断信号signal.Notify(interruptChannel, os.Interrupt),但是,我找不到实际发送中断信号的方法.我发现你可以向一个进程发送一个信号,但我不确定这是否可用于发送一个顶级中断信号.

有没有办法从golang函数中发送一个中断信号,该函数可以被正在侦听系统中断信号的任何东西捕获,或者是golang不支持的东西?

Deb*_*tra 24

假设你正在使用这样的东西来捕获中断信号

var stopChan = make(chan os.Signal, 2)
signal.Notify(stopChan, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)

<-stopChan // wait for SIGINT
Run Code Online (Sandbox Code Playgroud)

在代码中的任何位置使用以下命令将中断信号发送到上面的等待部分.

syscall.Kill(syscall.Getpid(), syscall.SIGINT)
Run Code Online (Sandbox Code Playgroud)

或者,如果您位于定义了stopChan变量的同一个包中.从而使它可以访问.你可以这样做.

stopChan <- syscall.SIGINT
Run Code Online (Sandbox Code Playgroud)

或者你可以将stopChan定义为全局变量(使大写字母中的第一个字母实现相同),然后你也可以从不同的包中发送中断信号.

Stopchan <- syscall.SIGINT
Run Code Online (Sandbox Code Playgroud)

  • 为什么缓冲区是2? (2认同)
  • 请注意 syscall.Kill() 在 Windows 上不可用。 (2认同)

Cer*_*món 13

使用FindProcess,StartProcess或其他方法获取进程.呼叫信号发送中断:

 err := p.Signal(os.Interrupt)
Run Code Online (Sandbox Code Playgroud)

这将把信号发送到目标进程(假设调用进程有权这样做)并调用目标进程可能对SIGINT有的任何信号处理程序.