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

注:信號vs信號量:兩者沒有任何關系!

信號是什么?

Linux系統提供的,讓用戶(進程)給其他進程發送異步信息的一種方式。

進程看待信號的方式:

1.信號在沒有發生的時候,進程已經知道信號發生時該如何處理。

2.進程能夠認識進程,很早之前,有人給進程中設置了識別特定信號的方式。

3.信號到來的時候,進程正在處理更重要的事情,進程暫時不能處理到來的信號,進程必須暫時要將到來的信號進行臨時保存。

4.信號到了,可以不立即處理,可以在合適的時間處理。

5.信號是隨時產生的,進程無法準確預料,所以信號是異步發送的。

為什么要有信號?

系統要求進程要有隨時響應外部信號的能力,隨后做出反應。

信號的具體知識

以這個時間軸進行學習
在這里插入圖片描述

信號的產生

常見信號

數組和名字都可以標識信號,名字其實就是宏。
使用kill命令查看信號。
在這里插入圖片描述
1-31為常用信號,右下的紅框中是實時信號。
沒有0,沒有32,33 信號,共62個信號

信號的處理的方式——signal

a. 默認動作
b. 自定義處理信號——捕捉
c. 忽略了信號——是處理了信號嗎?是的,處理方式就是忽略。
實際執行信號的處理動作稱之為信號的遞達,也就是以上三種方式。

signal函數

#include <signal.h>typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

參數說明:
signum:信號編號(如 SIGINT、SIGTERM)。
handler:信號處理函數,可以是:
SIG_DFL:恢復默認行為。
SIG_IGN:忽略信號。
自定義函數指針:用戶定義的處理函數。

返回值:(類型函數指針)
成功時返回之前的處理函數的地址。
失敗時返回 SIG_ERR。

產生信號的第一種方式:kill命令

kill -9 進程pid :發送一個信號,殺死一個進程

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
int main()
{while(true){std::cout << "I am activing...,pid:" << getpid() << std::endl;sleep(1);}return 0;
}

結果:
使用命令kill -9 1121788
在這里插入圖片描述
進程被殺死。


kill -2 進程pid :發送一個信號,默認行為是使進程自己終止。

1.默認行為——進程自己終止

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
int main()
{while(true){std::cout << "I am activing...,pid:" << getpid() << std::endl;sleep(1);}return 0;
}

結果:
在運行的進程中使用kill -2 1121490
在這里插入圖片描述
進程自己終止。

2.自定義處理信號——捕捉

例子:

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
void handler(int signo)
{std::cout << "get a sig, number is: "<< signo << std::endl;
}
int main()
{//signal調用完了,handler方法會被立即執行嗎?不會,只是設置對應信號的處理方法。//未來我們收到對應的信號才執行handler方法。//未來進程如果一直沒有收到SIGINT,handler也就永遠不會被調用。signal(SIGINT,handler);//handler(SIGINT)while(true){std::cout << "I am activing...,pid:" << getpid() << std::endl;sleep(1);}return 0;
}

結果:
在運行的進程中使用kill -2 1120892
在這里插入圖片描述
默認行為被更改成其他方法。

3.忽略信號

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
int main()
{signal(SIGINT,SIG_IGN);//ignore忽略while(true){std::cout << "I am activing...,pid:" << getpid() << std::endl;sleep(1);}return 0;
}

結果:
在運行的進程中使用kill -2 1120892
在這里插入圖片描述
進程無任何反應——這條信號被忽略。

產生信號的第二種方式:鍵盤產生信號

Ctrl + c 被操作系統解釋成2號信號
Ctrl + \ 被操作系統解釋成3號信號

產生信號的第三種方式:系統調用

kill 系統調用函數

對任意進程發送任意信號。

#include <sys/types.h>
#include <signal.h>int kill(pid_t pid, int sig);

參數說明:
pid目標進程的進程 ID,具體行為取決于其取值:
>0:發送信號給 PID 為 pid 的進程。
=0:發送信號給當前進程組內的所有進程。

