衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux操作系統(tǒng)編程講解:信號(hào)捕捉

如意 ? 來源:良許Linux ? 作者:良許 ? 2020-10-19 15:10 ? 次閱讀

前面我們學(xué)習(xí)了信號(hào)產(chǎn)生的幾種方式,而對(duì)于信號(hào)的處理有如下幾種方式:

默認(rèn)處理方式;

忽略;

捕捉。

信號(hào)的捕捉,說白了就是抓到一個(gè)信號(hào)后,執(zhí)行我們指定的函數(shù),或者執(zhí)行我們指定的動(dòng)作。下面詳細(xì)介紹兩個(gè)信號(hào)捕捉操作參數(shù):signal和sigaction。

##signal函數(shù)

函數(shù)原型:

sighandler_t signal(int signum, sighandler_t handler);

其中,sighandler定義是這樣的:typedef void (*sighandler_t)(int);

函數(shù)作用:注冊(cè)一個(gè)信號(hào)捕捉函數(shù),也就是說,收到了某個(gè)信號(hào),就執(zhí)行它所注冊(cè)的回調(diào)函數(shù)。

函數(shù)參數(shù):

signum:信號(hào)編號(hào),盡量用宏來寫,而別用數(shù)字,這樣更適合跨平臺(tái);

handler:注冊(cè)的回調(diào)函數(shù);

函數(shù)缺陷:

由于歷史原因,該函數(shù)在不同版本的Unix和Linux系統(tǒng)中可能起到的效果不一樣,所以跨平臺(tái)性不佳,盡量避免使用它,取而代之使用通用性更好的sigaction函數(shù)。

Linux操作系統(tǒng)編程講解:信號(hào)捕捉

##sigaction函數(shù)

函數(shù)原型:

int sigaction(int signum, const struct sigaction act, struct sigaction oldact);

函數(shù)作用:與signal函數(shù)類似,用來注冊(cè)一個(gè)信號(hào)捕捉函數(shù);

返回值:

成功:0;失敗:-1,并設(shè)置errno;

參數(shù):

signum:信號(hào)編號(hào),盡量用宏來寫,而別用數(shù)字,這樣更適合跨平臺(tái);

act:傳入?yún)?shù),新的信號(hào)捕捉方式;

oldact:傳出參數(shù),舊的信號(hào)捕捉方式

這里特別要注意參數(shù)中struct sigaction結(jié)構(gòu)體,這也是這個(gè)函數(shù)的難點(diǎn)所在,下面詳細(xì)說明:

struct sigaction結(jié)構(gòu)體

原型:

Linux操作系統(tǒng)編程講解:信號(hào)捕捉

這個(gè)結(jié)構(gòu)體成員很多,又很多是回調(diào)函數(shù)的形式,令人望而生畏。但實(shí)際上,需要掌握的只有三個(gè)。

首先,sa_restorer和sa_sigaction這兩個(gè)成員一個(gè)已經(jīng)被棄用了,另一個(gè)很少使用,所以我們暫且不管它們,重點(diǎn)掌握剩下的三個(gè)。

(1) sa_handler:指定信號(hào)捕捉后的處理函數(shù),即注冊(cè)回調(diào)函數(shù)。該成員也可以賦值為SIG_IGN,表示忽略該信號(hào),也可注冊(cè)為SIG_DFL,表示執(zhí)行信號(hào)的默認(rèn)動(dòng)作。

(2) sa_mask:臨時(shí)阻塞信號(hào)集(或信號(hào)屏蔽字)先來看這樣一個(gè)情景:

某個(gè)信號(hào)已經(jīng)注冊(cè)了回調(diào)函數(shù),當(dāng)內(nèi)核傳遞這個(gè)信號(hào)過來時(shí),會(huì)先經(jīng)過一個(gè)阻塞信號(hào)集,先阻塞掉部分信號(hào)。再去執(zhí)行對(duì)應(yīng)的回調(diào)函數(shù)。如下圖示:

Linux操作系統(tǒng)編程講解:信號(hào)捕捉

假如說,這個(gè)回調(diào)函數(shù)回調(diào)執(zhí)行的時(shí)間比較長(zhǎng),比如2秒,在這2秒里,又有其它的信號(hào)過來,那進(jìn)程是暫停當(dāng)前回調(diào)函數(shù),去響應(yīng)新的信號(hào),還是不管新來的信號(hào),先把當(dāng)前回調(diào)函數(shù)處理完再說?

正確的做法是,在執(zhí)行回調(diào)函數(shù)期間,使用sa_mask臨時(shí)的去替代進(jìn)程的阻塞信號(hào)集,保證回調(diào)函數(shù)安心的執(zhí)行完畢,再解除替代。注意:這個(gè)過程僅僅發(fā)生在回調(diào)函數(shù)執(zhí)行期間,是臨時(shí)性的設(shè)置。

(3) sa_flags:通常設(shè)置為0,表示使用默認(rèn)屬性。

再來看另外一個(gè)場(chǎng)景:

比如進(jìn)程對(duì)SIGQUIT注冊(cè)了回調(diào)函數(shù),當(dāng)回調(diào)函數(shù)在執(zhí)行期間,又來了SIGQUIT函數(shù),這時(shí),進(jìn)程是響應(yīng)還是不響應(yīng)該信號(hào)?這就是sa_flags的一個(gè)作用,當(dāng)其設(shè)置為0時(shí),表示使用默認(rèn)屬性,也就是先不響應(yīng)該信號(hào),而是執(zhí)行完回調(diào)函數(shù)再處理此信號(hào)。

另外,阻塞的常規(guī)信號(hào)不支持排隊(duì),也就是說,執(zhí)行回調(diào)函數(shù)期間,再來千百個(gè)同個(gè)信號(hào)時(shí),系統(tǒng)只記錄一次。而后面的32個(gè)實(shí)時(shí)信號(hào)則支持排隊(duì)。

Linux操作系統(tǒng)編程講解:信號(hào)捕捉


