我們知道系統呼叫一旦阻塞,當訊號到來是會中斷此系統呼叫執行的,但是如下情況是不會對系統呼叫產生影響:
1.單個程序阻塞訊號不會對後續系統呼叫產生中斷行為。
2.執行緒中通過pthread_sigmask阻塞訊號後,對該程序傳送的訊號是不影響該執行緒的系統呼叫的,會被傳送到其他執行緒處理。
對於阻塞的訊號,相當於是延後處理,改為unblock後,會立即觸發訊號行為。如果一直處於阻塞狀態,那麼相當於忽略。
多執行緒的示例如下:
#include #include #include #include #include #include #include #include #include #include #include "include/debug.h"
void *thr_fn(void *arg)
switch (signo)
} return(0);
}pthread_t setup_signal_thread(void)
int main()
測試結果:
xiehaocheng@xiehaocheng:~/work/qemu/sdk/test/linuxc$ ./syscall_intr
^c[604] info: catch sigint; exiting
^c[604] info: catch sigint; exiting
^c[604] info: catch sigint; exiting
^c[604] info: catch sigint; exiting
^c[604] info: catch sigint; exiting
^c[604] info: catch sigint; exiting
^c[604] info: catch sigint; exiting
^c[604] info: catch sigint; exiting
^c[604] info: catch sigint; exiting
^c[604] info: catch sigint; exiting
^c[604] info: catch sigint; exiting
^c[604] info: catch sigint; exiting
可被中斷的系統呼叫
早期的unix系統,如果程序在乙個 慢 系統呼叫中阻塞時,捕獲到乙個訊號,這個系統呼叫被中斷,呼叫返回錯誤,設定errno為eintr。這表明,不是這個系統呼叫錯出了,而是被中斷了,需要再次啟動。系統呼叫被分為慢系統呼叫和其他兩大類別。慢系統呼叫可以被永久阻塞,包括以下幾個類別 1 讀寫 慢 裝置 ...
中斷 異常 系統呼叫
還是之前計算機只能乙個乙個的處理作業,cpu資源利用率低下,為了解決這個問題,人們發明了作業系統,引入中斷機制,實現了多道程式併發執行。本質 發生中斷就意味著需要作業系統的介入,開展管理工作。當中斷發生時,cpu立即進入核心態 當中斷發生後,當前執行的程序暫停執行,並由作業系統核心對中斷進行處理。對...
中斷與系統呼叫
系統呼叫的概念 程式設計師或系統管理員通常並非直接和系統呼叫打交道,在實際應用中,程式設計師呼叫的的函式,或稱為應用程式介面 api 管理員使用的則是更高層次的系統命令。作業系統為每個系統呼叫在標準c函式庫中構造乙個具有相同名字的封裝函式,由它來遮蔽下層的複雜性,負責把作業系統提供的服務介面 系統呼...