Linux——信號(1)信號的產生

我們在講進程的多種狀態時提到過,一個進程的退出有三種情況:正常退出,結果出錯退出(代碼也執行完了),異常終止退出(代碼未執行完),其中最后一種退出相當于進程在運行時,突然收到某個”消息“,使自己不得不終止運行,這種”消息“就是信號。本文我們主要講到什么是信號、產生的方式以及應用情景等。

一、什么是信號

在生活中,我們也會有很多信號,比如下課鈴響了我們知道下課了,綠燈來了我們知道該走了,也就是說,它們在向我們發出某種消息,使得我們去做一些事情,在操作系統中也類似,信號就是其他進程,向目標進程發送異步事件的一種方式。所謂異步,就是指目標進程自己也不知道這個信號什么時候來,突然、隨時的情況。

二、關于信號你需要知道的一些知識

1.我們如何識別信號呢?

識別信號是內置的。進程認識信號,是程序內置的特性。就相當于我們從小就被告知紅燈停綠燈行

2.信號產生后該如何處理知道嗎?如果沒有產生,信號又該如何處理知道嗎?

全都知道!因為信號處理的方法,在信號產生之前,就已經準備好了,就像我們從來沒遇見紅綠燈時,家長告訴我們如果遇到了應該這樣做。

3.信號來的時候,我需要立即處理嗎?

不一定,因為此時我正在做的事情優先級比較高,可能在某個合適的時候再進行處理。但進程需要把信號記錄下來。

4.如何處理信號?

a.默認行為(我們早就被告知正常應如何做)

b.忽略信號(并不是不處理,而是遇見信號后對其完成忽略操作,比如鬧鐘響了我把它關閉并設置成一小時后再響)

c.自定義行為 (我雖然是被告知如果遇見信號該如何做,但是我也可以不聽它的,按照自己的想法去做)

三、信號的產生方式

1. 鍵盤產生

我們知道,在Linux中想執行一個程序只需要輸入 ./name即可,這種方式我們稱前臺進程。對應的還有后臺進程(程序在后臺運行)語法為 ./name &。二者的區別是:前臺進程相當于把命令行解釋占用了,當進程運行時,我們無法進行輸入操作來完成某些命令,而后臺進程運行時,我們依舊可以進行命令行解釋(后臺進程也可以把內容打印在顯示器上)。我們之前提到的熱鍵Ctrl+C,其實是終止前臺進程的命令。至于如何終止后臺命令,a.我們可以再打開一個終端然后找到進程的pid進行kill操作 b.我們在使用./name &時,它會顯示一個下標和pid,我們只需要使用命令fg 下標(比如fg 1)即可把對應下標的進程放置前臺運行,然后再ctrl+c。我們輸入ctrl+c時,實質上是把某種信號給了前臺進程,使其終止。至于信號的捕捉,我們有系統調用

其就是把指定的信號(參數1)按照自定義的方式(參數2)去捕捉

其中我們第二個參數要傳函數的地址。函數的類型是void且參數是int(輸出型參數,會用信號的序號賦值)

查看所有的信號我們用命令:kill -l

其中,我們的ctrl+c傳給進程的就是2號信號(每一個信號名稱都是宏)與此功能類似的是3號信號,默認也是終止,熱鍵是ctrl+\ (我們只重點講1-31號)

在1-31號中,大部分都是和進程終止相關的信號,且基本都能被signal捕捉,但有一個信號是絕對不可能被捕捉的——9號,它也是殺掉進程的信號,我們常與kill命令結合終止命令。

關于signal有兩點補充:
(1)對于同一個信號,signal捕捉一次即可,不必放在循環中

? (2)? ?若沒有產生某種信號,signal中的handler一般不會被調用

