Linux應用:Linux的信號

什么是信號

信號是一種軟件中斷,用于通知進程系統中發生了某種特定事件。它是操作系統與進程之間,以及進程與進程之間進行異步通信的一種方式。在 Linux 系統中,信號是一種比較簡單的進程間通信機制。當一個信號產生時,內核會通過某種方式通知相應的進程,進程接收到信號后,會根據信號的類型以及自身對該信號的處理方式來做出響應。例如,用戶按下 Ctrl + C 組合鍵,系統會向當前前臺進程發送一個 SIGINT 信號,通常情況下,進程接收到這個信號后會終止運行。

常見的信號

SIGINT

SIGINT:中斷信號,通常由用戶按下 Ctrl + C 組合鍵產生。它用于通知進程需要立即停止當前操作并退出。許多交互式程序,如命令行工具,在接收到 SIGINT 信號時會停止運行,清理資源并退出。?
SIGTERM:終止信號。這是一個通用的終止信號,系統或其他進程可以發送給目標進程,請求其正常終止。與 SIGKILL 不同,SIGTERM 允許進程有機會在終止前進行清理操作,例如關閉打開的文件、釋放內存等。許多服務器程序在接收到 SIGTERM 信號時,會停止接受新的連接,并逐步關閉當前正在處理的連接,然后安全退出。?

SIGKILL

SIGKILL:強制終止信號。一旦進程接收到 SIGKILL 信號,內核會立即終止該進程,進程沒有機會進行任何清理操作。這個信號主要用于處理那些陷入死鎖或無法響應其他正常終止信號的進程。但由于它不允許進程進行清理,可能會導致資源沒有正確釋放等問題,所以一般作為最后的手段使用。?

SIGALRM

SIGALRM:鬧鐘信號。進程可以使用 alarm 函數設置一個定時器,當定時器超時后,內核會向該進程發送 SIGALRM 信號。常用于實現定時任務,比如在一個網絡請求中設置超時時間,如果在規定時間內沒有得到響應,進程接收到 SIGALRM 信號后可以進行相應的錯誤處理。?

SIGCHLD

SIGCHLD:子進程狀態改變信號。當一個進程的子進程終止、暫停或繼續運行時,內核會向該父進程發送 SIGCHLD 信號。父進程可以通過處理這個信號來回收子進程的資源,避免產生僵尸進程。

進程怎么處理信號

默認處理

默認處理:每個信號都有系統默認的處理方式。例如,對于 SIGINT 信號,默認處理方式是終止進程;對于 SIGQUIT 信號,默認處理方式是終止進程并生成核心轉儲文件(如果允許的話)。進程在沒有對某個信號進行自定義處理時,就會按照系統默認方式來響應信號。

忽略信號?

忽略信號:進程可以選擇忽略某些信號,即接收到信號后不進行任何操作。但并不是所有信號都可以被忽略,例如 SIGKILL 和 SIGSTOP 信號不能被忽略,這是為了保證系統能夠在必要時強制終止或暫停進程。一般情況下,進程可以通過調用 signal 函數來設置對某個信號的處理方式為忽略,例如signal(SIGINT, SIG_IGN); 這行代碼會使進程忽略 SIGINT 信號,當用戶按下 Ctrl + C 時,進程不會終止。?

捕獲信號并自定義處理

捕獲信號并自定義處理:進程可以定義一個信號處理函數,當接收到特定信號時,內核會調用該函數,進程在函數中可以執行自定義的操作。首先需要定義信號處理函數,

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>int fd;
int* ptr;void sigint_handler(int signum) {printf("Received SIGINT. Cleaning up...\n");if (fd != -1) {close(fd);printf("File test.txt closed.\n");}if (ptr != NULL) {free(ptr);printf("Memory freed.\n");}exit(0);
}int main() {signal(SIGINT, sigint_handler);fd = open("test.txt", O_RDONLY);ptr = (int*)malloc(sizeof(int));while(1) {printf("Main process is working...\n");sleep(1);}return 0;
}

