C語言中信號函數(signal)的使用

先來簡單談談C語言中的信號(signal)

首先,signal是C語言庫中的函數,它實際上是軟中斷,也就是軟件發出的終端,本質來說,類似于int n

對于接收到該軟中斷信號的進程,就會停下手頭的工作,轉而去執行信號處理程序 signal handler

對于這一點,是與硬件中斷的方式類似的。與硬件中斷類比學習會更容易!

因此,我們需要知道的是

  • 有哪些可用的軟中斷:就像硬件的除法零中斷、溢出中斷、外設中斷…
  • 軟中斷處理程序有哪些:就像中斷服務程序(位置信息在idt、ivt)
    • 默認的軟中斷服務程序:系統啟動的時候就初始化默認的中斷服務程序
    • 用戶自定義軟中斷服務程序:操作系統可自定義中斷服務程序

以及需要明白

  • 中斷何時被觸發(觸發條件)
  • 誰發出的中斷
  • 誰接收的中斷

以上,都是抽象層次的理解,我們縷一縷過程

  1. 進程x執行
  2. 進程x觸發中斷 --> 發出軟中斷
  3. 進程y接收到中斷,進程x該干啥干啥
  4. 進程y停止當前的任務,轉而執行中斷服務程序
  5. 執行完成,進程y繼續執行自己的程序

至于進程x和y,可以的

  • 同一進程
  • 兩個進程
    • 父進程與子進程
    • 至于兩個獨立進程,先暫時不管,想做到這點至少得讓二者能夠通信

好,整體框架梳理好了,我們慢慢說。

有哪些信號

All signals in c/c++

上面的參考鏈接給出了所有的信號,現在我們簡單舉例說明。

SignalValueDescription
SIGCHLD17Child status has changed (POSIX). Signal sent to parent process whenever one of its child processes terminates or stops.See the YoLinux.com Fork, exec, wait, waitpid tutorial
SIGCHLD信號:父進程子進程

請看我的另一篇文章:信號量SIGCHLD的使用,如何讓父進程得知子進程執行結束,如何讓父進程區分多個子進程的結束

信號處理函數

參考:
[1] Signals in C language
[2] How to use signal handlers in C language?

信號處理函數有兩類

  • 系統自帶的處理函數
  • 用戶自定義函數

與底層硬件中斷是類似的,中斷向量表是自帶的,也允許用戶自定義。

關于中斷的默認處理以及自定義處理,鏈接也有了。

誰發出?誰接收?

  • 發出者:操作系統,或者某進程
  • 接收者:某進程

至于細節,取決于你使用了哪個信號。每個信號的發出和接收動作和對象,以及默認的處理函數,都是規定好了的。

如何執行?

這個不再提了…就那么幾個套路,很容易。

需要特別說明的是,如果進程1接收其他進程的信號X,在進程1執行信號x處理函數之前,如果多個信號x都發給了進程1,那么,這些信號可能被合并,進程1只執行1次信號處理函數。這可能的原因很多,比如操作系統很忙…


下面這篇參考鏈接我還沒有處理:

Handling multiple SIGCHLD

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

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

相關文章

UNIX哲學

參考: 對比Linux與Windows 使用Linux想要做某些事情的時候,就拆開想,想想我需要哪些功能,需要哪些工具,依次怎么執行,然后用管道建立連接,讓數據依次流過不同的工具,從而得到最終結果…

fork創建多個子進程

references: [1] how to create two processes from a single Parent [2] fork() in C [3] linux中fork同時創建多個子進程的方法 fork的本質,就是復制,把當前進程復制一份,然后兩個進程并發地執行fork后面的語句,區別就是&#x…

wait系統調用

reference:Wait System Call in C 只強調幾點,剩下的直接看參考鏈接內容就好了,不是偷懶,而是里面內容寫的很好了,沒必要再寫一遍了,這種東西就是單純的系統調用而已,理解了功能,就完事了&#…

Linux進程間通信:共享內存與管道

references: [1] IPC through shared memory [2] Inter Process Communication (IPC) [3] https://www.geeksforgeeks.org/pipe-system-call/ [4] watch command in Linux with Examples 參考鏈接1和2是介紹了共享內存IPC的簡單原理和相關系統調用的使用參考鏈接3是介紹了管道通…

find command基本使用

find命令通常用于根據文件名查找文件,這是最基本用法。 find [path] -name/-iname [filename] path寫要查找的路徑,自動遞歸查找filename寫文件名,可以使用通配符*還有其他什么的表達式 具體細節請man find查閱文檔。

