」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Go 中 os.FindProcess 呼叫失敗是否一定表示進程已終止?

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

發佈於2024-11-14
瀏覽:822

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: 
process.Signal on pid 123 returned: no such process

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

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3