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