亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

殺死子進程 - 執行。命令

殺死子進程 - 執行。命令

Go
慕標5832272 2022-08-15 17:38:57
如何殺死子進程?我有一個長時間運行的應用程序,使用“exec.命令“:// ...I am a long running application in the background// Now I am starting a child process, that should be killed togeter with the parent application.cmd := exec.Command("sh", "-c", execThis)// create a new process group// cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}現在,如果我殺死它就不會殺死子進程 - 你知道怎么做嗎?<pid of long running application in the background>
查看完整描述

1 回答

?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

這里有很多事情需要梳理。

首先,這是操作系統本身的作用。然后,一旦我們知道操作系統是什么以及它做了什么,程序就會做什么。

顯然,操作系統的作用取決于操作系統。POSIX風格的操作系統有兩種:普通和基于進程組的,或killpg。這個函數的 killpg 變體是唯一一個向整個進程組發送信號的函數;plain 只是向單個進程發送信號。killkillkillkill

當程序從控制終端運行時,鍵盤信號(^C,^Z等)被發送到該控制終端的前臺進程組(請參閱鏈接的頁面以獲取對這些信號的合理描述,并注意BSD / macOS也有^T和)。但是,如果信號是從其他程序發送的,而不是從控制終端發送的,則由該程序決定是否調用或 ,以及發送什么信號。SIGINFOkillpgkill

某些信號無法捕獲。SIGKILL和SIGSTOP就是這種情況。這些信號不應該隨意發送;它們應該保留給最后的手段。相反,希望另一個程序停止的程序通常應該發送SIGINT,SIGTERM,SIGHUP或(很少)SIGQUIT中的一個。Go傾向于將SIGQUIT綁定到調試(因為POSIX系統上的運行時使^\轉儲各種goroutines的堆棧),因此這不是一個好的選擇。但是,這不是由您在此處編寫的Go程序決定的,該程序只能嘗試捕獲信號。發送內容的選擇取決于發件人。

捕捉信號的“Go方式”是使用goroutine和通道。信號。通知功能將操作系統級信號轉換為通道上的事件。您不知道(也無法)知道的是信號是否通過或到達您的過程(盡管如果它來自控制終端交互,POSIX-y內核通過等效項發送)。如果要自行傳播該信號,只需使用通知事件調用進行操作系統級調用的代碼即可。使用 os/exec 包時,請使用 cmd.Process.Signal:請注意,這會調用 POSIX ,而不是它的 ,但您不希望在此處使用,因為我們首先假設的是非進程組信號(基于 p 組的信號可能不需要傳播)。killkillpgkillpgkillkillkillpgkillpg

沒有完全可移植的方式將信號發送到POSIX進程組(這并不奇怪,因為這不是可移植到非POSIX系統)。可悲的是,在Go中似乎沒有直接的Unix或POSIX特定方法來做到這一點。

在非POSIX系統上,一切都完全不同。請參閱操作系統/信號前面的討論。


查看完整回答
反對 回復 2022-08-15
  • 1 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號