亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

信號之sigsetjmp和siglongjmp函數

2024-06-28 13:28:27
字體:
來源:轉載
供稿:網友
信號之sigsetjmp和siglongjmp函數

在信號處理程序中經常調用longjmp函數以返回到程序的主循環中,而不是從該處理程序返回。

但是,調用longjmp有一個問題。當捕捉到一個信號時,進入信號捕捉函數,此時當前信號被自動地加到進程的信號屏蔽字中。這阻止了后來產生的這種信號中斷該信號處理程序。(僅當從信號捕捉函數返回時再將進程的信號屏蔽字復位為原先值:http://www.CUOXin.com/nufangrensheng/p/3515945.html)如果用longjmp跳出信號處理程序,那么,對此進程的信號屏蔽字會發生什么呢()?(setjmp和longjmp保存和恢復信號屏蔽字,還是不保存和恢復,不同的實現各有不同。)

為了允許兩種形式的行為并存,POSIX.1并沒有說明setjmp和longjmp對信號屏蔽字的作用,而是定義了兩個新函數sigsetjmp和siglongjmp。在信號處理程序中進行非局部轉移時使用這兩個函數。

#include <setjmp.h>int sigsetjmp(sigjmp_buf env, int savemask);返回值:若直接調用則返回0,若從siglongjmp調用返回則返回非0值void siglongjmp(sigjmp_buf env, int val);

這兩個函數與setjmp和longjmp之間的唯一區別是sigsetjmp增加了一個參數。如果savemask非0,則sigsetjmp在env中保存進程的當前信號屏蔽字。調用siglongjmp時,如果帶 非0 savemask的sigsetjmp調用已經保存了env,則siglongjmp從其中恢復保存的信號屏蔽字。

 

實例

程序清單10-14演示了在信號處理程序被調用時,系統所設置的信號屏蔽字如果自動地包括剛被捕捉到的信號。該程序也通過實例說明了如何使用sigsetjmp和siglongjmp函數。

程序清單10-14 信號屏蔽字、sigsetjmp和siglongjmp實例

#include "apue.h"#include <setjmp.h>#include <time.h>static void            sig_usr1(int), sig_alrm(int);static sigjmp_buf        jmpbuf;static volatile sig_atomic_t     canjump;intmain(void){    if (signal(SIGUSR1, sig_usr1) == SIG_ERR)        err_sys("signal(SIGUSR1) error");    if (signal(SIGALRM, sig_alrm) == SIG_ERR)        err_sys("signal(SIGALRM) error");        PR_mask("starting main: ");    if (sigsetjmp(jmpbuf, 1))    {        pr_mask("ending main: ");        exit(0);    }    canjump = 1;    /* now sigsetjmp() is OK */    for(; ;)        pause();}static voidsig_usr1(int signo){        time_t starttime;    if (canjump == 0)        return;        /* unexpected signal, ignore */    pr_mask("starting sig_usr1: ");    alarm(3);        /* SIGALRM in 3 seconds */    starttime = time(NULL);    for(; ;)        /* busy wait for 5 seconds */        if (time(NULL) > starttime + 5)            break;    pr_mask("finishing sig_usr1: ");        canjump = 0;    siglongjmp(jmpbuf, 1);    /* jump back to main, don't return */}static void sig_alrm(int signo){    pr_mask("in sig_alrm: ");}

pr_mask函數參見:http://www.CUOXin.com/nufangrensheng/p/3515257.html中程序清單10-10

此程序演示了另一種技術,只要在信號處理程序中調用siglongjmp,就應使用這種技術:僅在調用sigsetjmp之后才將變量canjump設置為非0值。在信號處理程序中檢測此變量,僅當它為非0值時才調用siglongjmp。這提供了一種保護機制,使得在jmpbuf(跳轉緩沖)尚未由sigsetjmp初始化時,防止調用信號處理程序。在一般的C代碼中(不是信號處理程序),對于longjmp并不需要這種保護措施。但是,因為信號可能在任何時候發生,所以在信號處理程序中,需要這種保護措施。

在程序中使用了數據類型sig_atomic_t,這是由ISO C標準定義的變量類型,在寫這種類型的變量時不會被中斷。這種類型的變量總是包括ISO類型修飾符voaltile。

在RedHat linux 2.6.18版本中執行程序清單10-14并沒有出現我們所預期的結果:當調用一個信號處理程序時,被捕捉到的信號加到進程的當前信號屏蔽字中。當從信號處理程序返回時,恢復原來的屏蔽字。不知為何???

未命名

從上面運行結果可以看出,信號屏蔽字始終都是空。本來應該是在調用一個信號處理程序時,被捕捉到的信號加到進程的當前信號屏蔽字中。為啥沒有加進去呢?還是加進去了沒有更新信號屏蔽字呢?

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲男人av在线| 亚洲成成品网站| 色樱桃影院亚洲精品影院| 中文字幕欧美专区| 欧美福利视频在线观看| 国产精品96久久久久久又黄又硬| 久久久伊人日本| 国产69精品久久久| 中文字幕av一区| 欧美精品第一页在线播放| 日韩中文在线中文网在线观看| 少妇高潮久久77777| 中文在线不卡视频| 欧美性猛交xxxx乱大交蜜桃| 久久久久久这里只有精品| 日韩美女写真福利在线观看| 国产有码在线一区二区视频| 欧美怡春院一区二区三区| 一本大道香蕉久在线播放29| 久久人91精品久久久久久不卡| 国产精品丝袜一区二区三区| 国产精品高清免费在线观看| 少妇精69xxtheporn| 亚洲一区国产精品| 亚洲天堂精品在线| 久久视频免费在线播放| 色综合男人天堂| 国产一区二区三区在线播放免费观看| 欧美在线视频播放| 中文字幕在线精品| 疯狂做受xxxx高潮欧美日本| 国产成人在线一区二区| 国产一区视频在线播放| 国产狼人综合免费视频| 日韩精品在线视频美女| 国产精品视频最多的网站| 欧美激情亚洲视频| 国产精品免费久久久久影院| 亚洲爱爱爱爱爱| 亚洲欧美视频在线| 亚洲国产高清福利视频| 久久久久久久久久久亚洲| 九色成人免费视频| 国产激情久久久| 国产精自产拍久久久久久| 国模私拍视频一区| 亚洲国产精品电影在线观看| 久久久久久国产精品久久| 久久成人在线视频| 日韩av电影手机在线| 日韩成人性视频| 国产精品对白刺激| 亚洲天堂一区二区三区| 91精品久久久久久久久久久| 国产日产亚洲精品| 欧美野外猛男的大粗鳮| 欧美综合第一页| 91av视频在线观看| 日本韩国在线不卡| 成人欧美一区二区三区在线| 亚洲欧美日韩在线一区| 国产99视频在线观看| 欧美—级a级欧美特级ar全黄| 亚洲男人天天操| 精品国偷自产在线| 国产精品福利在线观看网址| 午夜精品三级视频福利| 成人av电影天堂| 日韩欧美在线网址| 欧美午夜精品久久久久久浪潮| 色综合伊人色综合网| 久久天天躁狠狠躁夜夜av| 在线日韩欧美视频| 欧美日本国产在线| 精品久久久久久亚洲精品| 国产成人精品视频在线观看| 国产精品自拍视频| 成人午夜一级二级三级| 一本色道久久综合亚洲精品小说| 97视频在线观看成人| 97视频在线免费观看| 亚洲高清一区二| 91精品国产乱码久久久久久久久| 福利一区视频在线观看| 国产精品麻豆va在线播放| 亚洲人成伊人成综合网久久久| 欧美一级大片在线观看| 国产精品第二页| 欧美成人午夜激情视频| 日韩成人激情在线| 国产精品狠色婷| 91久久国产综合久久91精品网站| 热99精品只有里视频精品| 久久久精品电影| 国产日韩在线免费| 欧美有码在线视频| 91精品国产成人| 国产精品久久一区主播| 亚洲精品天天看| 一区二区国产精品视频| 国产精品网站大全| 国产精品jizz在线观看麻豆| 一区二区在线免费视频| 91久久精品日日躁夜夜躁国产| 国产精品久久久久久久久免费| 国外成人性视频| 国产大片精品免费永久看nba| 日韩欧美一区二区在线| 日韩欧美亚洲成人| 日韩电影免费在线观看中文字幕| 亚洲精品一区二区网址| 日韩av日韩在线观看| 精品美女国产在线| 国产精品91视频| 久久久精品欧美| 国产婷婷97碰碰久久人人蜜臀| 亚洲欧美激情精品一区二区| 成人在线一区二区| 亚洲图片制服诱惑| 国产精品影院在线观看| 亚洲精品在线观看www| 中文字幕少妇一区二区三区| 92版电视剧仙鹤神针在线观看| 欧美一级黄色网| 热久久99这里有精品| 欧美插天视频在线播放| 深夜福利日韩在线看| 欧美精品在线网站| 91精品啪在线观看麻豆免费| 久久国内精品一国内精品| 欧美性videos高清精品| 久久精品久久久久| 欧美影院成年免费版| 国产91在线视频| 国产在线播放不卡| 久久久久久噜噜噜久久久精品| 色偷偷偷综合中文字幕;dd| 国产日韩欧美在线视频观看| 2018中文字幕一区二区三区| 亚洲精美色品网站| 欧美裸身视频免费观看| 国产在线999| 色狠狠久久aa北条麻妃| 国外色69视频在线观看| 久久久久久com| 影音先锋欧美在线资源| 日韩成人xxxx| 亚洲第一网站免费视频| 亚洲精品国产综合区久久久久久久| 一区二区欧美亚洲| 91啪国产在线| 在线观看欧美日韩国产| 国内精品模特av私拍在线观看| 久久久999国产| 日韩av最新在线| 亚洲深夜福利在线| 视频一区视频二区国产精品| 久久伊人色综合| 亚洲男人天堂网站| 自拍偷拍亚洲精品| 一区二区在线视频播放| 中文亚洲视频在线| 日韩av黄色在线观看| 亚洲国产高清福利视频|