【发布时间】:2018-07-17 03:14:28
【问题描述】:
我正在尝试制作一个使用信号中断无限计数器循环的程序。我已经设法用 SIGINT (ctrl + C) 中断了程序,但我无法以其他方式中断它。我想知道是否可以通过其他方式中断循环,例如在终端中运行时按 Q 键。
我制作了两个 Go 文件,第一个包含实际的无限循环:
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:")
}
【问题讨论】:
-
您想要实现的只是1)在终端中捕获击键 2)当捕获到指定的击键时,退出程序 3)整个过程不会阻塞程序,因此它可以运行其他代码(如无限循环)。第三部分实际上是用 goroutine 完成的,所以只剩下两个了。而且我相信在 Google 上搜索它们都会产生有用的结果。
-
@leafbebop 说 OP 想要用户输入,这将是显而易见的解决方案。
-
@Remario 你会说 OP 想要什么?
-
据我所知,“按 Q 键”并没有发送信号,也没有发送任何其他信息。
-
我知道我在这里可能用词不当。除了 Ctrl + C 之外,我想要做的是创建一个中断信号,它可以用于同一件事(中断正在运行的无限循环进程)。那可能吗?如果是这样,我会怎么做?感谢您的快速回复!
标签: loops for-loop go signals sigint