為什麼不能在訊號處理的時候使用系統呼叫

時間 2021-06-03 09:39:10

1樓:尾翼

系統的慢系統呼叫會被訊號打斷,而不是所有的系統呼叫都會被訊號打斷。

慢系統呼叫來描述那些可能永遠堵塞的系統呼叫,如:accept,read,等。

當慢系統呼叫接收到訊號的時候,系統呼叫可能返回乙個EINTR錯誤,多程序的伺服器中,為了避免accept被子程序訊號打斷,需要自己在accept返回-1的情況下,判斷errno是否為EINTR,並且重啟accept。

在unp中,已經將accept的這項措施在錯誤處理封裝為Accept了,直接呼叫unp.h,所以很多人在學習的時候沒有注意到。

類似以下,不過源文好像用的是goto,我個人不喜歡goto,continue一樣的效果

while( 1clilen = sizeof(claddr);

if((connfd = accept(listenfd, (SA *)&claddr, &cllen)) < 0if(errno == EINTRcontinueelseerr_sys("accept error"

2樓:海楓

系統呼叫被訊號打斷,跟訊號處理函式不能調系統呼叫,是兩回事好吧。

你現在遇到的情況是,呼叫系統呼叫進入核心,accpet還沒有等到客戶端建鏈時,就來訊號,接著處理訊號,訊號處理完之後,accept系統呼叫就返回,出錯碼是EINTR,表明被訊號打斷了,這很正常呀。

在POSIX規範裡面很多libc函式就會被訊號打斷,並且不會重入,需要programmer根據具體情況做處理的。

3樓:

首先明確一點:只有當子執行緒結束的時候會傳送SIGCHLD訊號給父程序。

如果你accept的子執行緒發出了SIGCHLD訊號,那麼說明子執行緒結束了(正常或異常退出)。然後待父程序收到該訊號,並做了些處理後。子執行緒的資源就被完全釋放了,肯定阻塞就不再了。。

為什麼病毒不能在空氣中存活?

草堂遊 我認為病毒不能在空氣中存活是因為和病毒的組成有關,病毒的組成由DNA或RNA和外殼 蛋白質 組成,病毒必需要寄宿在宿主細胞才能複製出新的病毒,病毒在空氣中存在,它會受到太陽的熱輻射 空氣中的塵埃等因素,會使病毒的外殼也就是蛋白質變性,病毒滅活,就不具有感染性。 J博士 細菌可以附著在空氣中顆...

Line 為什麼不能正常使用了?

兜比 嗯哼。乙個月前再一天,包括度娘貼吧在內的一部分國內社交工具以同一理由婉拒了海外黨的發帖回帖要求,在這幾天內只有簽到和看帖功能依舊開放,簡單地說,就是只能看,不能摸。該理由寫的是 正在進行線路改造,請稍後嘗試,為您帶來不便表示歉意。這一稍後就是稍後了三天,不便到了便秘也沒有乙個客戶理會。牆的那邊...

為什麼女生不能在公眾場合補妝?

留汀 看到這個問題就一頭霧水補妝補妝,補 字啥意思不用多說了吧?呲防曬噴霧那種當然要避開人,其他補妝用的化妝品,大都體量小,也不具有刺激性氣味,這又礙著哪位的眼睛了? 以下都是個人意見,題主可以堅持自己的想法,畢竟現在是個多元化社會,我這個人做事,有一些小小的堅持自己的原則。確實我有第一次見面的女性...