• <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開發

            国产精品一区二区久久| 午夜精品久久影院蜜桃| 久久r热这里有精品视频| 一本色道久久88加勒比—综合| 久久精品视频91| 日产精品久久久久久久| 亚洲精品高清久久| 亚洲精品无码久久久久| 韩国三级中文字幕hd久久精品 | 国产精品久久久久久五月尺| 久久夜色精品国产网站| 91精品婷婷国产综合久久| 久久久无码精品亚洲日韩蜜臀浪潮 | 伊人久久大香线蕉综合Av| 国产精品免费久久久久久久久 | 久久国产色av免费看| 狠狠色综合网站久久久久久久| 久久久无码精品亚洲日韩按摩 | 国产 亚洲 欧美 另类 久久| 久久久久av无码免费网| 久久亚洲国产成人精品无码区| 久久男人Av资源网站无码软件| 久久久久久国产精品无码下载 | 伊人久久精品线影院| 伊人久久大香线蕉无码麻豆 | 久久不射电影网| 日韩人妻无码一区二区三区久久 | 欧美久久综合性欧美| 少妇内射兰兰久久| 亚洲欧美日韩中文久久| 精品国产青草久久久久福利| 欧美久久久久久| 久久久久人妻精品一区三寸蜜桃 | 怡红院日本一道日本久久| 国产一区二区三区久久| 国产精品一区二区久久| 国产精品天天影视久久综合网| 精品久久久久久亚洲| 亚洲一区中文字幕久久| 97精品伊人久久久大香线蕉| 九九久久精品国产|