stdio.h:提供標準輸入輸出庫函數,如 printf 用于輸出信息。
signal.h:用于信號處理相關的函數和宏定義,這里會用到 signal 函數來設置信號處理程序。
unistd.h:包含了許多 Unix 標準庫函數,例如 close 用于關閉文件描述符,sleep 用于使程序暫停執行。
fcntl.h:提供文件控制操作的函數和宏定義,代碼中使用 open 函數來打開文件。
stdlib.h:包含通用工具函數,例如 malloc 用于動態分配內存,free 用于釋放動態分配的內存,exit 用于終止程序。
fd:用于存儲文件描述符,后續會通過 open 函數打開文件并將返回的文件描述符賦值給它。
ptr:是一個指向 int 類型的指針,用于存儲動態分配的內存地址。
sigint_handler:這是一個信號處理函數,當進程接收到 SIGINT 信號時會被調用。
signum:是傳遞給信號處理函數的信號編號,在這個函數中,signum 的值為 SIGINT。
函數內部操作:
打印一條消息,表示接收到了 SIGINT 信號,開始進行清理工作。
檢查 fd 是否有效(不等于 -1),如果有效則關閉文件并打印關閉文件的信息。
檢查 ptr 是否為空指針,如果不為空則釋放動態分配的內存并打印釋放內存的信息。
調用 exit(0) 終止程序,返回狀態碼 0 表示正常退出。
signal(SIGINT, sigint_handler):將 SIGINT 信號的處理函數設置為 sigint_handler,這樣當進程接收到 SIGINT 信號(通常是用戶按下 Ctrl+C)時,會調用 sigint_handler 函數進行處理。
fd = open(“test.txt”, O_RDONLY);:以只讀模式打開 test.txt 文件,并將返回的文件描述符賦值給 fd。
ptr = (int*)malloc(sizeof(int));:動態分配一個 int 類型大小的內存空間,并將其地址賦值給 ptr。
while(1):創建一個無限循環,模擬主程序持續執行任務。
printf(“Main process is working…\n”);:每秒打印一條消息,表示主程序正在運行。
sleep(1);:使程序暫停執行 1 秒,避免消息打印過快。
代碼通過設置信號處理函數,確保在程序運行過程中接收到 SIGINT 信號時,能夠正確地關閉打開的文件并釋放動態分配的內存,然后正常終止程序,避免資源泄漏。
在這里插入圖片描述

alarm 和pause函數

alarm 函數:alarm 函數用于設置一個定時器,在指定的秒數后,內核會向調用該函數的進程發送 SIGALRM 信號。函數原型為unsigned int alarm(unsigned int seconds);,參數 seconds 表示定時器的超時時間,單位為秒。如果在調用 alarm 函數時,之前已經設置過定時器且尚未超時,那么之前設置的定時器將被新的定時器覆蓋,并且返回值是之前定時器剩余的時間。如果 seconds 為 0,則取消之前設置的定時器,并且返回值為之前定時器剩余的時間(如果之前沒有設置定時器,則返回 0)。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>void sigalrm_handler(int signum) {printf("Time's up!\n");
}int main() {signal(SIGALRM, sigalrm_handler);alarm(5); // 設置5秒后發送SIGALRM信號while(1) {// 主程序執行其他任務sleep(1);printf("Working...\n");}return 0;
}

設置了一個 5 秒的定時器,5 秒后進程接收到 SIGALRM 信號,會調用 sigalrm_handler 函數輸出 “Time’s up!”。
在這里插入圖片描述

pause 函數:pause 函數用于使調用它的進程暫停執行,直到該進程接收到一個信號。函數原型為int pause(void);。如果進程接收到的信號的處理方式是默認處理或忽略,那么 pause 函數返回后,進程會繼續執行 pause 函數后面的代碼;如果進程接收到的信號的處理方式是捕獲信號并執行自定義處理函數,那么在自定義處理函數執行完畢后,pause 函數返回,進程繼續執行 pause 函數后面的代碼。pause 函數的返回值總是 - 1,并且會設置 errno 為 EINTR,表示被信號中斷。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>void sigalrm_handler(int signum) {printf("Time's up!\n");
}int main() {signal(SIGALRM, sigalrm_handler);alarm(5); // 設置5秒后發送SIGALRM信號while(1) {// 主程序執行其他任務sleep(1);printf("Working...\n");}return 0;
}

進程執行到 pause 函數時會暫停,當用戶按下 Ctrl + C 發送 SIGINT 信號后,進程調用 sigint_handler 函數,然后 pause 函數返回,進程繼續執行輸出 “After pause”。
在這里插入圖片描述

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

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

