首頁 > 後端開發 > Golang > 在 Go 中如何決定訊號的原始進程 ID?

在 Go 中如何決定訊號的原始進程 ID?

Patricia Arquette
發布: 2024-12-06 22:25:16
原創
188 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板