为了账号安全,请及时绑定邮箱和手机立即绑定

如何发送中断信号

如何发送中断信号

Go
蝴蝶不菲 2022-04-20 17:27:28
我正在尝试实现一个在 Go 中调用中断信号的函数。我知道如何通过使用拦截来自控制台的中断信号signal.Notify(interruptChannel, os.Interrupt),但是,我找不到实际发送中断信号的方法。我发现您可以向进程发送信号,但我不确定这是否可以用于发送顶级中断信号。有没有办法从 Go 函数中发送中断信号,该信号可以被任何监听系统中断信号的东西捕获,或者 Go 不支持的东西?
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

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


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


查看完整回答
反对 回复 2022-04-20
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

使用FindProcessStartProcess或其他方式获取进程。调用Signal发送中断:

 err := p.Signal(os.Interrupt)

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


查看完整回答
反对 回复 2022-04-20
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

对于 windows 情况,您可以使用以下方法:


func SendInterrupt() error {

    d, e := syscall.LoadDLL("kernel32.dll")

    if e != nil {

        return fmt.Errorf("LoadDLL: %v", e)

    }

    p, e := d.FindProc("GenerateConsoleCtrlEvent")

    if e != nil {

        return fmt.Errorf("FindProc: %v", e)

    }

    r, _, e := p.Call(syscall.CTRL_BREAK_EVENT, uintptr(syscall.Getpid()))

    if r == 0 {

        return fmt.Errorf("GenerateConsoleCtrlEvent: %v", e)

    }

    return nil

}


查看完整回答
反对 回复 2022-04-20
  • 3 回答
  • 0 关注
  • 229 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信