linux:信號深入理解

文章目錄

  • 1.信號的概念
    • 1.1基本概念
    • 1.2信號的處理基本概念
    • 1.3信號的發送與保存基本概念
  • 2.信號的產生
    • 2.1信號產生的五種方式
    • 2.2信號遺留問題(core,temp等)
  • 3.信號的保存
    • 3.1 信號阻塞
    • 3.2 信號特有類型 sigset_t
    • 3.3 信號集操作函數
    • 3.4 信號集操作函數的使用
  • 4.信號的處理
    • 4.1 信號的捕捉
    • 4.2 深入理解地址空間
    • 4.3 如何理解系統調用
    • 4.4 sigaction對信號捕捉
  • 5.可重入函數
  • 6.編譯器的優化及volatile關鍵字
  • 7.SIGCHLD信號(子進程退出發的信號)


1.信號的概念

1.1基本概念

在這里插入圖片描述
所謂同步和異步就是:
比如我正在上課,我讓一個學生去幫我拿快遞,然后我停下等那個學生回來再繼續講,即同步。
如果學生去拿快遞,我不管他,我接著講就是異步!

在這里插入圖片描述
1-31號為普通信號!
34-64號實時信號!
在這里插入圖片描述

1.2信號的處理基本概念

信號的處理大致分為三種:
a.默認動作
b.忽略動作
c.自定義處理—信號的捕捉
在這里插入圖片描述
core,temp都是終止,在本篇文章的后面會有更詳細的介紹!
在這里插入圖片描述

1.3信號的發送與保存基本概念

在這里插入圖片描述

2.信號的產生

2.1信號產生的五種方式

信號產生的三種主要方式和兩種不常用接口:
在這里插入圖片描述

如果把所有信號都捕捉,換成自定義動作那么怎么辦?
答:操作系統有些信號是不允許自定義捕捉的,比如9號信號killed。如果所有信號都能被捕捉那不亂套了!!!而且信號的發送者只有一個,那就是操作系統發的,通過位圖來執行!

下面還有兩種信號產生的方式:
4.軟件條件:
在這里插入圖片描述
5.異常:
我們都知道進程發生異常了就會崩潰,然后就會退出。
這便是異常發送信號!
那么崩潰了為啥會退出?因為異常的默認動作是終止進程!
那么可以不退出嘛?可以的,我們可以自定義捕捉異常!但是不推薦這么做!
在這里插入圖片描述

2.2信號遺留問題(core,temp等)

在這里插入圖片描述
我們用一個多進程的例子再來看看標志位:
在這里插入圖片描述

3.信號的保存

3.1 信號阻塞

在這里插入圖片描述

3.2 信號特有類型 sigset_t

從上圖來看,每個信號只有一個bit的未決標志,非0即1,不記錄該信號產生了多少次,阻塞標志也是這樣表示的。因此,未決和阻塞標志可以用相同的數據類型sigset_t來存儲,sigset_t稱為信號集,這個類型可以表示每個信號的“有效”或“無效”狀態,在阻塞信號集中“有效”和“無效”的含義是該信號是否被阻塞,而在未決信號集中“有效”和“無效”的含義是該信號是否處于未決狀態。

阻塞信號集也叫做當前進程的信號屏蔽字(Signal Mask),這里的“屏蔽”應該理解為阻塞而不是忽略。

3.3 信號集操作函數

#include <signal.h>int sigemptyset(sigset_t *set);  把sigset_t 這個位圖全部清空int sigfillset(sigset_t *set);    把整個位圖全部置1int sigaddset (sigset_t *set, int signo);  把一個特定的信號signo設置到這個集合里(1)int sigdelset(sigset_t *set, int signo);    把一個特定的信號signo在這個集合里清除(0)int sigismember(const sigset_t *set, int signo);    判斷一個信號是否在集合中

以及兩個系統調用函數:
在這里插入圖片描述

3.4 信號集操作函數的使用

