成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux系統編程—信號集操作函數

系統 Linux
信號從產生到抵達目的地,叫作信號遞達。而信號從產生到遞達的中間狀態,叫作信號的未決狀態。

先來回顧一下未決信號集是怎么回事。

信號從產生到抵達目的地,叫作信號遞達。而信號從產生到遞達的中間狀態,叫作信號的未決狀態。產生未決狀態的原因有可能是信號受到阻塞了,也就是信號屏蔽字(或稱阻塞信號集,mask)對應位被置1。阻塞信號集和未決信號集均是由內核維護的,整個過程如下圖示:

我們有時需要屏蔽某個信號,就需要去修改阻塞信號集。那么,我們該如何修改阻塞信號集?系統提供的一個方法是,我們先創建一個跟阻塞信號集一樣的集合,再利用它去修改阻塞信號集。

系統提供了一系列的信號集設定函數。這些函數如下所示:

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

使用以上這些函數創建完信號集后,要如何去改變阻塞信號集呢?系統又提供了一個函數:sigprocmask函數。

sigprocmask函數可以用來屏蔽信號,也可以用來解除屏蔽信號,其本質就是利用我們創建的信號集去改變阻塞信號集。

函數原型:

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

返回值:

成功:0;失敗:-1,設置errno

參數解釋:

  • set:傳入參數,是一個位圖,set中哪位置1,就表示當前進程屏蔽哪個信號。
  • oldset:傳出參數,保存舊的信號屏蔽集。這個與setitimer有點相似。

how參數取值:

假設當前的信號屏蔽字為mask

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

我們如何讀取未決信號集?系統提供了sigpending函數。

函數原型:

  1. int sigpending(sigset_t *set); 

參數說明:set傳出參數。

返回值:

返回值:成功:0;失敗:-1,設置errno

例:把所有常規信號的未決狀態打印至屏幕。

  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 + \ 將產生SIGQUIT信號 
  20.     sigprocmask(SIG_BLOCK, &set, &oldset); 
  21.     while (1) { 
  22.         sigpending(&pendset); 
  23.         printPending(&pendset);     // 寫一個函數打印未決信號集 
  24.         sleep(1); 
  25.     } 

本文授權轉載自公眾號「良許Linux」。良許,世界500強外企Linux開發工程師,公眾號里分享大量Linux干貨,歡迎關注!

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2020-10-18 07:13:44

Linux系統編程信號捕捉

2020-09-25 07:34:40

Linux系統編程信號量

2020-10-05 22:01:02

Linux系統編程線程屬性

2020-09-26 21:43:59

Linux系統編程條件變量

2020-10-10 07:18:14

Linux系統編程管道

2020-10-05 22:05:10

Linux系統編程時序競態

2020-09-22 07:35:06

Linux線程進程

2020-09-28 06:49:50

Linux系統編程互斥量mutex

2020-09-26 23:09:00

Linux系統編程讀寫鎖

2020-10-09 07:13:11

Linux系統編程mmap

2009-07-03 11:57:18

系統編程安全linux

2017-02-28 18:26:09

Linuxinput子系統編程

2025-04-16 04:22:00

2010-03-05 13:34:54

2019-03-15 09:30:09

Linux系統CPU

2009-10-23 16:35:44

linux Debia

2010-02-02 13:26:53

Linux內核

2011-01-04 14:36:39

LinuxGTK編程

2009-09-01 09:20:24

Linux操作系統聲音設備編程實例

2009-10-21 13:02:20

linux串口操作函數操作系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 操亚洲 | 美女视频.| 国产精品国产三级国产aⅴ中文 | 最新高清无码专区 | 欧美日韩一区不卡 | 午夜精品视频在线观看 | 国产高清视频 | 日韩视频专区 | 国产精品一区二区三区在线 | 成人在线视频观看 | 日本一区二区不卡 | 成人久久18免费网站麻豆 | 中文字幕一区二区三区在线观看 | 国产精品久久av | 国产亚洲区 | 精品视频一区二区三区 | 日韩欧美国产精品一区二区 | 欧美一级www片免费观看 | 精品国产一区一区二区三亚瑟 | 在线精品一区二区三区 | 黄色av网站免费看 | 在线免费小视频 | 日日干夜夜操 | 成人免费视频 | 精品久久久久久 | 亚洲伊人久久综合 | 我要看免费一级毛片 | 特级特黄特色的免费大片 | 国产黄色电影 | 国内精品久久精品 | 日韩精品一区二区三区中文在线 | 天天操天天操 | 成人在线免费观看 | 中文字幕在线精品 | 欧美精品久久久 | 久久精品一区二区三区四区 | 午夜精品一区二区三区三上悠亚 | 久久久久亚洲 | 亚洲深夜福利 | 中文字幕亚洲一区二区va在线 | 国产精品久久亚洲7777 |