言歸正傳,我們從鍵盤輸入是如何轉化成信號的?過程是,我們從鍵盤輸入的內容,先是交給了OS,然后OS再把我們的內容轉化為對應的信號傳遞給進程,但我們說過,進程并不是收到信號立馬就處理,有時候也需要記錄信號,那么進程記錄信號的方式是:在PCB中創建一個位圖(記錄1-31號,比特位的位置為信號的編號,比特位是否為1表示是否收到對應的信號,所以,發送信號的本質是寫入信號,即OS修改該進程PCB中的位圖。

那么OS怎么知道鍵盤上有數據了?

我們引進一個名詞——硬件中斷,根據馮諾依曼體系,我們的鍵盤屬于輸入設備,按道理來講OS會不斷地檢測鍵盤是否有內容輸入,但現在不用了,當鍵盤輸入完畢的時候,會向OS發出硬件中斷的信號,OS收到信號再來獲取數據。

2.指令中斷

關于中斷進程的指令,我們剛才也提到過,也就是kill

kill -num pid

3.系統調用

沒錯,kill也是系統調用,返回值小于0表示發送信號失敗

除此之外,還有一個系統調用——raise

它的特點是,把你要傳的信號序號進行傳參,然后誰調用這個系統調用就把這個信號傳給誰。

還有不傳參版的——abort

4.軟件條件

在OS中因某些軟件還沒準備好,或不具備某種條件而產生的信號方式就是軟件條件。比如我們之前提到的管道,當管道的讀端關閉寫端仍要寫入,操作系統就會發送信號(13號)殺死這個進程,這就是軟件條件不具備。除此之外還有一個例子——鬧鐘

可以設定我們的進程在多長時間后自動終止。即到指定時間后由OS向進程發送指定信號(14)

至于其返回值,當alarm傳參為0時,表示取消鬧鐘,此時返回值就是上一個鬧鐘的剩余時間。

5.異常?

進程出現異常的情形大多數是因為野指針、除0操作,當進程出現異常了,OS會向進程發送8//11信號來殺死進程。

四、core與term

我們查信號手冊時,發現有的進程是core有的是term,他們有什么區別呢?

term類型是正常終止進程,而core類型比它多做了一件事——核心轉儲

當進程收到信號要終止時,會在當前目錄下形成文件->pid.core,當進程崩潰時,會把進程在內存的信息保存起來,方便后續調試。但云服務器一般是關閉core的這個功能的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901768.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901768.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901768.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode 2919 使數組變美的最小增量運算數

動態規劃解題:最小操作次數使數組變為美麗數組 問題描述 給定一個下標從0開始、長度為n的整數數組nums和一個整數k。你可以對數組中的任意一個元素進行加1操作,操作次數不限。如果數組中任意長度大于或等于3的子數組的最大值都大于或等于k,…

計算生物學在中國的發展情況?

李升偉 整理 計算生物學在中國的發展呈現出多方面積極態勢,具體表現如下: 發展概述: 上海發布了醫用AI發展的專項方案,特別強調了腦科學與計算生物學的前沿領域。這表明政府有意推動該領域的技術進步和技術合作平臺建設。國內的…

Linux之文件內容顯示(cat、grep、cut、sort、uniq、tr)

🎯 本文專欄:Linux 🚀 作者主頁:小度愛學習 1、瀏覽普通文件內容 命令常用選項說明cat-n 對輸出內容中的所有行標注行號;-b 對輸出內容中的非空行標注行號。查看文本文件的內容head-num 指定需要顯示文件num行的內容。…

3DS 轉 STL 全攻略:傳統工具與迪威模型網在線轉換深度解析

在 3D 建模與 3D 打印的技術領域中,常常會遇到需要將不同格式的文件進行轉換的情況。其中,把 3DS 文件轉換為 STL 格式是較為常見的操作。3DS 文件作為一種舊版 Autodesk 3D Studio 使用的 3D 圖像格式,存儲著豐富的信息,包括網格…

IoT FEM射頻前端模組芯片(2.4G PA)三伍微電子GSR2401 兼容替代RFX2401

型號:GSR2401應用:適用于藍牙(BT)、ZigBee及物聯網(IoT)設備 功能:集成了功率放大器(PA)、開關(Switch)和低噪聲放大器(LNA&#xff…

Missashe考研日記-day22

Missashe考研日記-day22 1 專業課408 學習時間:3h學習內容: 先把昨天關于進程調度的課后習題做了,然后花了挺長時間預習OS的最最最最重要的一部分——同步與互斥問題,這部分大二上課的時候就懵懵懂懂的,得認真再領悟…

2025年最新Web安全(面試題)

活動發起人小虛竹 想對你說: 這是一個以寫作博客為目的的創作活動,旨在鼓勵大學生博主們挖掘自己的創作潛能,展現自己的寫作才華。如果你是一位熱愛寫作的、想要展現自己創作才華的小伙伴,那么,快來參加吧&#xff01…

Qt QML - qmldir使用方法詳解

以實際例子看qmldir的使用 1.搞一個qmldir2.讓QML找到你的qmldir (重點).pro 工程文件QQmlApplicationEngine加載主QML處 3.用起來你的模塊 qmldir是Qt QML模塊化的基石,其設計初衷是為解決QML文件的組織、復用和依賴管理問題,。只需要在每個…

# Shell腳本參數設計規范(DeepSeek指導)

Shell腳本參數設計規范(DeepSeek指導) 文章目錄 Shell腳本參數設計規范(DeepSeek指導)A 我問:Q DeepSeek回答:**命令行參數表示規范****標準化表示示例**情況1:必選選項參數值情況2:…

MQTT協議:IoT通信的輕量級選手

文章總結(幫你們節約時間) MQTT協議是一種輕量級的發布/訂閱通信協議。MQTT通信包括連接建立、訂閱、發布和斷開等過程。MQTT基于TCP/IP,其通信過程涉及多種控制包和數據包。ESP32S3可以通過MQTT協議接收消息來控制IO9引腳上的LED。 想象一…

數據結構——反射、枚舉以及lambda表達式

1. 反射 Java的反射(reflection)機制是在運?時檢查、訪問和修改類、接?、字段和?法的機制;這種動態獲取信息以及動態調?對象?法的功能稱為java語?的反射(reflection)機制。 用途 1. 框架開發 2. 注解處理 3.…

C語言教程(十):C 語言函數詳解

一、引言 在 C 語言中,函數是一組執行特定任務的代碼塊。通過將復雜的程序邏輯劃分為多個函數,不僅能提高代碼的可讀性、可維護性,還便于代碼的復用。無論是簡單的數學計算,還是復雜的系統操作,函數都發揮著核心作用。…

力扣面試150題--有效的字母異位詞和字母異位詞分組

Day 24 題目描述 思路 初次思路:如果兩個字符串為異位詞,說明它們長度相同并且字母出現的次數相同,于是有以下做法: 定義一個map,來保存s中每個字符的出現次數處理特殊情況,如果長度不同,直接…

數理邏輯(Mathematical Logic)綜論與跨學科應用

李升偉 整理 數理邏輯(Mathematical Logic)是現代邏輯學與數學交叉的核心學科,以嚴格的數學方法研究邏輯推理的形式與規律。其發展深刻影響了數學基礎、計算機科學、語言哲學等領域。以下從多個維度綜論數理邏輯: 1. 核心分支 命…

高性能內存kv數據庫Redis(續)

目錄 四.主從同步與對象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis為什么要實現持久化 2.2fork進程的寫時復制機制 2.3大Key的影響 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的優缺點 3.redis里面的高可用體現在哪里? 3.1r…

泛型算法——只讀算法(一)

在 C 標準庫中,泛型算法的“只讀算法”指那些 不會改變它們所操作的容器中的元素,僅用于訪問或獲取信息的算法,例如查找、計數、遍歷等操作。 accumulate std::accumulate()是 C 標準庫**numeric**頭文件中提供的算法,用于對序列…

SvelteKit 最新中文文檔教程(21)—— 最佳實踐之圖片

前言 Svelte,一個語法簡潔、入門容易,面向未來的前端框架。 從 Svelte 誕生之初,就備受開發者的喜愛,根據統計,從 2019 年到 2024 年,連續 6 年一直是開發者最感興趣的前端框架 No.1: Svelte …

健康養生:開啟活力生活的密鑰

當我們在健身房看到年逾六旬卻身形矯健的老人,在公園偶遇精神矍鑠、步伐輕快的長者,總會驚嘆于他們的健康狀態。其實,這些都得益于長期堅持科學的養生之道。健康養生并非遙不可及的玄學,而是融入生活細節的智慧。? 在飲食的世界…

Linux信號三部曲:產生機制、處理方式與內核接口

Linux系列 文章目錄 Linux系列前言一、背景知識鋪墊1.1 信號的基本概念1.2 進程對信號的處理 二、信號的產生2.1 前臺進程和后臺進程2.2 鍵盤組合鍵2.3 kill 命令2.4 系統調用2.4.1 signal()接口2.4.2 kill()接口2.4.3 raise()接口2.4.4 abort()接口 總結 前言 Linux中&#x…

win7/win10/macos如何切換DNS,提升網絡穩定性

本篇教程教您如何在Windows10、Windows8.1、Windows7、MacOS操作系統切換DNS,以提升系統的穩定性,獲得更好的操作體驗。 Windows10及Windows8.1 1、右鍵單擊“此計算機”,然后選擇“屬性”。進入Windows系統界面后,選擇左側的“…