Kill

何時強制以程式方式發送 SIGINT?

  • May 18, 2022

我知道終止前台程序的推薦方法是通過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,所以可以使用它。

額外問題

同樣,如果理論上 SIGINTSIGTERM- 相同,則兩者都可以忽略/阻止/處理

  • 為什麼被創建SIGINT
  • 為什麼ctrl+c沒有從一開始就分配給SIGTERM

老實說,我認為這SIGINT不安全的,因為它會中斷程序,因此會使一些數據處於不一致/完整的狀態

和(以及許多其他信號)的預設操作是終止程序。這在例如Linux 手冊頁中有記錄,請參閱下面部分引用的“標准信號”下的表格。在實踐中也是如此。SIGINT``SIGTERMsignal(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

現在,這是預設操作。對於大多數信號,接收它們的程序可以通過預先設置一個信號處理函式來擷取它們,或者完全忽略它們。知道 aSIGINT通常是由使用者按 Ctrl-CSIGTERM發送的,並且通常是由其他一些要求接收者退出的程序發送的,因此程序可以決定以不同的方式處理它們。

互動式程序可能決定直接結束任何長時間執行的任務SIGINT而不是立即退出,讓使用者可以選擇退出或做一些不同的事情。一直在退出SIGTERM。再說一次,一個更簡單的程序可能會為它們設置相同的處理程序(可能還有一些其他的,比如SIGHUP):一個保存所有數據並退出的程序。

例如,我在 Debian 上嘗試的互動式 Bash shell 會在SIGINT不執行任何操作的情況下清除目前命令行;忽略SIGTERM(有點令人驚訝,但它可能與向整個程序組發送信號有關);並退出SIGHUP(因為SIGHUP意味著終端連接消失了,所以嘗試閱讀更多命令沒有意義)。

大多數信號允許接收程序在(可能)退出之前進行任何牠喜歡的清理。兩個異常信號是SIGKILLand SIGSTOP,它們不能被擷取或忽略,但它們會無條件地立即破壞或停止程序,而不讓它進行任何清理。(雖然請注意核心仍然會執行作業系統資源所需的任何清理,但這裡的清理更多的是關於程序記憶體中未保存的數據。)

當然,還有其他信號也預設終止程序。Like SIGALRM,由alarm()系統呼叫設置的定時器發送。雖然預設行為在某些情況下可能有用,但它作為通用鬧鐘更有用,例如告訴程序執行一些週期性任務。

引用自:https://unix.stackexchange.com/questions/702933