【Linux】進程信號及相關函數/系統調用的簡單認識與使用

文章目錄

  • 前言
  • 一、相關函數/系統調用
    • 1. signal
    • 2. kill
    • 3. abort (庫函數)
    • 4. raise (庫函數)
    • 5. alarm


前言

現實生活中, 存在著諸多信號, 比如紅綠燈, 上下課鈴聲…我們在接收到信號時, 就會做出相應的動作. 對于進程也是如此的, 進程也會收到來自 OS 發出的信號, 根據信號的不同也會做出不同的動作, 進程在收到信號時也并不一定會立即執行, 也可以在適當的時候在執行該信號對應的動作, 一般信號常見處理方式有如下三種:

  1. 忽略此信號.
  2. 執行該信號的默認處理動作.
  3. 提供一個信號處理函數, 要求內核在處理該信號時切換到用戶態執行這個處理函數, 這種方式稱為捕捉一個信號.

而在進程中用以保存信號的容器可以是一個位圖, 通過 0, 1 來表示是否收到某信號.

在 Linux 中, 可以通過指令:

kill -l

來查看系統定義的信號列表:
在這里插入圖片描述
通過指令:

man 7 signal

可以查看關于信號的詳細說明:
在這里插入圖片描述

在 Linux 中可以通過指令:

kill -信號編號 進程pid

來對指定進程發送指定信號.

一、相關函數/系統調用

1. signal

頭文件: #include <signal.h>

函數聲明: sighandler_t signal(int signum, sighandler_t handler);

  • signum: 被設置的信號編號.
  • handler: 被設置的信號的新的處理函數, 是一個回調函數, 通過用戶傳遞.
  • sighandler_t: 是一個函數指針, 可以指向一個返回值為 void, 參數為 int 的函數, 以下是系統中的 typedef:
    typedef void (*sighandler_t)(int);

功能: 將指定的信號的處理函數覆蓋為 handler.

示例代碼:

#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;void sighandler(int signo)
{cout << "void sighandler(int signo): " << signo << endl;
}int main()
{signal(2, sighandler);while(1){cout << "Hello" << endl;sleep(1);}return 0;
}

運行結果:
在這里插入圖片描述
實際 Ctrl + C 就是編號為 2 的信號, 平常通過 Ctrl + C 向進程發送 SIGINT(2) 號信號, 可以終止進程, 但是把信號 2 的處理函數換成了自定義的, 所以在終端按下 Ctrl + C 時執行我們自定義的函數.

PS: 9, 18, 19 號信號即時被重定向了新的處理函數也沒用, 該信號仍然會執行原本的處理函數.

2. kill

頭文件:
#include <sys/types.h>
#include <signal.h>

函數聲明: int kill(pid_t pid, int sig);

  • pid: 目標進程pid.
  • sig: 向目標發送的信號編號.

功能: 向指定進程發送指定信號.

示例代碼:

#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
using namespace std;int main()
{for(int i = 0; i < 10; ++i){if(i == 5){kill(getpid(), 9);}cout << i << ":Hello" << endl;sleep(1);}return 0;
}

運行結果:
在這里插入圖片描述
在輸出 5 條語句后, 向自己發送 9 號信號, 直接終止自己了.

3. abort (庫函數)

頭文件: #include <stdlib.h>

函數聲明: void abort(void);

功能: 向調用進程發送終止信號.

示例代碼:

#include <iostream>
#include <cstdlib>
#include <unistd.h>
using namespace std;int main()
{for(int i = 0; i < 10; ++i){if(i == 5){abort();}cout << i << ":Hello" << endl;sleep(1);}return 0;
}

運行結果:
在這里插入圖片描述

4. raise (庫函數)

頭文件: #include <signal.h>

函數聲明: int raise(int sig);

  • 返回值: 成功調用返回 0, 失敗返回非零整數.
  • sig: 信號編號.

功能: 向調用進程發送指定信號.

示例代碼:

#include <iostream>
#include <csignal>
#include <unistd.h>
using namespace std;int main()
{for(int i = 0; i < 10; ++i){if(i == 5){raise(9);}cout << i << ":Hello" << endl;sleep(1);}return 0;
}

運行結果:
在這里插入圖片描述

5. alarm

頭文件: #include <unistd.h>

函數聲明: unsigned int alarm(unsigned int seconds);

  • 返回值: 返回一個無符號整數, 表示前一個鬧鐘剩于的秒數, 打個比方, 鬧鐘設置為 30s 后響, 但是在 20s 的時候就收到了 SIGALRM(14) 信號, 此時鬧鐘會提前響, 返回值就為 30 - 20 = 10.
  • seconds: 多少秒后響鈴.

功能: 在過了 seconds 秒以后終止調用進程.

