gpt4 book ai didi

go - 如何向子进程发送信号?

转载 作者:IT王子 更新时间:2023-10-29 02:35:50 25 4
gpt4 key购买 nike

我在从父进程发送信号并在子进程中接收时遇到问题。

这是子进程的代码。它在收到 SIGINT 时退出。

// child.go
func main() {
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt)
fmt.Println("started")

<-stop
fmt.Println("stopped")
}

这是父进程。它启动 child.go,发送 SIGINT,然后等待它退出。

// main.go
func main() {
// Start child process
cmd := exec.Command("go", "run", "child.go")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Start()
if err != nil {
_, _ = fmt.Fprintf(os.Stderr, "Start: " + err.Error())
return
}

// Wait, then send signal
time.Sleep(time.Millisecond * 500)
err = cmd.Process.Signal(os.Interrupt)
if err != nil {
_, _ = fmt.Fprintf(os.Stderr, "Signal: " + err.Error())
return
}

// Wait for child process to finish
err = cmd.Wait()
if err != nil {
_, _ = fmt.Fprintf(os.Stderr, "Wait: " + err.Error())
}
return
}

这段代码应该打印 started\nstopped 以表明它按预期工作,但它只打印 started 并卡在 cmd.Wait(),表示子进程没有收到信号。

当我运行 go run child.go 时,它工作正常,所以我认为问题不在于该文件。我知道 func (*Process) Signal 在 Windows 上不起作用;我正在使用 Linux。

如何修改代码以便子进程获得父进程发送的信号?

最佳答案

正如@JimB 在评论部分提到的,go run 是你的问题。

go run child.go 将编译 child 并将其作为自己的进程执行。如果在 go run child.go 之后运行 ps,您将看到两个进程在运行。

您正在观察和发出信号的进程是 go 可执行文件,而不是 child

exec.Command("go", "run", "child.go") 替换为编译后的二进制 exec.Command("child") 和它应该工作。

关于go - 如何向子进程发送信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54013010/

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