遮蔽訊號:
在 sigaction 的使用中,我們已經看到了表示訊號集的 sigset_t 型資料。在 linux 上有一組函
數專門用於對訊號集進行操作:
#include
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);
set 引數指向要操作的訊號集,而 signum 引數則代表乙個指定的訊號,各個函式的作用如下:
◆ sigemptyset:清空訊號集,返回 0 表示成功,-1 表示失敗;
◆ sigfillset:將所有訊號加入訊號集,返回 0 表示成功,-1 表示失敗;
◆ sigaddset:將指定訊號加入訊號集,返回 0 表示成功,-1 表示失敗;
◆ sigdelset:將指定訊號從訊號集中去除,返回 0 表示成功,-1 表示失敗;
◆ sigismember:判斷乙個指定的訊號是否在訊號集中,返回 1 表示在訊號集中,0 表示不在信
號集中,-1 表示有錯誤發生。
訊號集在使用前需要先用 sigemptyset 或 sigfillset 函式進行初始化,然後用 sigaddset 或
sigdelset 函式增加或去除需要的訊號。
在**中也可以直接設定或獲取程序的訊號掩碼:
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
◆ how:指定操作訊號掩碼的方式。
◆ set:指向用於設定訊號掩碼的訊號集。
◆ oldset:用於返回原來的訊號掩碼。
◆ 返回值:0 表示成功,-1 表示失敗。
sigprocmask 函式將根據引數 how 指定的方式,設定當前程序的訊號掩碼,並把原來的訊號掩碼
儲存在引數 oldset 指向的訊號集中返回。如果 set 引數為 null,則不修改訊號掩碼;如果 oldset 引數
為 null,則不返回原來的訊號掩碼。how 有以下三個取值:
◆ sig_block:將 set 引數指向訊號集中的訊號加入到訊號掩碼中。
◆ sig_unblock:將 set 引數指向的訊號集中的訊號從訊號掩碼中刪除。
◆ sig_setmask:將 set 引數指向訊號集設定為訊號掩碼。
因此,遮蔽某個訊號可以有兩種方式,下面以 sigusr1 訊號為例進行說明:
第一種方式為使用 sig_block 操作方式,**如下:
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, sigusr1);
sigprocmask(sig_block, &sigset, null);
第二種方式為使用 sig_setmask 操作方式,**如下:
sigset_t set;
sigprocmask(sig_setmask, null, &set); //先得到當前的訊號掩碼
sigaddset(&set, sigusr1); //將要遮蔽的訊號加入
sigprocmask(sig_setmask, &set, null);
同時,要解除對訊號的遮蔽,也有兩種方式,仍以 sigusr1 訊號為例:
第一種方式,使用 sig_unblock 操作方式:
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, sigusr1);
sigprocmask(sig_unblock, &sigset, null);
第二種方式,使用 sig_setmask 操作方式:
sigset_t set;
sigprocmask(sig_setmask, null, &set); //先得到當前的訊號掩碼
sigdelset(&set, sigusr1); //將要解除遮蔽的訊號去除
sigprocmask(sig_setmask, &set, null);
訊號安全函式:
如前所述,程序在收到訊號並對其進行處理時,會中斷當前正在執行的指令序列,而去執行訊號處
理函式。但是訊號的傳遞是非同步的,系統無法確定何時傳遞訊號給程序。如果程序在收到訊號時正在執行某
個不可重入的函式,這時捕捉到訊號,程序就會轉而去執行訊號處理函式。如果在這個訊號處理函式中又再
次呼叫了同乙個函式,就有可能產生問題。
因此有些函式時不能在訊號處理函式中呼叫的,那些可以在訊號處理函式中呼叫且不會有潛在問題
的函式稱為對訊號安全的。下表列出了 linux 系統中的訊號安全函式,對於不在這個表中的函式,如果要
在訊號處理函式中呼叫,則需謹慎處理。
linux入門學習筆記(五)程序管理
在我們進入it行業之後,會聽到許多關於程序的話題,從最簡單的殺死乙個程序,終止乙個程序,到深入一些的父程序創造子程序等等。那麼什麼是程序呢?簡單來說程序就是乙個正在執行中的程式。user 執行程序的使用者 pid 程序id cpu cpu佔用率 mem 記憶體佔用率 vsz 占用虛擬記憶體 rss ...
Linux程序間通訊(五)
共享記憶體 使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。示例 comm.h 1 pragma once 2 3 include4 include5 include6 7 defi...
Linux(五) 程序排程演算法
程序排程,使用者程序數程序排程一般都多於處理機數 這將導致它們互相爭奪處理機。另外,系統程序也同樣需要使用處理機。無論是在批處理系統還是分時系統中,使用者程序數程序排程一般都多於處理機數 這將導致它們互相爭奪處理機。另外,系統程序也同樣需要使用處理機。這就要求程序排程程式按一定的策略,動態地把處理機...