如何发送中断信号

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

有没有办法从 Go 函数中发送中断信号,该信号可以被任何监听系统中断信号的东西捕获,或者 Go 不支持的东西?


蝴蝶不菲
浏览 230回答 3
3回答

明月笑刀无情

假设您正在使用这样的东西来捕获中断信号var stopChan = make(chan os.Signal, 2)signal.Notify(stopChan, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)<-stopChan // wait for SIGINT在代码中的任何位置使用以下命令将中断信号发送到上述等待部分。syscall.Kill(syscall.Getpid(), syscall.SIGINT)或者,如果您在定义 stopChan 变量的同一包中。从而使其可访问。你可以这样做。stopChan <- syscall.SIGINT或者您可以将 stopChan 定义为一个全局变量(使大写字母中的第一个字母会实现相同),然后您也可以从不同的包发送中断信号。Stopchan <- syscall.SIGINT

慕运维8079593

使用FindProcess、StartProcess或其他方式获取进程。调用Signal发送中断:&nbsp;err&nbsp;:=&nbsp;p.Signal(os.Interrupt)这会将信号发送到目标进程(假设调用进程有权这样做)并调用目标进程可能对 SIGINT 具有的任何信号处理程序。

喵喵时光机

对于 windows 情况,您可以使用以下方法:func SendInterrupt() error {&nbsp; &nbsp; d, e := syscall.LoadDLL("kernel32.dll")&nbsp; &nbsp; if e != nil {&nbsp; &nbsp; &nbsp; &nbsp; return fmt.Errorf("LoadDLL: %v", e)&nbsp; &nbsp; }&nbsp; &nbsp; p, e := d.FindProc("GenerateConsoleCtrlEvent")&nbsp; &nbsp; if e != nil {&nbsp; &nbsp; &nbsp; &nbsp; return fmt.Errorf("FindProc: %v", e)&nbsp; &nbsp; }&nbsp; &nbsp; r, _, e := p.Call(syscall.CTRL_BREAK_EVENT, uintptr(syscall.Getpid()))&nbsp; &nbsp; if r == 0 {&nbsp; &nbsp; &nbsp; &nbsp; return fmt.Errorf("GenerateConsoleCtrlEvent: %v", e)&nbsp; &nbsp; }&nbsp; &nbsp; return nil}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go