如果乙個執行緒在乙個斷點,或者由於其他什麼原因停止,此時另外的執行緒阻塞在乙個系統呼叫。這個時候這個系統呼叫就有可能會過早的返回。因此我們在呼叫系統呼叫,最好都要檢測它的返回值。
舉個例子:
sleep (10);
這個我們應該改成這樣:
int unslept = 10;
while (unslept > 0)
unslept = sleep (unslept);
sleep被打斷的例子應該是,sigalarm,因為本身sleep就是用sigalarm實現的。
另外,sleep也會被sigint,也就是 ctrl+c打斷。
sigterm也就是kill 好像不會。
被中斷的系統呼叫
我們知道系統呼叫一旦阻塞,當訊號到來是會中斷此系統呼叫執行的,但是如下情況是不會對系統呼叫產生影響 1.單個程序阻塞訊號不會對後續系統呼叫產生中斷行為。2.執行緒中通過pthread sigmask阻塞訊號後,對該程序傳送的訊號是不影響該執行緒的系統呼叫的,會被傳送到其他執行緒處理。對於阻塞的訊號,...
linux 訊號 中斷的系統呼叫
apue上提到了低速的系統呼叫 解釋很長很麻煩 第三版 260頁 我只是簡單的理解為能夠發生阻塞並且阻塞時間夠長且有可能永遠阻塞的系統呼叫 當這些函式處於阻塞期,恰好捕捉到乙個訊號,則該系統呼叫返回出錯,起errno設定為eintr 而我們希望重啟這些函式則出線了這樣的 again if n rea...
系統呼叫與訊號重啟,好
這篇寫的很好 unix系統程式設計,這本書中有大量的重啟系統呼叫,例如下面的例子 選自p50,pid t r wait int stat loc 還有對read,write的重啟操作。unp volume1中提到slow system call,unp中的例子是accept系統呼叫,accept是伺...