ホームページ >バックエンド開発 >Golang >Ctrl C による Go の exec.Command の中断を防ぐにはどうすればよいですか?

Ctrl C による Go の exec.Command の中断を防ぐにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-11 02:26:11252ブラウズ

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

Golang で Ctrl C による exec.Command の中断を防ぐ

exec.Command を使用してプロセスを開始すると、Ctrl C による中断が発生することがあります。割り込み呼び出しが signal.Notify 経由でインターセプトされた場合でも。この問題は、シェルが 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

スリープ コマンドは引き続き正常に実行され、Ctrl C による中断が防止されていることを示しています。

以上がCtrl C による Go の exec.Command の中断を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。