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

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

信號之sigaction函數

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

sigaction函數的功能是檢查或修改與指定信號相關聯的處理動作(或同時執行這兩種操作)。

#include <signal.h>int sigaction( int signo, const struct sigaction *restrict act, struct sigaction *restrict oact);返回值:若成功則返回0,若出錯則返回-1

其中,參數signo是要檢測或修改其具體動作的信號編號。若act指針非空,則要修改其動作。如果oact指針非空,則系統經由oact指針返回該信號的上一個動作。此函數使用下列結構:

struct sigaction {    void    (*sa_handler)(int);    /* addr of signal handler, or SIG_IGN, or SIG_DFL */    sigset_t    sa_mask;           /* additional signals to block */    int    sa_flags;               /* signal options */    /* alternate handler */    void    (*sa_sigaction)(int, siginfo_t *, void *);};

當更改信號動作時,如果sa_handler字段包含一個信號捕捉函數的地址(與常量SIG_IGN或SIG_DFL相對),則sa_mask字段說明了一個信號集,在調用該信號捕捉函數之前,這一信號集要加到進程的信號屏蔽字中。僅當從信號捕捉函數返回時再將進程的信號屏蔽字復位為原先值。這樣,在調用信號處理程序時就能阻塞某些信號。在信號處理程序被調用時,操作系統建立的新信號屏蔽字包括正被遞送的信號。因此保證了在處理一個給定的信號時,如果這種信號再次發生,那么它會被阻塞到對前一個信號的處理結束為止。

