web-dev-qa-db-ja.com

golangで割り込み信号を送信する方法は?

現在、Google Goで割り込み信号を呼び出す関数を実装しようとしています。 signal.Notify(interruptChannel, os.Interrupt)を使用して、コンソールから割り込み信号をインターセプトする方法を知っていますが、実際に割り込み信号を送信する方法を見つけることができません。 プロセスに信号を送信できる であることがわかりましたが、これを使用してトップレベルの割り込み信号を送信できるかどうかはわかりません。

システム割り込み信号をリッスンしているものによってキャプチャできるgolang関数内から割り込み信号を送信する方法はありますか、それともgolangでサポートされていないものですか?

9
ThePiachu

FindProcessStartProcess またはその他の手段を使用してプロセスを取得します。 Signal を呼び出して割り込みを送信します。

 err := p.Signal(os.Interrupt)

これにより、シグナルがターゲットプロセスに送信され(呼び出しプロセスがそうする許可を持っていると想定)、ターゲットプロセスがSIGINTに対して持つ可能性のあるシグナルハンドラーが呼び出されます。

13
Cerise Limón

割り込み信号をキャプチャするためにこのようなものを使用していると仮定します

var stopChan = make(chan os.Signal, 2)
signal.Notify(stopChan, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)

<-stopChan // wait for SIGINT

コードのどこからでも以下を使用して、割り込み信号を上の待機部分に送信します。

syscall.Kill(syscall.Getpid(), syscall.SIGINT)

または、stopChan変数が定義されている同じパッケージ内にいる場合。したがって、アクセス可能にします。あなたはこれを行うことができます。

stopChan <- syscall.SIGINT

または、stopChanをグローバル変数として定義し(大文字の最初の文字を作成しても同じ結果になります)、別のパッケージから割り込み信号を送信することもできます。

Stopchan <- syscall.SIGINT
24
Debasish Mitra