ホームページ >バックエンド開発 >Golang >Go でシグナルの発信元プロセス ID を確認するにはどうすればよいですか?

Go でシグナルの発信元プロセス ID を確認するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-06 22:25:16197ブラウズ

How Can I Determine the Originating Process ID of a Signal in Go?

Go でのシグナルの発信元の決定: 代替手段の探索

Go ではシグナルをキャプチャすることは可能ですが、シグナルをトリガーしたプロセスの PID を取得することはできません。信号はネイティブにサポートされていません。 C は、元の PID を示す構造体を渡すシグナル ハンドラーを提供しますが、Go にはこの機能がありません。

C でカスタム シグナル ハンドラーを確立しようとすると、複雑でエラーが発生しやすくなります。プロセス間通信の代替通信方法を検討してください。

代替アプローチ:

発信元の PID を決定することが重要な場合は、次のアプローチを検討してください:

  • 共有メモリ: プロセス間の通信と交換を可能にする共有メモリ セグメントを作成します。
  • メッセージ キュー: メッセージ キューを使用してプロセス間でメッセージを送受信し、信頼性の高い通信を確保します。
  • ソケット通信: ソケット接続を確立します。プロセス間で効率的な双方向通信を実現します。

例(ソケットを使用):

TCP ソケットを使用してプロセス間でプロセス ID を通信する例を次に示します:

import (
    "net"
    "os"
    "strconv"
)

func main() {
    // Create a TCP listener
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        os.Exit(1)
    }

    // Acceptor routine
    go func() {
        for {
            conn, err := ln.Accept()
            if err != nil {
                continue
            }

            // Receive PID from the client
            buf := make([]byte, 1024)
            n, err := conn.Read(buf)
            if err != nil || n == 0 {
                continue
            }

            pid, err := strconv.Atoi(string(buf[:n]))
            if err != nil {
                continue
            }

            // ... Do something with the received PID
        }
    }()

    // Query and send PID to the server
    conn, err := net.Dial("tcp", "localhost:8080")
    if err != nil {
        os.Exit(1)
    }

    // Send PID to the server
    pid := os.Getpid()
    conn.Write([]byte(strconv.Itoa(pid)))
}

このアプローチにより、プロセスは効果的かつシームレスに PID 情報を交換できます。

以上がGo でシグナルの発信元プロセス ID を確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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