一旦對給定的信號設置了一個動作,那么在調用sigaction顯式地改變它之前,該設置就一直有效。(早期版本并非如此,而是:在進程每次接到信號對其進行處理時,隨即將該信號動作復位為默認值。見http://www.CUOXin.com/nufangrensheng/p/3515035.html)

act結構的sa_flags字段指定對信號進行處理的各個選項。

表10-5 處理每個信號的選項標志(sa_flags)

2012082515302617

sa_sigaction字段是一個替代的信號處理程序,當在sigaction結構中使用了SA_SIGINFO標志時,使用該信號處理程序。對于sa_sigaction字段和sa_handler字段這兩者,其實現可能使用同一存儲區,所以應用程序只能一次使用這兩個字段中的一個。

通常,按下列方式調用信號處理程序:

void handler(int signo);

但是,如果設置了SA_SIGINFO標志,那么按下列方式調用信號處理程序:

void handler(int signo, siginfo_t *info, void *context);

siginfo_t結構包含了信號產生原因的有關信息。該結構的大致樣式如下所示:

struct siginfo {    int      si_signo;        /* signal number */    int      si_errno;        /* if nonzero, errno value from <errno.h> */    int      si_code;         /* additional info (depends on signal) */    pid_t    si_pid;          /* sending PRocess ID */    uid_t    si_uid;          /* sending process real user ID */    void    *si_addr;         /* address that caused the fault */    int      si_status;       /* exit value or signal number */    long     si_band;         /* band number for SIGPOLL */    /* possibly other fields also */};

各種信號的si_code值(包括上面的相關數據結構和標志選項),可通過man sigaction命令進行查看。

若信號是SIGCHLD,則將設置si_pid、si_status和si_uid字段。

若信號是SIGILL或SIGSEGV,則si_addr包含造成故障的根源地址,盡管該地址可能并不準確。

若信號是SIGPOLL,那么si_band字段將包含STREAMS消息的優先級(priority band),該消息產生POLL_IN、POLL_OUT或POLL_MSG事件。

si_errno字段包含錯誤編號,它對應于引發信號產生的條件,并由實現定義。

信號處理程序的context參數是無類型指針,它可被強制轉換為ucntext_t結構類型,用于標識信號傳遞時進程的上下文。

實例:signal函數

現在用sigaction實現signal函數。很多平臺都是這樣做的。

程序清單10-12 用sigaction實現signal函數

#include "apue.h"/* Reliable version of signal(), using POSIX sigaction(). */Sigfunc *signal(int signo, Sigfunc *func){    struct sigaction    act, oact;        act.sa_handler = func;    sigemptyset(&act.sa_mask);    act.sa_flags = 0;    if(signo == SIGALRM)    {#ifdef    SA_INTERRUPT        act.sa_flags |= SA_INTERRUPT;#endif    }    else    {#ifdef    SA_RESTART        act.sa_flags |= SA_RESTART;#endif    }    if(sigaction(signo, &act, &oact) < 0)        return(SIG_ERR);    return(oact.sa_handler);}

注意,必須用sigemptyset函數初始化act結構的sa_mask成員。不能保證:act.sa_mask = 0;會做同樣的事情。

對除SIGALRM以外的所有信號,我們都有嘗試設置SA_RESTART標志,于是被這些信號中斷的系統調用都能自動重啟動。不希望重啟動由SIGALRM信號中斷的系統調用的原因是:我們希望對I/O操作可以設置時間限制。

實例:signal_intr函數

程序清單10-13是signal函數的另一種版本,它力圖阻止任何被中斷的系統調用重啟動。

程序清單10-13 signal_intr函數

#include "apue.h"Sigfunc *signal_intr(int signo, Sigfunc *func){    struct sigaction     act, oact;    act.sa_handler = func;    sigemptyset(&act.sa_mask);    act.sa_flags = 0;#ifdef    SA_INTERRUPT    act.sa_flags |= SA_INTERRUPT;#endif    if(sigaction(signo, &act, &oact) < 0)        return(SIG_ERR);    return(oact.sa_handler);}

如果系統定義了SA_INTERRUPT標志,那么為了提高可移植性,我們在sa_flags中增加該標志,這樣也就阻止了被中斷的系統調用重啟動。

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧洲成人免费视频| 国产欧美日韩中文字幕在线| 亚洲国产欧美一区二区三区同亚洲| 91久久久久久久一区二区| 亚洲天堂成人在线| 福利视频导航一区| 久久综合伊人77777蜜臀| 亚洲精品中文字幕女同| 亚洲精品有码在线| 欧美黑人国产人伦爽爽爽| 精品国产91久久久久久老师| 日韩中文在线观看| 国产精品揄拍一区二区| 成人xvideos免费视频| 色妞色视频一区二区三区四区| 九九热这里只有在线精品视| 国模精品系列视频| 国产精品免费一区二区三区都可以| 欧美激情成人在线视频| 最近2019中文字幕第三页视频| 亚洲性猛交xxxxwww| 国产精品91久久久| 在线视频国产日韩| 亚洲一区二区三区视频| 91成人在线播放| 色yeye香蕉凹凸一区二区av| 亚洲美女精品成人在线视频| 国产色婷婷国产综合在线理论片a| 69久久夜色精品国产69| 亚洲美女又黄又爽在线观看| 91深夜福利视频| 亚洲国产天堂网精品网站| 欧美成人午夜激情| 亚洲美女精品久久| 国产成人在线一区| 亚洲图中文字幕| 正在播放国产一区| 亚洲www在线| 欧美精品福利视频| 日韩免费黄色av| 亚洲欧洲日产国码av系列天堂| 成人在线小视频| 午夜精品理论片| 91亚洲精品一区二区| 欧美一级大片在线免费观看| 国产福利成人在线| 国产福利精品av综合导导航| 亚洲综合社区网| 欧美精品久久久久久久久| 亚洲国产欧美一区| 日韩av中文字幕在线播放| 国产精选久久久久久| 国产一区二区三区在线观看网站| 亚洲欧美日韩国产中文| 亚洲一级一级97网| 日本精品一区二区三区在线播放视频| 亚洲天堂av女优| 亚洲女人被黑人巨大进入| 精品国产乱码久久久久久婷婷| 国产精品亚洲第一区| 一区二区三区视频观看| 欧美精品福利视频| 成人有码在线视频| 欧美性猛交xxxx黑人猛交| 欧美激情视频在线免费观看 欧美视频免费一| 69久久夜色精品国产69乱青草| 亚洲欧美三级伦理| 这里只有精品视频| 久久99精品久久久久久琪琪| 亚洲精品之草原avav久久| 尤物yw午夜国产精品视频明星| 日韩一区视频在线| 亚洲美女在线视频| 欧美性视频精品| 国内免费久久久久久久久久久| 亚洲人在线观看| 91av福利视频| 久久夜精品va视频免费观看| 久青草国产97香蕉在线视频| 亚洲成人av资源网| 欧美极品少妇与黑人| 亚洲人精品午夜在线观看| 欧美激情在线观看视频| 91久久久久久久| 国产精品欧美一区二区| 久久久免费高清电视剧观看| 日韩成人激情影院| 91网站免费观看| 欧美日韩在线观看视频| 久久中文久久字幕| 国产欧美日韩最新| 日韩精品丝袜在线| 精品国产一区二区三区久久狼5月| 色yeye香蕉凹凸一区二区av| 亚洲综合色激情五月| 国产久一一精品| 久久久精品国产| 午夜精品视频在线| 亚洲第一福利网| 精品亚洲一区二区三区四区五区| 久久av红桃一区二区小说| 国产成人一区二区三区| 国产精品中文字幕在线观看| 精品久久久久久久久国产字幕| 夜夜嗨av一区二区三区四区| 日韩欧美国产免费播放| 日韩视频亚洲视频| 中文字幕国产亚洲| 麻豆精品精华液| 国产婷婷97碰碰久久人人蜜臀| 福利一区福利二区微拍刺激| 国产成人精品一区| 一区二区三区四区视频| 欧美亚洲国产视频| 国产xxx69麻豆国语对白| 亚洲人成电影在线播放| 国产精品女主播| 欧美一区在线直播| 国产精品入口免费视频一| 日韩av网站电影| 国产在线观看不卡| 久久在线观看视频| 国产91色在线|| 日本精品免费观看| 大胆人体色综合| 欧美国产日产韩国视频| 欧美高清在线视频观看不卡| 深夜精品寂寞黄网站在线观看| 91在线视频九色| 国产精品一区二区性色av| 国产精品久在线观看| 久久天堂电影网| 精品久久久久久亚洲国产300| 欧美插天视频在线播放| 国产狼人综合免费视频| 亚洲激情在线视频| 欧美日韩一区二区三区| 日韩小视频在线观看| 国产成人在线亚洲欧美| 久久精品亚洲94久久精品| 91av在线国产| 国产精品亚洲一区二区三区| 欧美老女人性视频| 狠狠躁夜夜躁人人爽超碰91| 国产精品精品久久久| 国产精品成人一区二区| 国产精品羞羞答答| 97视频国产在线| 欧美亚洲一级片| 欧美激情女人20p| 亚洲精品自在久久| 日韩精品视频免费| 国产精品免费福利| 亚洲国产91色在线| 亚洲视频视频在线| 久久99久久99精品免观看粉嫩| 精品久久香蕉国产线看观看gif| 欧美色道久久88综合亚洲精品| 91久久久久久久| 热草久综合在线| 亚洲精品久久久久久久久久久| 精品动漫一区二区三区| 亚洲视频一区二区| 久久精品视频中文字幕|