首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何发送中断信号

如何发送中断信号
EN

Stack Overflow用户
提问于 2016-11-09 07:51:10
回答 3查看 26.8K关注 0票数 18

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-09 11:25:36

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

代码语言:javascript
复制
 err := p.Signal(os.Interrupt)

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

票数 18
EN

Stack Overflow用户

发布于 2017-12-23 17:52:55

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

代码语言:javascript
复制
var stopChan = make(chan os.Signal, 2)
signal.Notify(stopChan, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)

<-stopChan // wait for SIGINT

在代码中的任何地方使用下面的代码向上面的等待部分发送中断信号。

代码语言:javascript
复制
syscall.Kill(syscall.Getpid(), syscall.SIGINT)

或者,如果您在定义stopChan变量的同一个包中。从而使它变得可访问。你可以做到这一点。

代码语言:javascript
复制
stopChan <- syscall.SIGINT

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

代码语言:javascript
复制
Stopchan <- syscall.SIGINT
票数 46
EN

Stack Overflow用户

发布于 2021-10-15 09:50:54

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

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40498371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档