何時強制以程式方式發送 SIGINT?
我知道終止前台程序的推薦方法是通過
SIGTERM
信號,因為它為程序本身提供了清理/釋放資源的機會。該信號只能通過命令生成/發送,它可以通過任何kill
pkill
killall
命令 - 直到這裡我沒問題。此外,它是這些命令的預設信號。現在,我知道
SIGINT
信號中斷了一個過程。因此“相似”為terminate。但是我從以下內容中閱讀了以下答案(摘錄):
SIGINT
並且SIGQUIT
專門用於來自終端的請求:可以分配特定的輸入字元來生成這些信號(取決於終端控制設置)。的預設操作與 的預設操作和不可更改的操作是相同類型的程序終止;SIGINT``SIGTERM``SIGKILL
直到這裡根據答案是由組合鍵 ( + )
SIGINT
觸發並且理論上與 相同,它即將:給程序本身清理/釋放資源的機會。ctrl``c
SIGINT``SIGTERM
老實說,在閱讀了許多教程之後,我無法明確地找到並確認該資訊。例如來自:
在許多地方,這些信號都使用了中斷和終止術語。
此外,從相同的答案存在*@Jonathan Leffler*的評論(摘錄)為:
這是關鍵點:
SIGINT
並且SIGQUIT
可以在程序執行時從終端使用單個字元生成。其他信號必須由另一個程序以某種方式(例如通過kill
命令)生成。SIGINT
不那麼暴力SIGQUIT
;後者產生核心轉儲直到這裡作為一個可能的結論:
SIGINT
可以通過組合鍵或命令觸發,並且SIGTERM
只能通過命令觸發。這篇文章的原因:如果理論上
SIGINT
是一樣的SIGTERM
問題
- 何時以
SIGINT
程式方式強制發送?它出現在 中
kill -l
,所以可以使用它。額外問題
同樣,如果理論上
SIGINT
與SIGTERM
- 相同,則兩者都可以忽略/阻止/處理
- 為什麼被創建
SIGINT
?- 為什麼
ctrl
+c
沒有從一開始就分配給SIGTERM
?老實說,我認為這
SIGINT
是不安全的,因為它會中斷程序,因此會使一些數據處於不一致/完整的狀態
和(以及許多其他信號)的預設操作是終止程序。這在例如Linux 手冊頁中有記錄,請參閱下面部分引用的“標准信號”下的表格。在實踐中也是如此。
SIGINT``SIGTERM
signal(7)
那裡的部分錶格:
Signal Standard Action Comment ──────────────────────────────────────────────────────────────────────── SIGHUP P1990 Term Hangup detected on controlling terminal or death of controlling process SIGINT P1990 Term Interrupt from keyboard SIGKILL P1990 Term Kill signal SIGTERM P1990 Term Termination signal
現在,這是預設操作。對於大多數信號,接收它們的程序可以通過預先設置一個信號處理函式來擷取它們,或者完全忽略它們。知道 a
SIGINT
通常是由使用者按 Ctrl-CSIGTERM
發送的,並且通常是由其他一些要求接收者退出的程序發送的,因此程序可以決定以不同的方式處理它們。互動式程序可能決定直接結束任何長時間執行的任務
SIGINT
而不是立即退出,讓使用者可以選擇退出或做一些不同的事情。一直在退出SIGTERM
。再說一次,一個更簡單的程序可能會為它們設置相同的處理程序(可能還有一些其他的,比如SIGHUP
):一個保存所有數據並退出的程序。例如,我在 Debian 上嘗試的互動式 Bash shell 會在
SIGINT
不執行任何操作的情況下清除目前命令行;忽略SIGTERM
(有點令人驚訝,但它可能與向整個程序組發送信號有關);並退出SIGHUP
(因為SIGHUP
意味著終端連接消失了,所以嘗試閱讀更多命令沒有意義)。大多數信號允許接收程序在(可能)退出之前進行任何牠喜歡的清理。兩個異常信號是
SIGKILL
andSIGSTOP
,它們不能被擷取或忽略,但它們會無條件地立即破壞或停止程序,而不讓它進行任何清理。(雖然請注意核心仍然會執行作業系統資源所需的任何清理,但這裡的清理更多的是關於程序記憶體中未保存的數據。)當然,還有其他信號也預設終止程序。Like
SIGALRM
,由alarm()
系統呼叫設置的定時器發送。雖然預設行為在某些情況下可能有用,但它作為通用鬧鐘更有用,例如告訴程序執行一些週期性任務。