責(zé)編AJX

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11345

    瀏覽量

    210394
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6892

    瀏覽量

    123744
  • 信號(hào)
    +關(guān)注

    關(guān)注

    11

    文章

    2804

    瀏覽量

    77104
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    原創(chuàng)丨Linux系統(tǒng)編程篇丨迅為IMX6ULL-對(duì)應(yīng)視頻講解

    本章內(nèi)容對(duì)應(yīng)視頻講解鏈接(在線觀看):什么是 Linux 系統(tǒng)編程呢?Linux 系統(tǒng)編程也叫 Linu
    發(fā)表于 07-30 10:39

    Linux操作系統(tǒng)安裝與使用

    嵌入式網(wǎng)絡(luò)編程+嵌入式Linux系統(tǒng)一、Linux操作系統(tǒng)安裝與使用(命令)二、Linux開發(fā)工
    發(fā)表于 11-05 08:25

    為何將Linux操作系統(tǒng)劃分為用戶和內(nèi)核

    linux_C網(wǎng)絡(luò)編程概述嵌入式網(wǎng)絡(luò)編程==嵌入式Linux_C系統(tǒng)編程(文件、進(jìn)程、進(jìn)程間通信、多線程、網(wǎng)絡(luò)、大并發(fā)網(wǎng)絡(luò)服務(wù)器、數(shù)據(jù)庫、s
    發(fā)表于 12-15 08:35

    Linux操作系統(tǒng)安裝與使用

    嵌入式網(wǎng)絡(luò)編程+嵌入式Linux系統(tǒng)Linux操作系統(tǒng)安裝與使用(命令)Linux開發(fā)工具(gc
    發(fā)表于 12-22 07:47

    Linux操作系統(tǒng)安裝與使用方法

    嵌入式網(wǎng)絡(luò)編程+嵌入式Linux系統(tǒng)Linux操作系統(tǒng)安裝與使用(命令)Linux開發(fā)工具(gc
    發(fā)表于 12-23 06:57

    什么是Linux系統(tǒng)編程

    什么是Linux系統(tǒng)編程Linux系統(tǒng)編程也叫Linux下的高級(jí)編程,是介于應(yīng)用層和驅(qū)動(dòng)層之間
    發(fā)表于 12-23 07:30

    是否可以為linux操作系統(tǒng)編譯并在基于debian的rasperry操作系統(tǒng)中運(yùn)行?

    STM32CubeProgrammer 有一個(gè) C++ API,允許創(chuàng)建使用 qt creator 編譯的程序。是否可以為 linux 操作系統(tǒng)編譯并在基于 debian 的 rasperry 操作系統(tǒng)中運(yùn)行?
    發(fā)表于 12-06 06:01

    基于Linux操作系統(tǒng)下C語言編程入門

    基于Linux操作系統(tǒng)下C語言編程入門
    發(fā)表于 10-27 15:36 ?11次下載
    基于<b class='flag-5'>Linux</b><b class='flag-5'>操作系統(tǒng)</b>下C語言<b class='flag-5'>編程</b>入門

    linux系統(tǒng)編程_中文版

    linux系統(tǒng)編程_中文版
    發(fā)表于 10-29 10:17 ?0次下載
    <b class='flag-5'>linux</b><b class='flag-5'>系統(tǒng)編程</b>_中文版

    Linux操作系統(tǒng)下C語言編程入門.pdf

    Linux操作系統(tǒng)下C語言編程入門
    發(fā)表于 05-17 10:08 ?96次下載

    Linux操作系統(tǒng)知識(shí)講解:走進(jìn)內(nèi)存

    Linux操作系統(tǒng)知識(shí)講解:走進(jìn)內(nèi)存
    的頭像 發(fā)表于 08-28 10:30 ?2405次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系統(tǒng)</b>知識(shí)<b class='flag-5'>講解</b>:走進(jìn)內(nèi)存

    Linux操作系統(tǒng)知識(shí)講解:走進(jìn)linux 內(nèi)存地址空間

    Linux操作系統(tǒng)知識(shí)講解:走進(jìn)linux 內(nèi)存地址空間
    的頭像 發(fā)表于 08-28 10:45 ?5108次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系統(tǒng)</b>知識(shí)<b class='flag-5'>講解</b>:走進(jìn)<b class='flag-5'>linux</b> 內(nèi)存地址空間

    Linux操作系統(tǒng)知識(shí)講解:走進(jìn)Linux 內(nèi)存分配算法

    Linux操作系統(tǒng)知識(shí)講解:走進(jìn)Linux 內(nèi)存分配算法
    的頭像 發(fā)表于 08-28 10:57 ?5507次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系統(tǒng)</b>知識(shí)<b class='flag-5'>講解</b>:走進(jìn)<b class='flag-5'>Linux</b> 內(nèi)存分配算法

    Linux操作系統(tǒng)知識(shí)講解:走進(jìn)Linux 內(nèi)存使用場(chǎng)景

    Linux操作系統(tǒng)知識(shí)講解:走進(jìn)Linux 內(nèi)存使用場(chǎng)景
    的頭像 發(fā)表于 08-28 11:04 ?3018次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系統(tǒng)</b>知識(shí)<b class='flag-5'>講解</b>:走進(jìn)<b class='flag-5'>Linux</b> 內(nèi)存使用場(chǎng)景

    為什么我們要掌握Linux系統(tǒng)編程

    為什么我們要掌握Linux系統(tǒng)編程
    的頭像 發(fā)表于 05-17 10:00 ?910次閱讀
    百家乐官网下注稳赢法| 威尼斯人娱乐城信誉lm0| 八大胜百家乐现金网| 阴宅24水口| 盐城百家乐官网的玩法技巧和规则 | 百家乐博牌规例| 百家乐路单| 大发888认识的见解| 大发888-娱乐平台| 丽江市| 百家乐官网太阳城小郭| 太阳城百家乐168| 博彩百家乐字谜总汇二丹东| 大发888娱乐场存款| 达日县| 伯爵百家乐官网赌场娱乐网规则| 百家乐视频下载| 威尼斯人娱乐城简介| 真钱赌博| 百家乐官网评测| 百家乐客户端软件| 百家乐电子作弊器| 水果机游戏机| 必发娱乐| 专业百家乐官网软件| 玩百家乐有何技巧| 大发888在线网址| 职业赌百家乐官网技巧| 澳门百家乐官网长赢打| 博之道百家乐技巧| 喜来登百家乐的玩法技巧和规则| 蒙特卡罗国际网址| 发中发百家乐官网的玩法技巧和规则| 百家乐是娱乐场| 百家乐官网网上投注网站| 百家乐赌具哪里最好| 大发888客服电话多少| 百家乐官网怎么看单| 百家乐在线投注顺势法| 百家乐平注常赢玩法技巧| 百家乐官网为什么庄5|