首頁 >後端開發 >Golang >Go 中 os.FindProcess 呼叫失敗是否一定表示進程已終止?

Go 中 os.FindProcess 呼叫失敗是否一定表示進程已終止?

Barbara Streisand
Barbara Streisand原創
2024-11-08 07:25:02347瀏覽

Does a Failed os.FindProcess Call in Go Necessarily Mean a Process Has Terminated?

在 Go 中確定進程是否存在

在 Go 中,os.FindProcess 函數可用於透過 PID 檢索進程。但是,如果此函數傳回錯誤,是否一定表示進程已終止?

檢查進程是否存在

根據kill(2的手冊頁)在Unix 中,向進程發送0 信號實際上並沒有發送信號,而是檢查進程是否處於活動狀態。這種方法可以在 Go 中進行調整來確定進程是否存在。

Go 實現

以下Go 代碼演示了此技術:

package main

import (
    "fmt"
    "log"
    "os"
    "strconv"
    "syscall"
)

func main() {
    for _, p := range os.Args[1:] {
        pid, err := strconv.ParseInt(p, 10, 64)
        if err != nil {
            log.Fatal(err)
        }
        process, err := os.FindProcess(int(pid))
        if err != nil {
            fmt.Printf("Failed to find process: %s\n", err)
        } else {
            err := process.Signal(syscall.Signal(0))
            fmt.Printf("process.Signal on pid %d returned: %v\n", pid, err)
        }

    }
}

示例輸出

執行時,此程式碼將顯示多個進程的狀態:

$ ./kill 1 $$ 123
process.Signal on pid 1 returned: operation not permitted
process.Signal on pid 12606 returned: <nil>
process.Signal on pid 123 returned: no such process

在此範例中,進程1 傳回錯誤,因為它是不屬於目前使用者。進程 12606 傳回 nil,因為它是活動的並且由使用者擁有。進程 123 回傳錯誤,因為它不再存在。

以上是Go 中 os.FindProcess 呼叫失敗是否一定表示進程已終止?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn