如何发送中断信号
How to send an interrupt signal
我正在尝试实现一个在 Go 中调用中断信号的函数。我知道如何使用 signal.Notify(interruptChannel, os.Interrupt)
拦截来自控制台的中断信号,但是,我找不到实际发送中断信号的方法。我发现你can send a signal to a process,但我不确定这是否可以用来发送顶级中断信号。
有没有办法从 Go 函数中发送一个中断信号,该信号可以被任何正在侦听系统中断信号的东西捕获,或者是 Go 不支持的东西?
获取使用FindProcess, StartProcess or some other means. Call Signal发送中断的进程:
err := p.Signal(os.Interrupt)
这会将信号发送到目标进程(假设调用进程有权这样做)并调用目标进程可能具有的任何信号处理程序以获取 SIGINT。
假设您正在使用类似这样的东西来捕获中断信号
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
对于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
}
我正在尝试实现一个在 Go 中调用中断信号的函数。我知道如何使用 signal.Notify(interruptChannel, os.Interrupt)
拦截来自控制台的中断信号,但是,我找不到实际发送中断信号的方法。我发现你can send a signal to a process,但我不确定这是否可以用来发送顶级中断信号。
有没有办法从 Go 函数中发送一个中断信号,该信号可以被任何正在侦听系统中断信号的东西捕获,或者是 Go 不支持的东西?
获取使用FindProcess, StartProcess or some other means. Call Signal发送中断的进程:
err := p.Signal(os.Interrupt)
这会将信号发送到目标进程(假设调用进程有权这样做)并调用目标进程可能具有的任何信号处理程序以获取 SIGINT。
假设您正在使用类似这样的东西来捕获中断信号
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
对于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
}