Linux程式設計 訊號

2021-07-07 04:43:39 字數 2412 閱讀 3856

訊號:就是軟體中斷。訊號提供了一種處理非同步事件的方法:終端使用者鍵入中斷鍵,則會通過訊號機構停止乙個程式。所以,訊號可以說是程序控制的一部分。

訊號的名字都以三個字母開頭:sig

訊號是非同步事件的經典例項。

l  當使用者按某些終端鍵時,產生訊號。

l  硬體異常產生訊號:除數為0、無效的儲存訪問等等。

l  程序用kill函式可將訊號傳送給另乙個程序或程序組

l  使用者可用kill命令將訊號傳送給其他程序

l  當檢測到某種軟體條件已經發生,並將其通知有關程序時也產生訊號。

①   忽略此訊號(最常用)

但有2中訊號絕對不能忽略:sigkill 和sigstop

原因:這兩種訊號向超級使用者提供了使程序終止或停止的可靠方法。

②   捕捉訊號

③   執行預設動作

int kill(pid_t pid,int sig);

int raise(int sig);

unisigned int alarm(unsigned int seconds);

kill 系統呼叫負責向程序傳送訊號sig.

l  如果pid 是正數,那麼向訊號sig 被傳送到程序pid.

l  如果pid 等於0,那麼訊號sig 被傳送到所以和pid 程序在同乙個程序組的程序

l  如果pid 等於-1,那麼訊號發給所有的程序表中的程序,除了最大的哪個程序號.

l  如果pid 由於-1,和0 一樣,只是傳送程序組是-pid.

raise 系統呼叫向自己傳送乙個sig 訊號.

最常用的訊號遮蔽要用到下面的幾個函式

.

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set,int signo);

int sigdelset(sigset_t *set,int signo);

int sigismember(sigset_t *set,int signo);

int sigprocmask(int how,const sigset_t *set,sigset_t *oset);

sigemptyset 函式初始化訊號集合

set,將set 設定為空.

sigfillset 也初始化訊號集合,只是將訊號集合設定為所有訊號的集合

sigaddset 將訊號signo

加入到訊號集合之中

sigdelset 將訊號從訊號集合中刪除

sigismember 查詢訊號是否在訊號集合之中

sigprocmask 是最為關鍵的乙個函式. 在使用之前要先設定好訊號集合set.這個函式的作用是將指定的訊號集合set 加入到程序的訊號阻塞集合之中去

,如果提供了oset 那麼當前

的程序訊號阻塞集合將會儲存在oset 裡面.

引數how 決定函式的操作方式.

sig_block:增加乙個訊號集合到當前程序的阻塞集合之中

.sig_unblock:從當前的阻塞集合之中刪除乙個訊號集合

.sig_setmask:將當前的訊號集合設定為訊號阻塞集合

.int pause(void );

int sigsuspend(const sigset_t *sigmask);

pause 函式很簡單,就是掛起程序直到乙個訊號發生了 而

sigsuspend

也是掛起程序只是在

呼叫的時候用

sigmask

取代當前的訊號阻塞集合

.訊號量是乙個計數器,用於多程序對共享資料物件的訪問。主要是用來保護共享資源,使的資源在乙個時刻只有乙個程序所擁有.為此我們可以使用乙個訊號燈.當訊號燈的值為某個值的時候,就表明此時資源不可以使用.否則就表示可以使用

為了獲得共享資源,程序需要執行下列操作:

1 測試控制該資源的訊號量

2 若訊號量為正,則可以使用該資源,並使訊號量減1,表示了使用了乙個資源單位;

3 若訊號量為0,則程序進入休眠狀態,直至訊號量大於0.直至程序被喚醒後,它返回至第一步。

注意:為了正確實現訊號量,訊號量值得測試及減1操作應當是原子操作。因此,訊號量通常是在核心中實現的。 ①

posix 表示可移植作業系統介面(portable operating system inte***ce ,縮寫為posix )

②pv操作了.pv操作是原子操作.也就是操作是不可以中斷的,在一定的時間內,只能夠有乙個程序的**在cpu 上面執行.

Linux程式設計 程序 訊號

半年不接觸linux,有些東西變的太陌生了,再回顧一下我的linux 基礎 程式設計吧 程序 1.得到程序資訊的常用函式 include include pid t getpid void 程序id pid t getppid void 父程序id uid t getuid void 程序所有者的i...

Linux程式設計 11 訊號

1.1 特點 1.2 訊號的狀態 訊號優先順序高,程序先執行訊號.未決訊號 等待被處理 遞達 已被處理 1.3 處理方式 忽略,捕捉,預設 1.4 訊號的四要素 1.5 man文件檢視訊號 man 7 signal 1.6 阻塞訊號集,未決訊號集2.1 kill 傳送訊號給指定程序 原型int ki...

Linux系統程式設計 訊號

0x00 訊號和中斷類似,中斷是硬體發出,而訊號由軟體發出。訊號常用於程序間通訊,乙個訊號常見的處理如下 1 設定對應訊號的訊號處理函式。2 當訊號來臨時,打斷正常執行的程式 本質上是在系統呼叫前檢查是否有訊號的到來 去執行訊號處理函式。3 訊號處理函式執行完,繼續執行原程式。0x01 我們先來看一...