目前我正在網絡編程中我碰到的功能PSELECT的一個(附帶的概念),它解決了選擇,即問題的信號。使用select(),在intr_flag的測試和選擇的調用之間有問題,如果信號發生,如果永遠選擇塊,它將會丟失。怎麼做PSELECT塊使用信號屏蔽在網絡編程
if (intr_flag)
handle_intr(); /* handle the signal */
if ((nready = select(...)) < 0) {
if (errno == EINTR) {
if (intr_flag)
handle_intr();
}
然而,它說,隨着PSELECT,我們現在可以代碼這個例子中可靠地
sigset_t newmask, oldmask, zeromask;
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGINT);
sigprocmask(SIG_BLOCK, &newmask, &oldmask); /* block SIGINT */
if (intr_flag) //here
handle_intr(); /* handle the signal */
if ((nready = pselect (... , &zeromask)) < 0) {
if (errno == EINTR) { //here
if (intr_flag)
handle_intr();
}
...
}
,它給出的代碼是可靠的解釋是 - 測試intr_flag變量之前,我們阻止SIGINT。當pselect被調用時,它用空集(即零掩碼)替換進程的信號掩碼,然後檢查描述符,可能會進入睡眠狀態。但是,當pselect返回時,在調用pselect(即SIGINT被阻止)之前,進程的信號掩碼會重置爲其值。
但與PSELECT上面的代碼中提到的,我們阻止信號那麼如何才能檢查錯誤EINTR?由於pselect會阻塞所有信號,因此當發生中斷時,它應該阻止中斷或被傳送到進程。只有當pselect返回時才能傳遞信號。
根據在其前面的評論這裏提及,中斷或仍然可能發生信號PSELECT被調用之前在兩者之間的第一檢查和PSELECT或當PSELECT稱爲矛盾阻擋中斷的目的,行任何其他信號,因此應該導致競爭條件,因爲選擇在那裏。
請誰能解釋這是怎麼可能的,因爲我是新來的這些概念。
很好的解釋:)謝謝! –
不客氣。 –