• <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信號機(jī)制之信號阻塞

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

            #define BLOCK_SIG??? SIGRTMIN+10
            /*信號處理函數(shù)*/
            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); //信號產(chǎn)生的原因
            ??? 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());
            ??? /*
            ??? *設(shè)置struct sigaction結(jié)構(gòu)
            ??? */
            ??? 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");
            ??????? /*
            ??? *設(shè)置新的屏蔽信號集,阻塞 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喚醒,但因為上面設(shè)置了此信號阻塞,因此此處不能從睡眠中喚醒進(jìn)程

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

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

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

            国产精品99久久久久久董美香 | 天天综合久久久网| 久久久久久人妻无码| 久久r热这里有精品视频| 久久久久免费视频| 久久国产精品77777| 久久九九久精品国产| 99999久久久久久亚洲| 久久精品无码免费不卡| 久久精品国产99久久无毒不卡| 国产 亚洲 欧美 另类 久久| 久久精品中文字幕大胸| 欧美日韩中文字幕久久伊人| 久久久这里有精品| 久久人人爽人人澡人人高潮AV| 久久亚洲春色中文字幕久久久| 亚洲七七久久精品中文国产| 好久久免费视频高清| 亚洲国产精品无码久久一线| 久久久久无码国产精品不卡| 亚洲狠狠综合久久| 精品国产一区二区三区久久| 久久久久久毛片免费播放| 久久久久av无码免费网| 久久久久国产亚洲AV麻豆| 久久国产精品99久久久久久老狼| 18岁日韩内射颜射午夜久久成人| 看全色黄大色大片免费久久久| 久久96国产精品久久久| 国产亚洲精久久久久久无码| 久久久噜噜噜久久熟女AA片| 亚洲中文久久精品无码| 亚洲va久久久噜噜噜久久狠狠| 三级三级久久三级久久| 亚洲国产成人乱码精品女人久久久不卡 | 久久精品国产亚洲av麻豆小说| 久久天天躁狠狠躁夜夜2020一| 久久人人爽人爽人人爽av| 人妻无码精品久久亚瑟影视| 人妻中文久久久久| 久久久精品人妻一区二区三区蜜桃 |