亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2640 | 回復(fù): 3
打印 上一主題 下一主題

[函數(shù)] APUE中sigpending代碼解釋不了解 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-05-06 10:25 |只看該作者 |倒序?yàn)g覽
AUPE第二版的10.13節(jié)中講到 sigpending 函數(shù),對(duì)下面的這段代碼不了解

#include "apue.h"
static void sig_quit(int);

int main(void)
{
    sigset_t    newmask, oldmask, pendmask;

    if (signal(SIGQUIT, sig_quit) == SIG_ERR)
        err_sys("can't catch SIGQUIT");
    /*
     * Block SIGQUIT and save current signal mask.
     */

    sigemptyset(&newmask);
    sigaddset(&newmask, SIGQUIT);
&nbsp;&nbsp;&nbsp;&nbsp;if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("SIG_BLOCK error");

&nbsp;&nbsp;&nbsp;&nbsp;sleep(5);   /* SIGQUIT here will remain pending */
&nbsp;&nbsp;&nbsp;&nbsp;if (sigpending(&pendmask) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("sigpending error");
&nbsp;&nbsp;&nbsp;&nbsp;if (sigismember(&pendmask, SIGQUIT))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\nSIGQUIT pending\n");

&nbsp;&nbsp;&nbsp;&nbsp;/*
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* Reset signal mask which unblocks SIGQUIT.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/

&nbsp;&nbsp;&nbsp;&nbsp;if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("SIG_SETMASK error");
&nbsp;&nbsp;&nbsp;&nbsp;printf("SIGQUIT unblocked\n");

&nbsp;&nbsp;&nbsp;&nbsp;sleep(5);   /* SIGQUIT here will terminate with core file */
&nbsp;&nbsp;&nbsp;&nbsp;exit(0);
}

static void sig_quit(int signo)
{
&nbsp;&nbsp;&nbsp;&nbsp;printf("caught SIGQUIT\n");
&nbsp;&nbsp;&nbsp;&nbsp;if (signal(SIGQUIT, SIG_DFL) == SIG_ERR)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("can't reset SIGQUIT");
}

代碼輸出:
SIGQUIT pending          after return from sleep
caught SIGQUIT           in signal handler
SIGQUIT unblocked        after return from sigprocmask


在 if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)這句代碼中已經(jīng)講SIGQUIT信號(hào)阻塞了,在未解除阻塞之前這么還會(huì)捕
獲到SIGQUIT這個(gè)信號(hào)呢.

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-05-06 10:28 |只看該作者
補(bǔ)充一下,AUPE中對(duì)這個(gè)情況的解釋是SIGQUIT在進(jìn)程睡眠期間產(chǎn)生,這個(gè)信號(hào)現(xiàn)在是未決的并且是非阻塞的,所以它會(huì)在sigprocmask 函數(shù)返回之前遞送給該進(jìn)程.
If we generate the quit signal during this sleep period, the signal is now pending and unblocked, so it is delivered before sigprocmask returns.

在sleep之前進(jìn)程該信號(hào)都已經(jīng)阻塞了呀,怎么還說(shuō)是非阻塞

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2009-05-06 10:37 |只看該作者
你沒(méi)有搞懂吧,是這句if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) unblock后才收到的sigquit,因?yàn)閟igprocmask是一個(gè)系統(tǒng)調(diào)用,在從它返回用戶(hù)空間時(shí)內(nèi)核會(huì)去檢查信號(hào)的,這時(shí),sigquit已經(jīng)可以處理了,于是就馬上處理后才回到用戶(hù)空間執(zhí)行那句printf("SIGQUIT unblocked\n");當(dāng)然就是你看到的輸入順序了

[ 本帖最后由 bobozhang 于 2009-5-6 10:38 編輯 ]

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-05-06 10:39 |只看該作者
是這樣的:在信號(hào)被阻塞期間發(fā)送給進(jìn)程的信號(hào)會(huì)被推遲發(fā)送,直到進(jìn)程解除對(duì)某信號(hào)的阻塞,這時(shí)候信號(hào)才會(huì)到來(lái)
請(qǐng)看apue p269頁(yè)
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP