登录
首页 >  Golang >  Go问答

防止 Ctrl+C 中断 Golang 中的 exec.Command

来源:Golang技术栈

时间:2023-04-10 13:02:16 154浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《防止 Ctrl+C 中断 Golang 中的 exec.Command》,介绍一下golang,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我注意到exec.Command即使中断调用已通过signal.Notify. 我已经完成了以下示例来说明问题:

package main

import (
    "log"
    "os"
    "os/exec"
    "os/signal"
    "syscall"
)

func sleep() {
    log.Println("Sleep start")
    cmd := exec.Command("sleep", "60")
    cmd.Run()
    log.Println("Sleep stop")
}

func main() {
    var doneChannel = make(chan bool)

    go sleep()

    c := make(chan os.Signal, 1)
    signal.Notify(c, os.Interrupt)
    signal.Notify(c, syscall.SIGTERM)
    go func() {
        

如果在该程序运行时按下 Ctrl+C,它将打印:

2015/10/16 10:05:50 Sleep start
^C2015/10/16 10:05:52 Receved Ctrl + C
2015/10/16 10:05:52 Sleep stop

显示sleep命令被中断。Ctrl+C 被成功捕获,主程序没有退出,只是sleep命令受到影响。

知道如何防止这种情况发生吗?

正确答案

当您按下 时,shell 将向整个进程组发出信号ctrl+c。如果您直接向父进程发出信号,则子进程将不会收到信号。

为了防止 shell 向子进程发出信号,您需要在启动进程之前在其自己的进程组中使用SetpgidandPgid字段启动命令syscall.SysProcAttr

cmd := exec.Command("sleep", "60")
cmd.SysProcAttr = &syscall.SysProcAttr{
    Setpgid: true,
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表