用信号中断golang中的无限环路



我正在尝试制作一个程序,该程序使用信号中断无限计数器循环。我已经设法用Sigint(CTRL C(中断了该程序,但否则我无法中断。我想知道我是否可以制作其他方式来中断循环,例如,在Q键在终端运行时按照Q键。

我制作了两个档案,第一个包含实际的无限循环:

package infinite
import "fmt"
import "time"
func Infinite01 (msg string) {
for i := 0; ; i++ {
    fmt.Println(msg, i)
    time.Sleep(time.Second)
    }
}

然后文件以捕获Sigint信号并中断循环:

package main
import (
"./infinite"
"os/signal"
"os"
"fmt"
)
func main() {
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, os.Interrupt)
go func() {
    <-sigs
    fmt.Printf("You pressed ctrl + C. User interrupted infinite loop.")
    os.Exit(0)
}()
Loop()
}
func Loop() {
infinite.Infinite01("Look, I can count forever:")
}

然后我会坚持我的第一个评论。我会再解释一点。

您不需要信号即可终止程序 - 您可以控制它。随时致电os.Exit将退出程序,从main()返回具有相同的效果。

问题是,何时触发这些"退出"。或者,在您的示例中,按下key Q时如何触发出口。

要解决问题,您需要将其分为部分。正如我在评论中所说的那样,第1部分正在捕获钥匙中风。它不像fmt.Scan那样简单,因为它需要用户按ENTER之后按Enter。它需要一些特定的OS代码才能这样做,但是希望Lib可以为您节省所有麻烦,例如Termbox-go。

第2部分与第1部分密切相关,即指定事件,密钥冲程。在您的示例中,知道按键是Q,然后致电os.Exit。通常,LIB可以很容易地处理这么容易,有时很难注意到有一部分。但是,如果您想要一些更复杂的密钥stokes,例如ctrl-alt-backspace,甚至a-s-d-f(同时(,这将需要一些代码。

第三部分是关于不阻止程序。在旅途中,可以通过使用单独的goroutine检查事件循环或使用良好的回调方式来轻松实现。取决于您选择的库。

有关信号和ctrl-c情况的更多信息。在大多数情况下,ctrl-c势必会向程序发送SIGINT是很普遍的做法。如果未修改,Sigint将终止程序。但是,程序可以像您的Orignal代码一样修改处理Sigint的行为(为打印添加消息(。按下其他键时,OS不太可能将其绑定到另一个信号,因此您无法处理。

Corse的

另一个解决方案是将键堆肥(多个密钥冲程(绑定到向程序发送SIGINT,但是只要程序是接收钥匙中风本身的程序,那就是一个通用的。

注意:由于可以选择LIB的选择,因此代码有很大不同,因此我认为我不能(或应该(提供一个示例。

最新更新