相關文章

實時監控、數據分析!Web-Check構建你的網站健康檢測系統實操方案

文章目錄 前言1.關于Web-Check2.功能特點3.安裝Docker4.創建并啟動Web-Check容器5.本地訪問測試6.公網遠程訪問本地Web-Check7.內網穿透工具安裝8.創建遠程連接公網地址9.使用固定公網地址遠程訪問 前言 在數字化運維領域&#xff0c;網站穩定性保障始終是開發者和運維團隊的核…

win32匯編環境,網絡編程入門之八

;在上一教程里&#xff0c;我們學習了簡單的處理服務器返回的數據 ;在這一教程里&#xff0c;我們了解一下&#xff0c;當連接上網站后&#xff0c;應該發送什么數據過去的問題 ;這里有個簡單的方式學習&#xff0c;以下是一個示例 ;我們上網的時候可以用谷歌瀏覽器&#xff0c…

windows 平臺編譯openssl

文章目錄 準備環境安裝perl安裝NASM獲取源碼 源碼編譯配置編譯 準備環境 安裝perl 下載Perl 5.40.0.1 Portable zip strawberryperl 解壓后設置系統環境變量 測試安裝是否成功 perl --versionThis is perl 5, version 40, subversion 0 (v5.40.0) built for MSWin32-x64-m…

一文了解ThreadLocal

什么是ThreadLocal&#xff1f; ThreadLocal是每個線程私有的&#xff0c;線程可以把自己的私有數據放到ThreadLocal里面&#xff0c;不用擔心其他線程訪問到自己ThreadLocal。 通過set()方法將值存入ThreadLocal或者修改值&#xff0c;get()方法取出值&#xff0c;remove()方…

OpenWrt開發第6篇:怎么添加OpenWrt的Package-基于Raspberry Pi 4B開發板

文/指尖動聽知識庫-谷谷 文章為付費內容,商業行為,禁止私自轉載及抄襲,違者必究!!! 文章專欄:Openwrt開發-基于Raspberry Pi 4B開發板 1.如圖1所示,首先創建軟件包所在的目錄,在openwrt根目錄中執行mkdir -p package/mypackages/helloworld命令;

常?CMS漏洞之一:WordPress

WordPress是?個以PHP和MySQL為平臺的?由開源的博客軟件和內容管理系統。WordPress具有插件架構和模板系統。截?2018年4?&#xff0c;排名前1000萬的?站中超過30.6%使?WordPress。 WordPress是最受歡迎的?站 內容管理系統。全球有?約30%的?站(7億5000個)都是使?WordP…

【第17節】windows sdk編程:線程與線程調度

目錄 一、線程 1.1 線程的基本概念 1.2 何時創建線程 二、線程控制 三、遍歷線程 四、線程內核對象 4.1 線程上下文 4.2 暫停次數 4.3 信號 五、線程調度 5.1 什么是線程優先級 5.2 進程優先級與相對線程優先級 5.3 編程改變優先級 5.4 動態優先級的概念 一、線程…

Python數據可視化實戰:從基礎圖表到高級分析

Python數據可視化實戰&#xff1a;從基礎圖表到高級分析 數據可視化是數據分析的重要環節&#xff0c;通過直觀的圖表可以快速洞察數據規律。本文將通過5個實際案例&#xff0c;手把手教你使用Python的Matplotlib庫完成各類數據可視化任務&#xff0c;涵蓋條形圖、堆積面積圖、…

【機器學習-分類算法】

比如將一張圖片按尺寸識別分類為橫向或者縱向兩類就是二分類問題 設x軸為圖像的寬、y軸為圖像的高&#xff0c;那么把訓練數據展現在圖上就是這樣的: 若增加更多的數據集有: 如果只用一條線將圖中白色的點和黑色的點分開,那么: 分類的目的就是找到這條線,就可以根據點在線…

Compose Indication:點擊效果設置

Compose Indication&#xff1a;打造獨特點擊效果的秘密武器 在Compose開發中&#xff0c;大家可能都碰到過Indication&#xff0c;不少人第一次接觸它&#xff0c;是在想去掉Material默認的點擊水波紋效果的時候。要是在AI工具里搜“怎么去掉水波紋效果”&#xff0c;會得到這…

