• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線忘掉

            Linux信號機制之信號阻塞

            ? 每個進程都有一個用來描述哪些信號傳送來將被阻塞的阻塞的信號集,如果某種信號在某個進程的阻塞信號集中,則傳送到該進程的此種信號將會被阻塞。信號阻塞操作主要有以下三個函數:
            ??
            ?? #include<signal.h>
            ?? int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
            ?? int sigpending(sigset_t *set);
            ?? int sigsuspend(const sigset_t *mask);
            ??
            ?? sigprocmask系統調用用于改變當前阻塞信號集,它具體的功能主要取決于第一個參數how。how的取值如下:
            ????????? -----------------------------------------------------------------------------------------------------
            ?????????? 參數how?????? |?????????????????? ?? 動作
            ????????? ------------------------------------------------------------------------------------------------------
            ???????????? SIG_BLOCK???? |???? 將set指向的信號集中的信號添加到當前阻塞信號集中
            ????????? ------------------------------------------------------------------------------------------------------
            ???????? SIG_UNBLOCK??? |???? 從當前阻塞信號集中移除set指向的信號集中的信號,
            ??????????????????? ?? ?? |???? 移除一個阻塞信號集中不存在的信號那也是合法的
            ????????? ------------------------------------------------------------------------------------------------------
            ????????? SIG_SETMASK??? |???? 指定set所指向的信號集為當前阻塞信號集
            ???????? --------------------------------------------------------------------------------------------------------
            ???? 如果sigprocmask的第三個參數oldset非空,則oldset保存舊的信號阻塞集。
            ????
            ??? sigpending(…)獲得當前已傳送到進程,卻被阻塞的所有信號,在set指向的信號集中保存未決(阻塞)的信號。
            ??? sigsuspend(const sigset_t *mask),在接收到某個信號之前,臨時用mask替換進程的信號掩碼,并掛起進程,直到收到信號為止。sigsuspend返回后,即系統在接受到信 號后,進程將恢復調用前的信號掩碼,調用信號處理函數完畢后進程將繼續執行。始終返回-1,并將errno設置為EINTR。
            ???
            ??? 下面這個小程序測試了信號的阻塞以及信號集操作:
            #include <stdio.h>
            #include <stdlib.h>
            #include <signal.h>
            #include <unistd.h>

            #define BLOCK_SIG??? SIGRTMIN+10
            /*信號處理函數*/
            static void sig_handler(int signum,struct siginfo *sig_info,void *unused)
            {
            ??? printf("\n<! receive signal %d !>\n",signum);
            ??? printf("-----------------< Signal information >--------------------\n");
            ??? printf("\tsi_signo :\t%d\n",sig_info->si_signo);//信號值
            ??? printf("\tsi_errno :\t%d\n",sig_info->si_errno);//error值
            ??? printf("\tsi_code :\t%d\n",sig_info->si_code); //信號產生的原因
            ??? printf("\tsi_int?? :\t%d\n",sig_info->si_int); //4 bytes 整型???
            ???
            }

            int main(int argc,char**argv)
            {
            ??? sigset_t new_mask,old_mask,pending_mask;
            ??? struct sigaction act;
            ???
            ??? printf("Block precess PID : %d\n",getpid());
            ??? /*
            ??? *設置struct sigaction結構
            ??? */
            ??? sigemptyset(&act.sa_mask);
            ??? act.sa_flags=SA_SIGINFO;
            ??? act.sa_sigaction=(void *)sig_handler;
            ??????? /*
            ??? *安裝信號
            ??? */
            ??? if(sigaction(BLOCK_SIG,&act,NULL))
            ??? ??? printf("install siganl SIGRTMIN+10 error!\n");
            ??????? /*
            ??? *設置新的屏蔽信號集,阻塞 SIGRTMIN+10 信號!
            ??? */
            ??? sigemptyset(&new_mask);
            ??? sigaddset(&new_mask,BLOCK_SIG);
            ??? if(sigprocmask(SIG_BLOCK,&new_mask,&old_mask))
            ??? ??? printf("block signal SIGRTMIN+10 error!\n");

            ??? sleep(30);//等待信號SIGRTMIN+10喚醒,但因為上面設置了此信號阻塞,因此此處不能從睡眠中喚醒進程

            ??? printf("\nNow begin to get pending mask and unblock SIGRTMIN_10\n");
            ??? sigpending(&pending_mask);?? //獲得當前已傳送到進程,卻被阻塞的所有信號
            ??? if(sigismember(&pending_mask,BLOCK_SIG))
            ??? ??? printf("\nsignal SIGRTMIN+10 is pending!\n");
            ??? /*
            ???? *恢復原來的信號屏蔽集,此前被阻塞的信號觸發
            ???? */
            ??? sigprocmask(SIG_SETMASK,&old_mask,NULL);
            ??? printf("\nsignal unblocked!\n");

            ??? /*
            ??? *進程進入睡眠,直到有信號喚醒進程,或時間到!
            ??? */
            ??? sleep(30);
            ???
            ??? exit(0);
            }
            ???
            ???? 配合上篇中介紹的信號發送小程序,你可以測試一下程序的執行結果!

            posted on 2007-08-02 23:19 旅途 閱讀(801) 評論(0)  編輯 收藏 引用 所屬分類: Linux開發

            日本欧美久久久久免费播放网 | 热综合一本伊人久久精品| 精品午夜久久福利大片| 久久精品国内一区二区三区| 久久精品国产黑森林| 久久男人中文字幕资源站| 99久久99久久精品国产片果冻| 亚洲精品乱码久久久久久自慰| 久久se精品一区精品二区| 久久影视综合亚洲| www.久久99| 久久精品国产亚洲AV久| 天天爽天天爽天天片a久久网| yy6080久久| 精品综合久久久久久88小说| 久久亚洲精精品中文字幕| 精品久久久久久无码人妻热| 精品人妻久久久久久888| 一本大道久久东京热无码AV| 国产精品99久久99久久久| 区久久AAA片69亚洲| 狠狠综合久久综合中文88| 国产精品久久午夜夜伦鲁鲁| 国内精品伊人久久久久妇| 久久精品无码av| 色综合久久中文色婷婷| 久久国产亚洲精品无码| 少妇熟女久久综合网色欲| 日本高清无卡码一区二区久久| 久久伊人精品青青草原高清| 波多野结衣久久一区二区| 久久亚洲精品国产精品婷婷| 人妻少妇精品久久| 无码任你躁久久久久久久| 久久亚洲中文字幕精品一区| 狠狠色丁香婷婷综合久久来来去| 日韩亚洲欧美久久久www综合网| 久久99国产综合精品| 精品蜜臀久久久久99网站| 国产精品久久久天天影视| 99久久99久久精品免费看蜜桃|