Go で Ctrl C が `exec.Command` プロセスを中断しないようにするにはどうすればよいですか?
Dec 12, 2024 pm 07:46 PMexec.Command プロセスの Ctrl C 割り込みの防止
signal.Notify を介して割り込み呼び出しをインターセプトしても、exec.Command で開始されたプロセスは影響を受けやすいままですCtrl C による中断まで。次を考慮してください。デモンストレーション:
package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func main() { var doneChannel = make(chan bool) go func() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.Run() log.Println("Sleep stop") }() c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) signal.Notify(c, syscall.SIGTERM) go func() { <-c log.Println("Receved Ctrl + C") }() <-doneChannel }
プログラムの実行中に Ctrl C を押すと、メイン プログラムが終了していないにもかかわらず、「スリープ」コマンドが中断されたことを示す出力が生成されます。
解決策:プロセス グループ
Ctrl C を押したときにシェルがプロセス グループ全体に通知することで中断が発生します。が押されます。子プロセスをこのシグナルから分離するには、コマンドを独自のプロセス グループで開始する必要があります。これは、プロセスを開始する前に SysProcAttr.Setpgid フィールドと SysProcAttr.Pgid フィールドを設定することで実現できます:
cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, }
これらの手順に従うことで、メイン プログラムは exec.Command で開始されたプロセスを中断することなく Ctrl C 信号をインターセプトできます。安定したプロセス実行を保証します。
以上がGo で Ctrl C が `exec.Command` プロセスを中断しないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

GOの実際のパフォーマンスを正確に反映するベンチマークを作成するにはどうすればよいですか?
