訊號:就是軟體中斷。訊號提供了一種處理非同步事件的方法:終端使用者鍵入中斷鍵,則會通過訊號機構停止乙個程式。所以,訊號可以說是程序控制的一部分。
訊號的名字都以三個字母開頭: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 我們先來看一...