正則表達式特別需要注意的點:“空“字符的匹配

在正則表達式中,[...]代表1個字符,不管里面有多少字符,最終這個東西的結果都是1個字符。 對于表達式[^a]表達的匹配除了a之外的字符,并且是1個字符。 需要注意的是,有些特殊字符是不會被匹配的。 我們看一個示例&am…

vim多列操作--插入/刪除

插入 How to insert text at beginning of a multi-line selection in vi/VimVim Commands 刪除 ctrl v使用上下左右鍵選中一片區域按d刪除

vim進行行內某部分的復制剪切粘貼

ctrl v使用方向鍵選中你要復制的部分 按d(剪切)或者按y(復制)再移動到你的目標位置,按p粘貼(在正常模式下才行,如果不是,先按esc) 這個過程與你操作word文檔的復制粘貼…

函數調用堆棧

基于孟寧老師的Linux內核分析 1 int g(int x){ 2 int y x 3;3 return y;4 }5 6 int f(int x){7 int z x 10;8 return g(z);9 }10 11 int main(){12 int a f(8) 1;13 return 0;14…

gdb調試的幾點提示(1)

GDB debugger Examining Memory Continuing and Stepping How to translate a virtual memory address to a physical address? s和n是C語言的下一步 si和ni是匯編語言下一步 gdb能夠查看的都是虛擬地址,不能查看物理地址,應用程序都不能查看物理地址…

C語言讀取文件

C語言一次性讀取文件 C - File I/O C library function - fread() 需要注意的點 fgets函數,一次只能讀取一行,并且在結尾自動添加\0fread函數,可以讀取很多內容,但是不會添加\0需要手動完成,具體看[參考1]

Vivado提高綜合和實現的速度

讓計算機的資源盡可能給vivado,綜合、實現的時候修改一個參數 jobs改為你的計算機的最大值,我的計算機是12核的。 速度會快很多!

安裝Ubuntu RISC V toolchain失敗(網速、git配置原因)

git獲取大容量工程出錯:RPC failed; curl GnuTLS recv error : Decryption has failed. error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.fatal: The remote end 官方GitHub倉庫 gitee鏡像倉庫 如果網速不夠&#xff0…

Linux環境變量 set env export區別

參考鏈接 How to Set Environment Variables in Linux set 他能夠顯示當前shell的環境變量 它針對的對象是當前shell,如果關閉了就沒了! 直接使用set --help查看就可以。 env 顯示當前用戶的環境變量,針對的當前登錄的用戶 export 它能…

VirtualBox Ubuntu個人配置

注意這里VT-x啟用,除了在BIOS啟用CPU虛擬化,還得在命令行設置一次才可以勾選。 F:\>cd F:\VirtualBox # 進入VirtualBox安裝目錄F:\VirtualBox>VBoxManage.exe list vms # 查找所有虛擬機 "rhel64" {240f96d8-6535-431d-892e-b70f3dc4…

Ubuntu停止維護版本的軟件源配置和系統升級方法

這里以Ubuntu 20.10版本為例(當前是2022.2.14,該版本已經停止維護),我們現在需要正常使用該版本,并且期待升級到21.10版本,我們需要 配置正確是軟件源升級該版本 配置正確的軟件源 配置國內鏡像源 我們…

優質學習內容(自用)

Verilog Verilog教程HDLBits — Verilog Practice中科大Verilog OJVerilog語法和典型電路verilog中if與case語句不完整產生鎖存器的問題 Chisel chisel offcial website playground OpenXiangShan Chisel playgroundchisel IntelliJ IDEA playground library Maven libr…

diff and colordiff on Ubuntu

在Ubuntu中使用diff來對比文件差異,但是不是很好用,尤其是著色方面,用起來很麻煩,因此可以安裝colordiff。 我們有兩個文件file1和file2,使用命令 colordiff file1 file2 -y -B -W 140就可以對比文件差異&#xff0c…

基于IntelliJ IDEA和Ubuntu的Chisel開發環境搭建

注意!本教程不是詳細解說!只說思路,其余請自己查閱!不適合小白用戶。 環境 Ubuntu 20.04 LTSIntelliJ IDEA 過程 在Ubuntu下安裝IDEA,具體版本號的使用,請自行查閱官網安裝IDEA插件,EasySoc…

verilator編譯 更新文件的規則

本文請讀者【直接關閉】,我后面的實踐結果似乎和本文的實踐結果不一樣,真是見鬼了!我不知道發生了什么,還沒有來得及進一步校驗! 在其他文件不變的前提下,如果即將生成的mk文件和已有的mk文件不一樣&#…