在這里插入圖片描述
在這里插入圖片描述

#include <iostream>
#include <unistd.h>
#include <cstdio>
#include <sys/types.h>
#include <sys/wait.h>void PrintPending(sigset_t &pending)
{std::cout << "curr process[" << getpid() << "]pending: ";for (int signo = 31; signo >= 1; signo--){if (sigismember(&pending, signo)){std::cout << 1;}else{std::cout << 0;}}std::cout << "\n";
}void handler(int signo)
{std::cout << signo << " 號信號被遞達!!!" << std::endl;std::cout << "-------------------------------" << std::endl;sigset_t pending;sigpending(&pending);PrintPending(pending);這里正在處理handler方法的時候,把pending再獲取一次如果這時候打印出來的pending信號為1,就說明只能把handler方法處理完才能清空如果這時候打印出來的pending信號為全0,就說明在進入handler方法之前就把1清零了std::cout << "-------------------------------" << std::endl;
}int main()
{// 0. 捕捉2號信號signal(2, handler); // 自定義捕捉2號信號默認操作是退出,所以我們要自定義捕捉,否則推出了就看不到后面的現象了。// 1. 屏蔽2號信號sigset_t block_set, old_set;sigemptyset(&block_set);sigemptyset(&old_set);sigaddset(&block_set, SIGINT); // 我們有沒有修改當前進行的內核block表呢???1 0// 1.1 設置進入進程的Block表中sigprocmask(SIG_BLOCK, &block_set, &old_set); // 真正的修改當前進行的內核block表,完成了對2號信號的屏蔽!int cnt = 15;while (true){// 2. 獲取當前進程的pending信號集sigset_t pending;sigpending(&pending);// 3. 打印pending信號集PrintPending(pending);cnt--;// 4. 解除對2號信號的屏蔽if (cnt == 0){std::cout << "解除對2號信號的屏蔽!!!" << std::endl;sigprocmask(SIG_SETMASK, &old_set, &block_set);}sleep(1);}
}

在這里插入圖片描述

4.信號的處理

4.1 信號的捕捉

在這里插入圖片描述

4.2 深入理解地址空間

在這里插入圖片描述

4.3 如何理解系統調用

在這里插入圖片描述

4.4 sigaction對信號捕捉

在這里插入圖片描述

5.可重入函數

在這里插入圖片描述

main函數調用insert函數向一個鏈表head中插入節點node1,插入操作分為兩步,剛做完第一步的時候,因為硬件中斷使進程切換到內核,再次回用戶態之前檢查到有信號待處理,于是切換到sighandler函數,sighandler也調用insert函數向同一個鏈表head中插入節node2,插入操作的兩步都做完之后從sighandler返回內核態,再次回到用戶態就從main函數調用的insert函數中繼續往下執行,先前做第一步之后被打斷,現在繼續做完第二步。結是,main函數和sighandler先后向鏈表中插入兩個節點,而最后只有一個節點真正插入鏈表中了!

像上例這樣,insert函數被不同的控制流程調用,有可能在第一次調用還沒返回時就再次進入該函數,這稱為重入,insert函數訪問一個全局鏈表,有可能因為重入而造成錯亂,像這樣的函數稱為不可重入函數。

6.編譯器的優化及volatile關鍵字

在這里插入圖片描述

7.SIGCHLD信號(子進程退出發的信號)

在這里插入圖片描述

要想不產生僵尸進程還有另外一種辦法:父進程調 用sigaction將SIGCHLD的處理動作置為SIG_IGN,這樣fork出來的子進程在終止時會自動清理掉,不會產生僵尸進程,也不會通知父進程。
在這里插入圖片描述

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

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

相關文章

C# Winform實現五子棋游戲(代完善)