示例代碼:

#include <iostream>
#include <unistd.h>
using namespace std;int main()
{alarm(1);for(int i = 0; ; i++){cout << i << ":Hello" << endl;}return 0;
}

運行結果:
在這里插入圖片描述
可以看到, 在 1 秒鐘后鬧鐘響了, 進程也就被終止了.

接下來通過另一段代碼查看返回值:

#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;void sighandler(int signo)
{cout << "void sighandler(int signo): " << signo << endl;int n = alarm(10);cout << "n: " << n << endl;
}int main()
{cout << "pid:" << getpid() << endl;signal(SIGALRM, sighandler);alarm(10);while(1);return 0;
}

運行結果:
在這里插入圖片描述
可以看到, 在鬧鐘設定后, 以我最快的速度給調用鬧鐘的進程發送 14 號信號之后, 返回的剩于秒數為 8s, 也就是說鬧鐘只跑了 2s, 而后又設置了一個 10s 后響的鬧鐘, 這次沒有提前發送 14 號信號, 它正常跑完, 返回的剩于秒數為 0s, 合理.

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

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

相關文章

【ARM 嵌入式 C 入門及漸進 6.1 -- ARMv8 C 內嵌匯編寫系統寄存器的函數實現】

請閱讀【嵌入式開發學習必備專欄】 文章目錄 ARMv8 C 內嵌匯編寫系統寄存器 ARMv8 C 內嵌匯編寫系統寄存器 在ARMv8架構下&#xff0c;使用C語言結合內嵌匯編實現將一個值寫入特定系統寄存器的函數可以按照下面的方法進行。 下面這個示例展示了如何將一個uint64_t類型的值寫入…

[OpenGL] 法線貼圖

目錄 一 為什么要使用法線貼圖 二 二種不同法線方式的使用 2.1 插值法線 2.1 法線貼圖 本章節源碼 點擊此處 一 為什么要使用法線貼圖 法線貼圖我們可以使用更少的頂點表現出同樣豐富的細節。高精度網格和使用法線貼圖的低精度網格幾乎區分不出來。所以法線貼圖不僅看起來…

UE5中搭建一個簡單的海島

本文將用UE的WaterSystem與地形搭建一個簡單的海島&#xff0c;通過WaterSystem的參數設置&#xff0c;可以更好的自定義海岸線等效果。 1.基礎風貌 1.1.首先新建一個Basic基礎場景&#xff0c;切換到地形編輯模式刷出一塊高地&#xff0c;用于沙灘。 1.2.引入UE官方插件Wat…

[IMX6ULL驅動開發]-Linux對中斷的處理(一)

目錄 中斷概念的引入 ARM架構中斷的流程 異常向量表 Linux系統對中斷的處理 ARM對程序和中斷的處理 Linux進程中斷處理 中斷概念的引入 如何理解中斷&#xff0c;我們可以進行如下抽象。把CPU看做一個母親&#xff0c;當它正在執行任務的時候&#xff0c;可以看為是一個母…

【BSP開發經驗】簡易文件系統digicapfs實現方式

文章目錄 背景Linux vfs框架介紹數據結構系統調用openwriteread 總體框架 Linux 磁盤高速緩存機制標準文件訪問同步文件訪問異步文件訪問buffer_head 如何實現一個簡單的文件系統blkdevfs注冊文件系統產生一個文件讓文件變得可讀可寫 背景 在新的分區升級啟動方案中需要分別實…

OGG幾何內核-BRepBuilderAPI_MakeEdge學習

OGG幾何內核fork自OCCT 7.7.0&#xff0c; BRepBuilderAPI_MakeEdge是幾何內核的一個重要和基礎的功能&#xff0c;也十分復雜&#xff0c;因為要支持line、circle、ellipse&#xff0c;parabola&#xff0c;hyperbola&#xff0c;circle&#xff0c;beziercurve&#xff0c;b…

springboot常用的注解

啟動注解(Spring Boot 應用的入口注解)@SpringBootApplication @SpringBootApplication 是一個注解,它是 Spring Boot 應用的入口注解,用于表示一個應用程序的主類。這個注解通常被放置在包含 main() 方法的類上。@SpringBootApplication 是一個組合注解,整合了以下三個注…

亞馬遜測評還能做嗎?

只能說測評不是唯一的手段&#xff0c;但是推銷量的一把好手。首先測評能讓listing快速成長&#xff0c;短期內有望成為爆款&#xff0c;速度快&#xff0c;利潤高&#xff0c;回款快。相對其他推廣&#xff0c;測評無疑是有效&#xff0c;省培養listing的方法。其次新品前期太…

設計模式六大原則

