Linux 程序學習(五)

2021-07-16 16:48:09 字數 2662 閱讀 9094

遮蔽訊號:

在 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(五) 程序排程演算法

程序排程,使用者程序數程序排程一般都多於處理機數 這將導致它們互相爭奪處理機。另外,系統程序也同樣需要使用處理機。無論是在批處理系統還是分時系統中,使用者程序數程序排程一般都多於處理機數 這將導致它們互相爭奪處理機。另外,系統程序也同樣需要使用處理機。這就要求程序排程程式按一定的策略,動態地把處理機...