自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux系統(tǒng)編程—信號(hào)集操作函數(shù)

系統(tǒng) Linux
信號(hào)從產(chǎn)生到抵達(dá)目的地,叫作信號(hào)遞達(dá)。而信號(hào)從產(chǎn)生到遞達(dá)的中間狀態(tài),叫作信號(hào)的未決狀態(tài)。

先來(lái)回顧一下未決信號(hào)集是怎么回事。

信號(hào)從產(chǎn)生到抵達(dá)目的地,叫作信號(hào)遞達(dá)。而信號(hào)從產(chǎn)生到遞達(dá)的中間狀態(tài),叫作信號(hào)的未決狀態(tài)。產(chǎn)生未決狀態(tài)的原因有可能是信號(hào)受到阻塞了,也就是信號(hào)屏蔽字(或稱阻塞信號(hào)集,mask)對(duì)應(yīng)位被置1。阻塞信號(hào)集和未決信號(hào)集均是由內(nèi)核維護(hù)的,整個(gè)過(guò)程如下圖示:

我們有時(shí)需要屏蔽某個(gè)信號(hào),就需要去修改阻塞信號(hào)集。那么,我們?cè)撊绾涡薷淖枞盘?hào)集?系統(tǒng)提供的一個(gè)方法是,我們先創(chuàng)建一個(gè)跟阻塞信號(hào)集一樣的集合,再利用它去修改阻塞信號(hào)集。

系統(tǒng)提供了一系列的信號(hào)集設(shè)定函數(shù)。這些函數(shù)如下所示:

  1. sigset_t  set; 
  2. 信號(hào)集數(shù)據(jù)類型,本質(zhì)是typedef unsigned long sigset_t;  
  3. int sigemptyset(sigset_t *set); 
  4. 將某個(gè)信號(hào)集清0 
  5. int sigfillset(sigset_t *set); 
  6. 將某個(gè)信號(hào)集置1 
  7. int sigaddset(sigset_t *set, int signum); 
  8. 將某個(gè)信號(hào)加入信號(hào)集int sigdelset(sigset_t *set, int signum); 
  9. 將某個(gè)信號(hào)清出信號(hào)集以上幾個(gè)函數(shù)返回值均是:成功:0;失?。?1 
  10. int sigismember(const sigset_t *set, int signum); 
  11. 判斷某個(gè)信號(hào)是否在信號(hào)集中返回值:在集合:1;不在:0;出錯(cuò):-1 

使用以上這些函數(shù)創(chuàng)建完信號(hào)集后,要如何去改變阻塞信號(hào)集呢?系統(tǒng)又提供了一個(gè)函數(shù):sigprocmask函數(shù)。

sigprocmask函數(shù)可以用來(lái)屏蔽信號(hào),也可以用來(lái)解除屏蔽信號(hào),其本質(zhì)就是利用我們創(chuàng)建的信號(hào)集去改變阻塞信號(hào)集。

函數(shù)原型:

  1. int sigprocmask(int how, const sigset_t set, sigset_t oldset); 

返回值:

成功:0;失?。?1,設(shè)置errno

參數(shù)解釋:

  • set:傳入?yún)?shù),是一個(gè)位圖,set中哪位置1,就表示當(dāng)前進(jìn)程屏蔽哪個(gè)信號(hào)。
  • oldset:傳出參數(shù),保存舊的信號(hào)屏蔽集。這個(gè)與setitimer有點(diǎn)相似。

how參數(shù)取值:

假設(shè)當(dāng)前的信號(hào)屏蔽字為mask

  • SIG_BLOCK:當(dāng)how設(shè)置為此值,set表示需要屏蔽的信號(hào)。相當(dāng)于 mask = mask | set
  • SIG_UNBLOCK:當(dāng)how設(shè)置為此,set表示需要解除屏蔽的信號(hào)。相當(dāng)于 mask = mask & ~set
  • SIG_SETMASK:當(dāng)how設(shè)置為此,set表示用于替代原始屏蔽及的新屏蔽集。相當(dāng)于 mask = set若,調(diào)用sigprocmask解除了對(duì)當(dāng)前若干個(gè)信號(hào)的阻塞,則在sigprocmask返回前,至少將其中一個(gè)信號(hào)遞達(dá)。

我們?nèi)绾巫x取未決信號(hào)集?系統(tǒng)提供了sigpending函數(shù)。

函數(shù)原型:

  1. int sigpending(sigset_t *set); 

參數(shù)說(shuō)明:set傳出參數(shù)。

返回值:

返回值:成功:0;失?。?1,設(shè)置errno

例:把所有常規(guī)信號(hào)的未決狀態(tài)打印至屏幕。

  1. #include  
  2. #include  
  3. #include  
  4.  
  5. void printPending(sigset_t *set) 
  6.     int i = 0
  7.  
  8.     for (i = 0; i < 32; i++) { 
  9.         if (sigismember(set, i) == 1) 
  10.             printf("1"); 
  11.         else 
  12.             printf("0"); 
  13.     } 
  14.     printf("\n"); 
  15.  
  16. int main() 
  17.     sigset_t set, oldset, pendset; 
  18.     sigemptyset(&set); 
  19.     sigaddset(&set, SIGQUIT);   // ctrl + \ 將產(chǎn)生SIGQUIT信號(hào) 
  20.     sigprocmask(SIG_BLOCK, &set, &oldset); 
  21.     while (1) { 
  22.         sigpending(&pendset); 
  23.         printPending(&pendset);     // 寫一個(gè)函數(shù)打印未決信號(hào)集 
  24.         sleep(1); 
  25.     } 

本文授權(quán)轉(zhuǎn)載自公眾號(hào)「良許Linux」。良許,世界500強(qiáng)外企Linux開(kāi)發(fā)工程師,公眾號(hào)里分享大量Linux干貨,歡迎關(guān)注!

 

責(zé)任編輯:趙寧寧 來(lái)源: 今日頭條
相關(guān)推薦

2020-10-18 07:13:44

Linux系統(tǒng)編程信號(hào)捕捉

2020-09-25 07:34:40

Linux系統(tǒng)編程信號(hào)量

2020-10-10 07:18:14

Linux系統(tǒng)編程管道

2020-09-26 21:43:59

Linux系統(tǒng)編程條件變量

2020-10-05 22:01:02

Linux系統(tǒng)編程線程屬性

2020-09-28 06:49:50

Linux系統(tǒng)編程互斥量mutex

2020-09-26 23:09:00

Linux系統(tǒng)編程讀寫鎖

2020-09-22 07:35:06

Linux線程進(jìn)程

2020-10-05 22:05:10

Linux系統(tǒng)編程時(shí)序競(jìng)態(tài)

2020-10-09 07:13:11

Linux系統(tǒng)編程mmap

2009-07-03 11:57:18

系統(tǒng)編程安全linux

2017-02-28 18:26:09

Linuxinput子系統(tǒng)編程

2025-04-16 04:22:00

2010-03-05 13:34:54

2019-03-15 09:30:09

Linux系統(tǒng)CPU

2009-10-23 16:35:44

linux Debia

2010-02-02 13:26:53

Linux內(nèi)核

2011-01-04 14:36:39

LinuxGTK編程

2009-09-01 09:20:24

Linux操作系統(tǒng)聲音設(shè)備編程實(shí)例

2009-10-21 13:02:20

linux串口操作函數(shù)操作系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)