日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux系统编程(四)信号

發布時間:2023/11/30 linux 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统编程(四)信号 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Linux系統編程(四)信號

  • 一、什么是信號?
    • 1、信號的本質
    • 2、信號來源
      • 硬件來源
      • 軟件來源
  • 二、常見信號
    • 1.可靠信號和不可靠信號
    • 2、不可靠信號主要有以下問題:
    • 3、可靠信號與不可靠信號注冊機制
  • 三、信號處理方式
  • 四、信號處理過程
  • 五、未決信號和阻塞信號
  • 六、信號集操作函數

一、什么是信號?

1、信號的本質

信號在linux中又稱為軟中斷信號,用來通知進程發生了異步事件。進程收到信號必須停止,直到處理完信號后再執行下一條指令。

2、信號來源

硬件來源

終端按鍵產生信號 ,如(Ctrl + c ,Ctrl + z ,Ctrl+\)
硬件異常產生信號, 如(除0操作,非法訪問內存(段錯誤),總線錯誤)

軟件來源

kill命令以及進程之間可以互相通過系統調用kill發送軟中斷信號

二、常見信號

1.可靠信號和不可靠信號

Linux信號的編號是從1-64,其中32和33空缺,沒有對應的信號。通過kill -l 可查看所有的信號

其中

- 1~31之間的信號叫做非實時信號, 不支持排隊, 信號可能會丟失, 也叫做不可靠信號。
- 34~64之間的信號叫做實時信號, 支持排隊, 信號不會丟失, 也叫做可靠信號。

2、不可靠信號主要有以下問題:

  • 存在信號丟失的問題(進程收到的信號不作排隊處理,相同的信號多次到來會合并為一個)。

3、可靠信號與不可靠信號注冊機制

可靠信號注冊機制:
內核每收到一個可靠信號都會去注冊這個信號,在信號的未決信號鏈中分配sigqueue結構,因此,不會存在信號丟失的問題。

不可靠信號的注冊機制:
而對于不可靠的信號,如果內核已經注冊了這個信號,那么便不會再去注冊,對于進程來說,便不會知道本次信號的發生。

三、信號處理方式

1.默認動作,默認動作包括:

  • Term:終止進程
  • Ign: 忽略信號 (默認即時對該種信號忽略操作)
  • Core:終止進程,生成Core文件。(查驗進程死亡原因, 用于gdb調試)
  • Stop:停止(暫停)進程
  • Cont:繼續運行進程
  • 2.忽略某個信號,不做任何處理
    3.捕捉信號處理

    四、信號處理過程

    五、未決信號和阻塞信號

    信號的“未決”是一種狀態,是信號產生和遞送之間的一種狀態。信號產生,未決信號集中描述改信號的位會立即變為1,信號處于未決狀態。當信號被處理,對應位會變為0;如果信號被阻塞,那么信號的未決狀態將保持在1,信號也就無法執行。

    六、信號集操作函數

    #include <signal.h>
    sigset_t set; // typedef unsigned long sigset_t;
    int sigemptyset(sigset_t *set);
    int sigfillset(sigset_t *set);
    int sigaddset(sigset_t *set, int signum);
    int sigdelset(sigset_t *set, int signum);
    int sigismember(const sigset_t *set, int signum);
    函數sigemptyset初始化set所指向的信號集,使其中所有信號的對應bit清零,表示該信號集不包含任何有效信號。函數sigfillset初始化set所指向的信號集,使其中所有信號的對應bit置位,表示該信號集的有效信號包括系統支持的所有信號。注意,在使用sigset_t類型的變量之前,一定要調用sigemptyset或sigfillset做初始化,使信號集處于確定的狀態。初始化sigset_t變量之后就可以在調用sigaddset和sigdelset在該信號集中添加或刪除某種有效信號。這四個函數都是成功返回0,出錯返回-1。sigismember是一個布爾函數,用于判斷一個信號集的有效信號中是否包含某種信號,若包含則返回1,不包含則返回0,出錯返回-1。

    #include <cstdio> #include <signal.h> #include <unistd.h> #include <stdlib.h>void printped(sigset_t* set) {for (int i = 0; i < 32; i++){if (sigismember(set, i) == 1){printf("1");}else{printf("0");}}printf("\n");}int main() {sigset_t myset,oldset,set;sigemptyset(&myset);sigaddset(&myset, SIGQUIT);sigprocmask(SIG_BLOCK,&myset,&oldset);int ret;while(1){sleep(1);ret = sigpending(&set);if (ret == -1){perror("sigpending error:");exit(1);}printped(&set);}return 0; }

    總結

    以上是生活随笔為你收集整理的Linux系统编程(四)信号的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。