sig:要發送的信號編號(如 SIGTERM、SIGKILL)。

返回值:
成功返回 0,失敗返回 -1,并設置 errno 。

例子:自定義mykill函數

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
#include<errno.h>
#include<string.h>
using namespace std;//mykill -9 pid
int main(int argc,char* argv[])
{if(argc != 3){cout << "Usage: " << argv[0] << " -signumber pid" << endl;return 1;}int signumber = stoi(argv[1]+1);int pid = stoi(argv[2]);int n = kill(pid, signumber);if(n < 0){cerr << "kill error, " << strerror(errno) << endl;}return 0;
}

raise 系統調用函數

對當前進程發送任意信號。

#include <signal.h>int raise(int sig);  // 向當前進程發送信號 sig

參數說明:
sig: 信號編號(如 SIGINT、SIGTERM)。
返回值:
成功返回 0,失敗返回非 0。

abort系統調用函數

對當前進程發送6號信號。

#include <stdlib.h>  // 必須包含的頭文件void abort(void);

**參數說明:**無(void)。
**返回值:**無返回值(void)。

產生信號的第四種方式:軟件條件

alarm函數
對當前進程等待 seconds 秒后發送14號信號。

#include <unistd.h>unsigned int alarm(unsigned int seconds);

參數說明: seconds – 定時器的時間(秒)。若為 0,表示取消之前設置的定時器。
返回值:
返回之前尚未觸發的定時器的剩余秒數。
若之前沒有定時器,返回 0。

例子: 向當前進程5秒后發送14號信號,終止進程。

int main()
{alarm(5);//響一次int cnt = 0;while(true){sleep(1);cout<< "cnt: "<< cnt++ << endl;}return 0;
}

結果: 向進程發送了14號信號,終止進程
在這里插入圖片描述
注:鬧鐘只響一次。

例: 關于alarm的返回值

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
using namespace std;int g_cnt = 0;
int ret = 0;void handler(int sig)
{std::cout << "get a sig: "<< sig <<" g_cnt: "<< g_cnt <<endl;int n = alarm(2);cout<<"剩余時間:"<< n <<endl;
}int main()
{signal( 2 ,handler);alarm(50);//響一次int cnt = 0;while(true){sleep(1);cout<< "cnt: "<< cnt++ << endl;}return 0;
}

結果: 在 cnt:3 時按下 Ctrl + C
在這里插入圖片描述
這時獲取alarm的返回值是剩余時間。

產生信號的第五種方式:異常

  1. 除0錯誤
    例子:
#include<iostream>
#include<unistd.h>int main()
{int a = 10;a = a/0;while(true) sleep(1);return 0;}

出現除0錯誤。
結果:發送8號信號(SIGFPE)
在這里插入圖片描述

  1. 野指針問題
    例子:
#include<iostream>
#include<unistd.h>int main()
{int *p = nullptr;*p = 100;//野指針while(true) sleep(1);return 0;}

結果:發送11號信號(SIGEGV)
在這里插入圖片描述

關于信號產生的各種情況的理解

信號保存在進程的PCB中,且以位圖的方式保存在PCB中。
在PCB中以 uint32_t pending 變量進行保存。在這里插入圖片描述
給進程發送信號,其實就是寫入信號。向進程PCB中寫入信號數據,PCB是內核數據結構,只有操作系統有權限寫入,若用戶想寫入,操作系統提供系統調用供用戶使用。
所以以上的信號產生的5種方式,實際上最終都是交給操作系統進行最后向進程寫入信號的操作。

對于異常問題的解釋

  1. 除0錯誤
    在這里插入圖片描述
  2. 野指針
    在這里插入圖片描述

總結

在這里插入圖片描述

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

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

相關文章

數據結構和算法——漢諾塔問題

前言 先講個故事&#xff0c;傳說古代印度有三根黃金柱&#xff0c;64個石盤&#xff0c;需要將石盤從第一根移動到第三根上&#xff0c;規定每次只能移動一片&#xff0c;并且小盤在放置時必須在大盤上。 當石盤移動完畢時&#xff0c;世界就會毀滅。 漢諾塔——遞歸 接下來…

2023年3月全國計算機等級考試真題(二級C語言)

&#x1f600; 第1題 下列敘述中錯誤的是 A. 向量是線性結構 B. 非空線性結構中只有一個結點沒有前件 C. 非空線性結構中只有一個結點沒有后件 D. 只有一個根結點和一個葉子結點的結構必定是線性結構 概念澄清 首先&#xff0c;我們需要明確幾個關鍵概念&#xf…

Kafka簡單的性能調優

Kafka 的性能調優是一個系統性工程&#xff0c;需要從生產者、消費者、Broker 配置以及集群架構等多個層面進行綜合調整。以下是一些關鍵的性能調優策略&#xff1a; 一、生產者性能優化 批量發送 batch.size&#xff1a;控制消息批量的最大字節數&#xff0c;默認值為 16KB。…

微前端 - 以無界為例

一、微前端核心概念 微前端是一種將單體前端應用拆分為多個獨立子應用的架構模式&#xff0c;每個子應用可獨立開發、部署和運行&#xff0c;具備以下特點&#xff1a; 技術棧無關性&#xff1a;允許主應用和子應用使用不同框架&#xff08;如 React Vue&#xff09;。獨立部…

企業級日志分析平臺: ELK 集群搭建指南

前言&#xff1a;在當今數字化時代&#xff0c;數據已經成為企業決策的核心驅動力。無論是日志分析、用戶行為追蹤&#xff0c;還是實時監控和異常檢測&#xff0c;高效的數據處理和可視化能力都至關重要。ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;作為全球…

1.2-WAF\CDN\OSS\反向代理\負載均衡

WAF&#xff1a;就是網站應用防火墻&#xff0c;有硬件類、軟件類、云WAF&#xff1b; 還有網站內置的WAF&#xff0c;內置的WAF就是直接嵌在代碼中的安全防護代碼 硬件類&#xff1a;Imperva、天清WAG 軟件&#xff1a;安全狗、D盾、云鎖 云&#xff1a;阿里云盾、騰訊云WA…

MybatisPlus(SpringBoot版)學習第四講:常用注解

目錄 1.TableName 1.1 問題 1.2 通過TableName解決問題 1.3 通過全局配置解決問題 2.TableId 2.1 問題 2.2 通過TableId解決問題 2.3 TableId的value屬性 2.4 TableId的type屬性 2.5 雪花算法 1.背景 2.數據庫分表 ①垂直分表 ②水平分表 1>主鍵自增 2>取…

第二屆計算機網絡和云計算國際會議(CNCC 2025)

重要信息 官網&#xff1a;www.iccncc.org 時間&#xff1a;2025年4月11-13日 地點&#xff1a;中國南昌 簡介 第二屆計算機網絡和云計算國際會議&#xff08;CNCC 2025&#xff09;將于2025年4月11-13日在中國南昌召開。圍繞“計算機網絡”與“云計算”展開研討&#xff…

【大模型基礎_毛玉仁】5.4 定位編輯法:ROME

目錄 5.4 定位編輯法&#xff1a;ROME5.4.1 知識存儲位置1&#xff09;因果跟蹤實驗2&#xff09;阻斷實驗 5.4.2 知識存儲機制5.4.3 精準知識編輯1&#xff09;確定鍵向量2&#xff09;優化值向量3&#xff09;插入知識 5.4 定位編輯法&#xff1a;ROME 定位編輯&#xff1a;…

橫掃SQL面試——連續性登錄問題

橫掃SQL面試 &#x1f4cc; 連續性登錄問題 在互聯網公司的SQL面試中&#xff0c;連續性問題堪稱“必考之王”。&#x1f4bb;&#x1f50d; 用戶連續登錄7天送優惠券&#x1f31f;&#xff0c;服務器連續報警3次觸發熔斷??&#xff0c;圖書館連續3天人流破百開啟限流?” …

Spring AI Alibaba 對話記憶使用

一、對話記憶 (ChatMemory)簡介 1、對話記憶介紹 ”大模型的對話記憶”這一概念&#xff0c;根植于人工智能與自然語言處理領域&#xff0c;特別是針對具有深度學習能力的大型語言模型而言&#xff0c;它指的是模型在與用戶進行交互式對話過程中&#xff0c;能夠追蹤、理解并利…

vdi模式是什么

?VDI模式&#xff08;Virtual Desktop Infrastructure&#xff09;是一種基于服務器的計算模型&#xff0c;其核心思想是將所有計算和存儲資源集中在服務器上&#xff0c;用戶通過前端設備&#xff08;如瘦客戶機&#xff09;訪問服務器上的虛擬桌面?? VDI模式的工作原理 在…

【分布式】深入剖析 Sentinel 限流:原理、實現

在當今分布式系統盛行的時代&#xff0c;流量的劇增給系統穩定性帶來了巨大挑戰。Sentinel 作為一款強大的流量控制組件&#xff0c;在保障系統平穩運行方面發揮著關鍵作用。本文將深入探討 Sentinel 限流的原理、實現方案以及其優缺點&#xff0c;助力開發者更好地運用這一工具…

c#winform,倒鴨子字幕效果,typemonkey字幕效果,抖音瀑布流字幕效果

不廢話 直接上效果圖 C# winform 開發抖音的瀑布流字幕。 也是typemonkey插件字幕效果 或者咱再網上常說的倒鴨子字幕效果 主要功能 1&#xff0c;軟件可以自定義添加字幕內容 2&#xff0c;軟件可以添加字幕顯示的時間區間 3&#xff0c;可以自定義字幕顏色&#xff0c;可以隨…

Pycharm(八):字符串切片

一、字符串分片介紹 對操作的對象截取其中一部分的操作&#xff0c;比如想要獲取字符串“888666qq.com前面的qq號的時候就可以用切片。 字符串、列表、元組都支持切片操作。 語法&#xff1a;字符串變量名 [起始:結束:步長] 口訣&#xff1a;切片其實很簡單&#xff0c;只顧頭來…

圖片解釋git的底層工作原理

&#xff08;圖片來源&#xff1a;自己畫的&#xff09; 基于同一個commit創建新分支 &#xff08;圖片來源&#xff1a;書籍《Linux運維之道》 ISBN 9787121461811&#xff09; 在新分支上修改然后commit一次 &#xff08;圖片來源&#xff1a;書籍《Linux運維之道》 ISBN 978…

leetcode994.腐爛的橘子

思路源自 【力扣hot100】【LeetCode 994】腐爛的橘子&#xff5c;多源BFS 這里圖中的腐爛的的橘子是同時對周圍進行腐化&#xff0c;所以采用多源bfs就能解決 多源bfs與單源bfs的區別就在于隊列取出時一輪是取出隊列當中的全部元素 class Solution {public int orangesRotti…

【華為OD技術面試真題 - 技術面】- Java面試題(15)

華為OD面試真題精選 專欄:華為OD面試真題精選 目錄: 2024華為OD面試手撕代碼真題目錄以及八股文真題目錄 介紹下TCP/UDP TCP(傳輸控制協議)和 UDP(用戶數據報協議) TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)是兩種常見的傳輸層協議,主要…

?在 Fedora 系統下備份遠程 Windows SQL Server 數據庫的完整方案

?一、環境準備與工具安裝? ?1. 安裝 Microsoft SQL Server 命令行工具? Fedora 需安裝 mssql-tools 和 ODBC 驅動&#xff1a; # 添加 Microsoft 倉庫 sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo# 安裝工具包 …

DeepSeek:巧用前沿AI技術,開啟智能未來新篇章

引言 近年來&#xff0c;人工智能&#xff08;AI&#xff09;技術迅猛發展&#xff0c;大模型成為全球科技競爭的核心賽道。在這場AI革命中&#xff0c;DeepSeek作為中國領先的大模型研發團隊&#xff0c;憑借其創新的技術架構、高效的訓練方法和廣泛的應用場景&#xff0c;迅…