開閉原則&#xff1a;對修改封閉&#xff0c;對拓展開放。 單一職責原則&#xff1a;類的功能要專一。 里氏代換原則&#xff1a;子類繼承父類的時候&#xff0c;除添加新的方法完成新增功能外&#xff0c;盡量不要重寫父類方法。 依賴倒轉原則&#xff1a;類要依賴接口&…

Hsql每日一題 | day01

前言 就一直向前走吧&#xff0c;沿途的花終將綻放~ 題目&#xff1a;找出連續活躍3天及以上的用戶 create table t_useractive(uid string,dt string );insert into t_useractive values(A,2023-10-01),(A,2023-10-02),(A,2023-10-03),(A,2023-10-04),(B,2023-10-01),(B…

代碼隨想錄打卡第38天:動態規劃解決編輯距離和回文串

1.72編輯距離 1.問題描述 找到其中需要進行操作的最少次數。 2.問題轉換 大體思路可以參照前面的兩個字符串的刪除操作。添加操作可以將其看做是一個另類的刪除操作&#xff0c;所以最后全部都可以看做是一個刪除操作 3.解題思路 每一個位置的word1[i]和word2[j]都有兩種…

RTOS原理和應用總結

RTOS的作用 RTOS一般應用在中低端處理器當中&#xff0c;這里舉一個筆者日常開發遇到的案例來說明RTOS的作用。 假設你有一個設備&#xff0c;這個設備的外圍硬件很多&#xff0c;假設有LED、一個網口、若干RS232等等。 在沒有RTOS的時候&#xff0c;我們用裸機編程來寫&…

HTML5 多媒體應用技術

目錄 多媒體元素 audio元素video元素多媒體事件與JavaScript交互音頻和視頻軌道(Track)媒體API MediaElement APIMediaSource Extensions (MSE)Encrypted Media Extensions (EME)Web Audio API

數據庫同步軟件,天不生PanguSync萬古如長夜

在信息時代的海洋中&#xff0c;數據是那永不熄滅的燈塔&#xff0c;照亮了科技發展的航道。然而&#xff0c;隨著數據的膨脹和應用場景的多樣化&#xff0c;如何確保這些寶貴資源在不同平臺、不同設備間實時更新、保持一致性&#xff0c;便成了一道亟待解決的難題。于是&#…

Android File Transfer for mac(強大的安卓文件傳輸工具) 直裝版

Android File Transfer是一款專門為Mac用戶設計的軟件&#xff0c;它用于在Android設備與Mac之間傳輸文件。這款軟件提供了簡單直觀的操作界面&#xff0c;使用戶能夠輕松地在Android設備和Mac之間傳輸和管理文件。 下載地址&#xff1a;https://www.macz.com/mac/7099.html?i…

使用python實現socket進行消息傳輸-demo

Socket 是什么 Socket 是一種在計算機網絡中用于實現進程間通信的一種機制。它是網絡編程中的重要概念&#xff0c;通過它可以在不同的計算機之間進行數據傳輸和通信。Socket 可以用于實現各種網絡應用&#xff0c;包括客戶端-服務器模型、P2P 應用等。基本上&#xff0c;Sock…

自動駕駛決策規劃算法——二次規劃

自動駕駛決策規劃算法第二章第二節(中) 參考線算法_嗶哩嗶哩_bilibili 動態規劃開辟的凸空間如下&#xff0c;兩條橙色線之間&#xff1a; 黃色的點就意味著L的上下界&#xff0c;物理意義是當軌跡ss1時&#xff0c;L的范圍應該是(Lmin1,Lmax1)之間&#xff0c;這個范圍就是開辟…

學習日記.1

今天就是配置了droidbot的環境。主要的知識來源是GitHub - xieincz/droidbot: A lightweight test input generator for Android. Similar to Monkey, but with more intelligence and cool features! 看readme&#xff0c;注意只需要platform就好&#xff0c;sdk太大不用下載…

《Ai企業知識庫》-模型實踐-rasa開源學習框架-基礎理論-02

rasa官網 Conversational AI Platform | Superior Customer Experiences Start Here rasa簡介&#xff1a; Rasa是一個開源的機器學習框架&#xff0c;專門用于構建自動化的文本和語音對話系統&#xff0c;即聊天機器人。它允許開發者和企業創建定制化的對話體驗&#xff0c…

ubuntu設置root開機登錄,允許root用戶ssh遠程登錄

ubuntu與centos系統不同&#xff0c;默認root開機不能登錄。 1、輸入一下命令創建root密碼&#xff0c;根據提示輸入新密碼 sudo passwd root 2、打開gdm-autologin文件&#xff0c;將auth required pam_succeed_if.so user ! root quiet_success這行注釋掉&#xff0c;這行就…