首頁 >後端開發 >Golang >如何防止 Ctrl C 中斷 Go 中的 exec.Command?

如何防止 Ctrl C 中斷 Go 中的 exec.Command?

DDD
DDD原創
2024-12-11 02:26:11333瀏覽

How Can I Prevent Ctrl C from Interrupting exec.Command in Go?

防止Ctrl C 中斷Golang 中的exec.Command

使用exec.Command 啟動進程時可能會遇到Ctrl C 的中斷,即使透過signal.Notify 攔截中斷呼叫。出現此問題的原因是 shell 在收到 Ctrl C 後向整個進程組發送訊號。因此,使用 exec.Command 啟動的子進程也會受到影響。

緩解此問題並防止 Ctrl C 中斷對於子進程,在開始執行之前需要先與自己的進程組建立命令。這可以透過使用 syscall.SysProcAttr 結構的 SysProcAttr、Setpgid 和 Pgid 欄位來實現。

這是一個結合了此方法的修改範例:

package main

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

func sleep() {
    log.Println("Sleep start")
    cmd := exec.Command("sleep", "60")
    cmd.SysProcAttr = &syscall.SysProcAttr{
        Setpgid: true,
    }
    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() {
        <-c
        log.Println("Received Ctrl + C")
    }()

    <-doneChannel
}

透過此修改,當程式執行時按Ctrl C,輸出如下產生:

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

sleep指令繼續成功運行,示範了透過Ctrl C防止中斷。

以上是如何防止 Ctrl C 中斷 Go 中的 exec.Command?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn