為什麼不使用 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中文網其他相關文章!