ホームページ バックエンド開発 Golang Go 言語によるプロセス制御とシグナル処理

Go 言語によるプロセス制御とシグナル処理

Jun 02, 2023 am 08:21 AM
言語を移動 プロセス制御 信号処理

Go 言語はオープンソースのプログラミング言語であり、そのシンプルさ、使いやすさ、効率性、セキュリティの高さから、プログラマーの間で人気が高まっています。 Go 言語ではプロセス制御と信号処理も非常に重要な部分ですが、この記事では Go 言語におけるプロセス制御と信号処理について詳しく説明します。

Go言語でのプロセス呼び出し

Go言語でのプロセス制御は、複数のプロセス間の呼び出しと制御を実現できます。 Go 言語は、プロセスを開始および呼び出しできる os ライブラリと exec ライブラリを提供します。 OS ライブラリのコマンド ラインを呼び出すことで、新しいプロセスを作成し、その出力を現在のプロセスの標準出力ストリームにバインドしたり、現在のプロセスの標準入力ストリームを新しく作成したプロセスにインポートしたりすることができます。

Go 言語では、os.StartProcess() 関数は主に新しいプロセスを作成するために使用されます。この関数のプロトタイプは次のとおりです。

func StartProcess(name string, args []string, attr os.ProcAttr) (os.Process, error)

ここで、name パラメータは、新しいプロセスの実行可能ファイルのパスを表します。args パラメータは、新しいプロセスに渡されるコマンド ライン パラメータです。attr パラメータは、環境変数などの新しいプロセスの属性を指定するために使用できます。そして作業ディレクトリ。

プロセスを開始するサンプル コードは次のとおりです。

package main

import (
    "fmt"
    "os"
)

func main() {
    cmd := exec.Command("ls", "-l")
    output, err := cmd.Output()
    if err != nil {
        panic(err)
    }
    fmt.Println(string(output))
}
ログイン後にコピー

この例では、Command() 関数を呼び出して ls コマンドを開始し、その出力を現在のプロセス ストリームを読み込み、最後に Output() 関数を呼び出して出力結果を読み取り、画面に出力します。

シグナル処理

シグナルは、オペレーティング システムがプロセスに特定のシグナルを送信できるようにするプロセス間通信メカニズムであり、プロセスはこのシグナルに基づいて対応する処理を実行できます。 Go 言語では、OS ライブラリの Signal 関数と Signal.Notify 関数を使用してシグナルを登録および処理できます。

Signal 関数は、指定された信号の信号オブジェクトを返すために使用されます。そのプロトタイプは次のとおりです:

func Signal(sig syscall.Signal) Signal

その内、 sig パラメータは、番号に対応するシステム呼び出し信号を指定します。たとえば、SIGINT は割り込み信号を表します。返された Signal オブジェクトは、たとえば、Wait メソッドを使用してシグナルの到着を待つために使用できます。

Notify 関数は、プロセスのシグナル処理関数を登録するために使用され、指定されたシグナルが到着すると、対応する関数が呼び出されて処理されます。関数のプロトタイプは次のとおりです。

func Notify(c chan<- os.Signal, sig ...os.Signal)

このうち、c パラメータは受信に使用されるチャネルです。受信信号、および sig パラメーター 登録する必要がある信号オブジェクトを指定します。サンプル コードは次のとおりです。

package main

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main() {
    c := make(chan os.Signal, 1)
    signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
    go func() {
        s := <-c
        fmt.Println("received signal:", s)
        os.Exit(1)
    }()

    fmt.Println("Start working...")
    for {
        fmt.Println("working...")
        time.Sleep(time.Second * 1)
    }
}
ログイン後にコピー

上記のサンプル プログラムでは、Notify 関数を呼び出して、SIGINT 信号と SIGTERM 信号を信号パイプラインに追加します。待機信号を受信すると、プログラムは直ちに終了します。信号処理により、プログラムの実行と終了を非常に柔軟に制御できます。

まとめ

この記事では、Go 言語でのプロセス制御と信号処理について紹介します Go 言語では、os ライブラリと exec ライブラリを呼び出すことでプロセスの起動と制御を実現します。シグナル処理メカニズムを使用して、プロセス間の通信と制御を実装することもできます。プロセス制御と信号処理をマスターすると、プログラムの実行と終了をより柔軟に制御できるようになります。

以上がGo 言語によるプロセス制御とシグナル処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

SQL.Openを使用するとき、DSNが空に渡されたときにエラーを報告しないのはなぜですか? SQL.Openを使用するとき、DSNが空に渡されたときにエラーを報告しないのはなぜですか? Apr 02, 2025 pm 12:54 PM

SQL.Openを使用する場合、DSNがエラーを報告しないのはなぜですか? GO言語では、sql.open ...

See all articles