1 回答

TA貢獻1802條經驗 獲得超5個贊
這里有很多事情需要梳理。
首先,這是操作系統本身的作用。然后,一旦我們知道操作系統是什么以及它做了什么,程序就會做什么。
顯然,操作系統的作用取決于操作系統。POSIX風格的操作系統有兩種:普通和基于進程組的,或killpg
。這個函數的 killpg 變體是唯一一個向整個進程組發送信號的函數;plain 只是向單個進程發送信號。kill
kill
kill
kill
當程序從控制終端運行時,鍵盤信號(^C,^Z等)被發送到該控制終端的前臺進程組(請參閱鏈接的頁面以獲取對這些信號的合理描述,并注意BSD / macOS也有^T和)。但是,如果信號是從其他程序發送的,而不是從控制終端發送的,則由該程序決定是否調用或 ,以及發送什么信號。SIGINFO
killpg
kill
某些信號無法捕獲。SIGKILL和SIGSTOP就是這種情況。這些信號不應該隨意發送;它們應該保留給最后的手段。相反,希望另一個程序停止的程序通常應該發送SIGINT,SIGTERM,SIGHUP或(很少)SIGQUIT中的一個。Go傾向于將SIGQUIT綁定到調試(因為POSIX系統上的運行時使^\轉儲各種goroutines的堆棧),因此這不是一個好的選擇。但是,這不是由您在此處編寫的Go程序決定的,該程序只能嘗試捕獲信號。發送內容的選擇取決于發件人。
捕捉信號的“Go方式”是使用goroutine和通道。信號。通知
功能將操作系統級信號轉換為通道上的事件。您不知道(也無法)知道的是信號是否通過或到達您的過程(盡管如果它來自控制終端交互,POSIX-y內核通過等效項發送)。如果要自行傳播該信號,只需使用通知事件調用進行操作系統級調用的代碼即可。使用 os/exec
包時,請使用 cmd.Process.Signal
:請注意,這會調用 POSIX ,而不是它的 ,但您不希望在此處使用,因為我們首先假設的是非進程組信號(基于 p 組的信號可能不需要傳播)。kill
killpg
killpg
kill
kill
killpg
killpg
沒有完全可移植的方式將信號發送到POSIX進程組(這并不奇怪,因為這不是可移植到非POSIX系統)。可悲的是,在Go中似乎沒有直接的Unix或POSIX特定方法來做到這一點。
在非POSIX系統上,一切都完全不同。請參閱操作系統/信號
包前面的討論。
- 1 回答
- 0 關注
- 148 瀏覽
添加回答
舉報