實現了基本的玩法。 BoardController.cs using System;namespace GomokuGame {public class BoardController{private static BoardController instance;private readonly int[,] board;private const int boardSize 15;private BoardController(){board new int[boardSize…

uniapp(h5 app) 中 webview和h5通信

1 uniapph5 和h5頁面 通信 h5 window.parent.postMessage(message, *); uniapph5 onload中 window.addEventListener(message, function (e) { // 監聽 message 事件 //console.log(e.origin) console.log(收到的cocos游戲ID,e.data) …

Python實現天氣數據采集

Python實現天氣數據采集 一、需求介紹二、完整代碼一、需求介紹 本次天氣數據采集的需求是獲取每日的最高溫、最低溫、風力、風向、天氣狀況、AQI指數,如圖所示,完整代碼附后: 本次采集的目標網址是2345天氣網: 上圖的URL中,beijing是城市名稱的縮寫,54511即為城市代碼…

數據庫設計步驟and相關注意點

文章目錄 前言數據庫設計的主要步驟1.需求分析2.概念結構設計3.邏輯結構設計4.物理結構模型設計5.數據庫實施和維護給出一些題目理解一下吧~ 總結 前言 學無止境&#xff0c;筆勤不輟。最近筆者狀態不是特別好&#xff0c;一直忙于應付課程作業&#xff0c;于是一直沒有時間更…

科技引領未來:高速公路可視化

高速公路可視化監控系統利用實時視頻、傳感器數據和大數據分析&#xff0c;通過圖撲 HT 可視化展示交通流量、車速、事故和路況信息。交通管理人員可以實時監控、快速響應突發事件&#xff0c;并優化交通信號和指揮方案。這一系統不僅提高了道路安全性和車輛通行效率&#xff0…

vue3結合element-plus之如何優雅的使用表格

背景 表格組件的使用在后臺管理系統中是非常常見的,但是如果每次使用表格我們都去一次一次地從 element-plus 官網去 復制、粘貼和修改成自己想要的表格。 這樣一來也說得過去,但是如果我們靜下來細想不難發現,表格的使用都是大同小異的,每次都去復制粘貼,對于有很多表格…

vue3封裝ElementUI plus Dialog彈窗

因為ElementuiPlus的dialog彈框的初始樣式不太好看,而公司要求又要好看,本來是已經實現了,但是后來想想了發現封裝完dialog的其他功能也要,所以特此記錄一下 方案一 思路:封裝一個組件,將所有新增的參數引入el-dialog 參數中,實現參數共用 新建一個組件,將官網暴露的屬性全部引…

C++開源庫glog使用封裝--自定義日志輸出格式,設置日志保留時間

glog下載和編譯 glog開源地址 https://github.com/google/glog glog靜態庫編譯 cd /home/wangz/3rdParty/hldglog/glogmkdir out mkdir build && cd buildcmake .. -DCMAKE_INSTALL_PREFIX../out -DCMAKE_BUILD_TYPERelease -DBUILD_SHARED_LIBSOFF本文選擇的glo…

網關路由SpringCloudGateway、nacos配置管理(熱更新、動態路由)

文章目錄 前言一、網關路由二、SpringCloudGateway1. 路由過濾2. 網關登錄校驗2.1 鑒權2.2 網關過濾器2.3 登錄校驗2.3.1 JWT2.3.2 登錄校驗過濾器 3. 微服務從網關獲取用戶4. 微服務之間用戶信息傳遞 三、nacos配置管理問題引入3.1 配置共享3.1.1 在Nacos中添加共享配置3.1.2 …

【前端三劍客之HTML】詳解HTML

1. HTML(超文本標記語言) HTML意為超文本標記語言&#xff0c;其可以通過標簽把其他網頁/圖片/視頻等資源引入到當前網頁中&#xff0c;讓網頁最終呈現出來的效果超越了文本.HTML是一種標記語言&#xff0c;其是由一系列標簽組成的. 而且每個標簽都有特定的含義和確定的頁面顯…

Vue 3入門指南

title: Vue 3入門指南 date: 2024/5/23 19:37:34 updated: 2024/5/23 19:37:34 categories: 前端開發 tags: 框架對比環境搭建基礎語法組件開發響應式系統狀態管理路由配置 第1章&#xff1a;Vue 3簡介 1.1 Vue.js的歷史與發展 Vue.js由前谷歌工程師尤雨溪&#xff08;Eva…

Java分支結構詳解

Java分支結構詳解 前言一、if 語句基本語法表示一表示二表示三 代碼示例判定一個數字是奇數還是偶數判定一個數字是正數還是負數判定某一年份是否是閏年 注意要點懸垂 else 問題代碼風格問題分號問題 二、switch 語句基本語法代碼示例根據 day 的值輸出星期 注意事項break 不要…

深入了解 Pandas:對象的缺少值

目錄 前言 第一點&#xff1a;導入模塊 第二點 &#xff1a;發現對象的缺失值 第二點&#xff1a;剔除缺少值 第三點&#xff1a;填補缺失值 總結 前言 在數據處理中&#xff0c;經常會遇到數據中存在缺失值的情況。處理缺失值是數據清洗的一個重要環節&#xff0c;能夠確…

spring常用知識點

1、攔截器和過濾器區別 1. 原理不同&#xff1a; 攔截器是基于java的反射機制&#xff0c;而過濾器采用責任鏈模式是基于函數回調的。 2. 使用范圍不同&#xff1a; 過濾器Filter的使用依賴于Tomcat等容器&#xff0c;導致它只能在web程序中使用 攔截器是一個Sping組件&am…

abs(-2147483648) == 2147483648?

從數學意義上&#xff0c;這是對的。但是&#xff0c;就怕但是。 #include int main() {long long v;v abs(-2147483648);printf("%lld\n", v);return 0; } 輸出: -2147483648 我們從source code中一一解開. /* Return the absolute value of I. */ int abs (…

Mongodb介紹及springboot集成增刪改查

文章目錄 1. MongoDB相關概念1.1 業務應用場景1.2 MongoDB簡介1.3 體系結構1.4 數據模型1.5 MongoDB的特點 2. docker安裝mongodb3. springboot集成3.1 文件結構3.2 增刪改查3.2.1 增加insert3.2.2 保存save3.2.3 更新update3.2.4 查詢3.2.5 刪除 1. MongoDB相關概念 1.1 業務…

Docker-Android安卓模擬器本地部署并實現遠程開發測試

文章目錄 1. 虛擬化環境檢查2. Android 模擬器部署3. Ubuntu安裝Cpolar4. 配置公網地址5. 遠程訪問小結 6. 固定Cpolar公網地址7. 固定地址訪問 本文主要介紹如何在Ubuntu系統使用Docker部署docker-android安卓模擬器&#xff0c;并結合cpolar內網穿透工具實現公網遠程訪問本地…

51建模網AR虛擬試用,讓網購不再只靠想象!

在數字化的浪潮中&#xff0c;網購已成為現代人生活的一部分。然而&#xff0c;傳統的網購模式常常因為無法直接試穿、試用商品&#xff0c;導致買家在收到商品后感到失望&#xff0c;特別是面對大件家居產品時&#xff0c;僅憑屏幕上的圖片和尺寸描述&#xff0c;很難準確地把…

智能AI愈發強大,企業如何防范AI網絡釣魚攻擊

隨著AI技術的快速發展&#xff0c;如ChatGPT等智能化工具在各個領域得到了廣泛應用。然而&#xff0c;這些工具的普及也給網絡安全帶來了新的挑戰。AI模型的自然語言生成功能使得網絡釣魚攻擊更加智能化和隱蔽化&#xff0c;攻擊者能夠利用AI技術生成高度逼真的欺騙性郵件和其他…

深度學習之基于YoloV5人體姿態摔倒識別分析報警系統

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 隨著人口老齡化的加劇和人們對健康安全的日益關注&#xff0c;摔倒事件在老年人、幼兒、體育運…