歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 一步一步學Linux C:sigprocmask 阻塞進程

一步一步學Linux C:sigprocmask 阻塞進程

日期:2017/3/1 10:26:13   编辑:Linux編程

1、有時候不希望在接到信號時就立即停止當前執行,去處理信號,同時也不希望忽略該信號,而是延時一段時間去調用信號處理函數。這種情況是通過阻塞信號實現的。

2、信號阻塞和忽略信號的區別。

阻塞的概念和忽略信號是不同的。操作系統在信號被進程解除阻塞之前不會講信號傳遞出去,被阻塞的信號也不會影響進程的行為,信號只是暫時被阻止傳遞。當進程忽略一個信號時,信號會被傳遞出去但進程會將信號丟棄。

3、信號阻塞系統調用,它們的都起到阻塞的作用,它們不是協作使用的。

  1. #include <signal.h>
  2. int sigprocmask(ubt how,const sigset_t*set,sigset_t *oldset);
  3. int sigsuspend(const sigset_t*sigmask);

sigprocmask設定對信號屏蔽集內的信號的處理方式(阻塞或不阻塞)。

參數:

how:用於指定信號修改的方式,可能選擇有三種

SIG_BLOCK//將set所指向的信號集中包含的信號加到當前的信號掩碼中。即信號掩碼和set信號集進行或操作。

SIG_UNBLOCK//將set所指向的信號集中包含的信號從當前的信號掩碼中刪除。即信號掩碼和set進行與操作。

SIG_SETMASK //將set的值設定為新的進程信號掩碼。即set對信號掩碼進行了賦值操作。

set:為指向信號集的指針,在此專指新設的信號集,如果僅想讀取現在的屏蔽值,可將其置為NULL。

oldset:也是指向信號集的指針,在此存放原來的信號集。可用來檢測信號掩碼中存在什麼信號。

返回說明:

成功執行時,返回0。失敗返回-1,errno被設為EINVAL。

Copyright © Linux教程網 All Rights Reserved