Docker build 會在本地產生巨大的文件

Docker build 會在本地產生巨大的文件&#xff0c; 比如 用 這個命令列出本地鏡像 docker images 可見size都是很大的&#xff0c; 到docker目錄下&#xff0c;看到ext4.vhdx的大小 80多G 那只能用這個命令把不用的鏡像刪掉了&#xff1a; &#xff08;rmi后面是鏡像id&a…

臺式機電腦組裝---電腦機箱與主板接線

臺式機電腦組裝—電腦機箱與主板接線 1、機箱連接主板的跳線一般主要有USB 2.0、USB 3.0、前置音頻接口(HD_AUDIO)以及POWER SW、RESET SW、POWER LED、HDD LED四個主板跳線&#xff0c;這些跳線分別的含義如下。 RESET SW&#xff1a;機箱重啟按鍵&#xff1b;注&#xff1a…

【虛幻引擎UE5】SpawnActor生成Character實例不執行AI Move To,未初始化AIController的原因和解決方法

虛幻引擎版本&#xff1a;5.5.4 問題描述 剛創建的Third Person項目里&#xff0c;定義一個BP_Enemy藍圖&#xff0c;拖拽到場景中產生的實例會追隨玩家&#xff0c;但SpawnActor產生的實例會固定不動。BP_Enemy藍圖具體設計如下&#xff1a; BP_Enemy的Event Graph ?? 又定義…

跨平臺RTSP高性能實時播放器實現思路

跨平臺RTSP高性能實時播放器實現思路 目標&#xff1a;局域網100ms以內超低延遲 一、引言 現有播放器&#xff08;如VLC&#xff09;在RTSP實時播放場景中面臨高延遲&#xff08;通常數秒&#xff09;和資源占用大的問題。本文提出一種跨平臺解決方案&#xff0c;通過網絡層…

HTTP 失敗重試(重發)方案

在 Qt 網絡開發中&#xff0c;使用 QNetworkAccessManager 進行 HTTP 請求時&#xff0c;可能會遇到網絡超時、服務器錯誤等情況。為了提高請求的可靠性&#xff0c;可以實現 HTTP 失敗重試&#xff08;重發&#xff09; 機制。下面介紹幾種常見的 失敗重發方案&#xff1a; 單…

大白話詳細解讀React框架的diffing算法

1. Diffing 算法是什么&#xff1f; Diffing 算法是 React 用來比較虛擬 DOM&#xff08;Virtual DOM&#xff09;樹的一種算法。它的作用是找出前后兩次渲染之間的差異&#xff08;diff&#xff09;&#xff0c;然后只更新這些差異部分&#xff0c;而不是重新渲染整個頁面。 …

【Linux內核系列】:動靜態庫詳解

&#x1f525; 本文專欄&#xff1a;Linux &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 有些鳥兒是注定是關不住的&#xff0c;因為它們的每一片羽翼都沾滿了自由的光輝 ★★★ 本文前置知識&#xff1a; 編譯與鏈接的過程…

深度解讀DeepSeek部署使用安全(48頁PPT)(文末有下載方式)

深度解讀DeepSeek&#xff1a;部署、使用與安全 詳細資料請看本解讀文章的最后內容。 引言 DeepSeek作為一款先進的人工智能模型&#xff0c;其部署、使用與安全性是用戶最為關注的三大核心問題。本文將從本地化部署、使用方法與技巧、以及安全性三個方面&#xff0c;對Deep…

【詳細解決】pycharm 終端出現報錯:“Failed : 無法將“Failed”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。

昨天在終端一頓操作后突然打開pycharm時就開始報錯&#xff1a; 無法將“Failed”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫&#xff0c;如果包括路徑&#xff0c;請確保路徑正確&#xff0c;然后再試一次。 所在位置 行:1 字符: 1 Failed to act…

【電路筆記】-D型觸發器

D型觸發器 文章目錄 D型觸發器1、概述2、主從D觸發器3、使用D型觸發器進行分頻4、D觸發器作為數據鎖存器5、透明數據鎖存器6、總結D型觸發器是一種改進的置位-復位觸發器,通過增加一個反相器來防止S和R輸入處于相同的邏輯電平。 1、概述 D型觸發器克服了基本SR NAND門雙穩態電…