首頁 >後端開發 >Golang >為什麼 `Process.Signal` 不殺死 Go 中的子程序?

為什麼 `Process.Signal` 不殺死 Go 中的子程序?

Barbara Streisand
Barbara Streisand原創
2024-11-27 17:37:15293瀏覽

Why Doesn't `Process.Signal` Kill Child Processes in Go?

為什麼不使用 Process.Signal 殺死子程序?

在提供的程式碼片段中,該進程應該是在指定的逾時後使用 cmd.Process.Signal(syscall.SIGKILL) 殺死。但是,超時無法正常工作。儘管列印了“It’s dead Jim”,但該過程仍在繼續運行,並且永遠不會列印“Done waiting”。

問題

這裡的問題與事實有關cmd.Process.Signal 不會殺死子進程。子進程有自己的進程組,需要單獨殺死。

解決方案

要解決此問題,可以使用syscall.Getpgid 和syscall.Kill:

import "syscall"

cmd := exec.Command(some_command)
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
cmd.Start()

pgid, err := syscall.Getpgid(cmd.Process.Pid)
if err == nil {
    syscall.Kill(-pgid, 15)  // note the minus sign
}

cmd.Wait()

透過使用SysProcAttr.Setpgid = true,一個單獨的進程組是為子進程建立的。然後,syscall.Getpgid 檢索子程序的進程組 ID (pgid)。最後,呼叫 syscall.Kill(-pgid, 15) 向整個進程組發送 SIGTERM 訊號,有效殺死子程序及其子程序。

注意事項

此解決方案可能不適用於所有平台。它已被證實可在 macOS 和 Linux 上運行,但在其他作業系統上的行為尚不確定。

以上是為什麼 `Process.Signal` 不殺死 Go 中的子程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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