Unix 環境程式設計10 20 sigqueue函式

2021-10-04 00:05:13 字數 1792 閱讀 5883

大多數的unix 系統不會對訊號進行排隊。但是在posix.1的實時擴充套件中,一些系統開始增加對訊號排隊的支援。

除此以外,這些擴充套件允許訊號可以傳遞更多的資訊

通常情況下,sigqueue是要和sigaction一起使用的,注意點如下:

(1)sigaction 函式安裝訊號處理程式時指定sa_siginfo標誌

(2)在sigaction結構中的sa_sigaction成員中提供處理函式。

#include < signal.h>

int sigqueue(pid_t pid, int sig, const union si**al value);

sigqueue()類似於之前的kill()。是用來傳送訊號的,主要針對有帶參的訊號,與sigaction()配合使用。

第三個引數是乙個聯合資料結構union si**al,指定了訊號傳遞的引數,即通常所說的4位元組值。

具體**如下:

void handler(int signo,siginfo_t *resdata,void *unknowp)

int main()

else if(pid == 0)

}else

while(1)

}

實驗結果

$ ./test 

send signal:2 success!

signo=2

send signal:34 success!

send signal:2 success!

send signal:34 success!

send signal:2 success!

return data :111

signo=34

send signal:34 success!

return data :111

send signal:2 success!

send signal:34 success!

send signal:2 success!

signo=34

send signal:34 success!

return data :111

signo=34

return data :111

signo=34

return data :111

signo=34

return data :111

signo=2

return data :111

實驗結果分析

(1)實驗中,訊號處理函式列印出了訊號中的附加資訊111。

(2)可以看到,由於訊號2 是不可靠訊號,不支援排隊,訊號會產生丟失,因此並沒有列印出5次。

而訊號34 是可靠訊號,因此支援排隊,所以會列印5次。

(3)另外思考為什麼2號訊號會列印2次呢?

訊號處理流程: 捕捉訊號–>block 訊號–>訊號處理函式呼叫–>unblock 訊號。所以你看到的就是你傳送很少的同乙個訊號時,可能在捕捉訊號和block訊號之間完成,所以你只能看到乙個訊號處理。當傳送很多訊號時,可能一部分訊號會在block訊號和訊號處理函式呼叫之間遞送,這樣就會被阻塞,處於pending狀態,由於不支援排隊,當訊號處理函式呼叫完畢後,block的訊號會被再次遞送,所以你會看到2次訊號處理或者一次訊號處理,不會看到第三次訊號處理。當然,前提是傳送所有訊號的時間要比一次訊號處理的時間短。

unix環境高階程式設計

unix 日曆時間 自1970 年1 月1 日00 00 00 以來的國際標準時間 utc 程序時間 cpu 時間 時鐘時間 程序執行時間的總量。使用者cpu 時間 執行使用者指令時間量。系統cpu 時間 執行核心所經歷時間。命令 time 第三章至第七章 原子操作 任何乙個要求多於1 個函式呼叫的...

unix環境高階程式設計

檔案描述符file descriptor通常是乙個小的非負整數,核心用以標識乙個特定程序正在訪問的檔案。當核心開啟乙個現有檔案或建立乙個新檔案時,它都返回乙個檔案描述符。在讀寫檔案時,可以私用這個檔案描述符。按管理,每當執行乙個新程式時,所有的shell都為其開啟了3個標準檔案描述符 標準輸入,標準...

UNIX環境高階程式設計

本書是被譽為unix程式設計 聖經 的advanced programming in the unix environment一書的更新版。在本書第1版出版後的十幾年中,unix行業已經有了巨大的變化,特別是影響unix程式設計介面的有關標準變化很大。本書在保持了前一版風格的基礎上,根據最新的標準對...