gpt4 book ai didi

bash - 使用带有 Go 的 Git Bash/MINGW64 在 Windows 上捕获 CTRL-C

转载 作者:IT老高 更新时间:2023-10-28 13:08:31 26 4
gpt4 key购买 nike

当用户按下 CTRL-C 时,我想在退出之前运行特定代码。代码在 Go 中,我想使用 Git Bash/MINGW64 在 Windows 上运行它。使用 Go,我愿意

interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
// some goroutines get started here
// ...
for {
select {
case <-interrupt:
// code which shall be run on CTRL-C
}
}

在 Windows 上,这在我使用 Windows 命令行时有效,但我希望它也能在 MINGW64/Git Bash 上工作。

我在 https://stackoverflow.com/a/31974985/1370397 上找到的那个添加

trap '' SIGINT

to ~/.bashrc 捕获 SIGINT 信号并防止 bash 终止我的程序。

这适用于我在带有 bash 版本的 MINGW32 上

$ bash --version
GNU bash, version 3.1.20(4)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.

但它无法在 MINGW64,bash 版本上运行

$ bash --version
GNU bash, version 4.3.42(5)-release (x86_64-pc-msys)
Copyright (C) 2013 Free Software Foundation, Inc.
[...]

MINGW64 或新 (git) bash 版本有什么不同?

为了更容易测试,下面是一个查看行为差异的最小示例:

package main

import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)

func cleanup(){
for i:=0; i<3; i++ {
fmt.Println("Cleaning up...")
time.Sleep(500*time.Millisecond)
}
}

func work() {
for {
fmt.Println("Working...")
time.Sleep(300*time.Millisecond)
}
}

func main() {
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)

go work()

for {
select {
case <-interrupt:
fmt.Println("Interrupt received - calling cleanup()...")
cleanup()
fmt.Println("Quitting...")
return
}
fmt.Println("Waiting...")
}
}

来自 MINGW32 的输出(在 ~/.bashrc 中带有陷阱 '' SIGINT):

$ ./sigint.exe
Working...
Working...
Working...
Interrupt received - calling cleanup()...
Cleaning up...
Working...
Working...
Cleaning up...
Working...
Cleaning up...
Working...
Working...
Quitting...

cleanup() 代码被执行。

来自 MINGW64 的输出(在 ~/.bashrc 中也带有陷阱 '' SIGINT):

$ ./sigint.exe
Working...
Working...
Working...
Working...

cleanup() 没有被执行。 :-(

最佳答案

使用 winpty 在 Git Bash for Windows 中正确捕获信号。它与安装捆绑在一起,因此您需要做的就是:

$ winpty ./my-program.exe

关于bash - 使用带有 Go 的 Git Bash/MINGW64 在 Windows 上捕获 CTRL-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38824561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com