<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    sigaction函數的使用

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 sigaction函數的功能是檢查或修改與指定信號相關聯的處理動作(可同時兩種操作)。 他是POSIX的信號接口,而signal()是標準C的信號接口(如果程序必須在非POSIX系統上運行,那么就應該使用這個接口) 給信號signum設置新的信號處理函數act, 同時保留該信號原有的信號處理函數oldact int sigaction(int signo,const struct sigaction *restrict act,               struct sigaction *restrict oact); 結構sigaction定義如下: struct sigaction{   void (*sa_handler)(int);    sigset_t sa_mask;   int sa_flag;   void (*sa_sigaction)(int,siginfo_t *,void *); }; sa_handler字段包含一個信號捕捉函數的地址 sa_mask字段說明了一個信號集,在調用該信號捕捉函數之前,這一信號集要加進進程的信號屏蔽字中。僅當從信號捕捉函數返回時再將進程的信號屏蔽字復位為原先值。 sa_flag是一個選項,主要理解兩個 SA_INTERRUPT 由此信號中斷的系統調用不會自動重啟 SA_RESTART 由此信號中斷的系統調用會自動重啟 SA_SIGINFO 提供附加信息,一個指向siginfo結構的指針以及一個指向進程上下文標識符的指針 最后一個參數是一個替代的信號處理程序,當設置SA_SIGINFO時才會用他。 例子: #include #include #include   void show_handler(int sig) {     printf("I got signal %d\n", sig);     int i;     for(i = 0; i < 5; i++) {         printf("i = %d\n", i);         sleep(1);     } }   int main(void) {     int i = 0;     struct sigaction act, oldact;     act.sa_handler = show_handler;     sigaddset(&act.sa_mask, SIGQUIT); //見注(1)     act.sa_flags = SA_RESETHAND | SA_NODEFER; //見注(2)     //act.sa_flags = 0; //見注(3)       sigaction(SIGINT, &act, &oldact);     while(1) {         sleep(1);         printf("sleeping %d\n", i);         i++;     } }   注: (1)    如果在信號SIGINT(Ctrl + c)的信號處理函數show_handler執行過程中,本進程收到信號SIGQUIT(Crt+\),將阻塞該信號,直到show_handler執行結束才會處理信號SIGQUIT。   (2)    SA_NODEFER       一般情況下, 當信號處理函數運行時,內核將阻塞<該給定信號 -- SIGINT>。但是如果設置了SA_NODEFER標記, 那么在該信號處理函數運行時,內核將不會阻塞該信號。 SA_NODEFER是這個標記的正式的POSIX名字(還有一個名字SA_NOMASK,為了軟件的可移植性,一般不用這個名字)            SA_RESETHAND    當調用信號處理函數時,將信號的處理函數重置為缺省值。 SA_RESETHAND是這個標記的正式的POSIX名字(還有一個名字SA_ONESHOT,為了軟件的可移植性,一般不用這個名字)      (3)    如果不需要重置該給定信號的處理函數為缺省值;并且不需要阻塞該給定信號(無須設置sa_flags標志),那么必須將sa_flags清零,否則運行將會產生段錯誤。但是sa_flags清零后可能會造成信號丟失!  

    sigaction

        sigaction(查詢或設置信號處理方式)     相關函數 signal,sigprocmask,sigpending,sigsuspend, sigemptyset     表頭文件 #include     定義函數 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);     函數說明 sigaction()會依參數signum指定的信號編號來設置該信號的處理函數。參數signum可以指定SIGKILL和SIGSTOP以外的所有信號。     如參數結構sigaction定義如下     struct sigaction {     union{     __sighandler_t sa_handler;     void (*_sa_sigaction)(int,struct siginfo *, void *);     }_u     sigset_t sa_mask;     unsigned long sa_flags;     void (*sa_restorer)(void);     }     信號處理函數可以采用void (*sa_handler)(int)或void (*sa_sigaction)(int, siginfo_t *, void *)。到底采用哪個要看sa_flags中是否設置了SA_SIGINFO位,如果設置了就采用void (*sa_sigaction)(int, siginfo_t *, void *),此時可以向處理函數發送附加信息;默認情況下采用void (*sa_handler)(int),此時只能向處理函數發送信號的數值。     sa_handler此參數和signal()的參數handler相同,代表新的信號處理函數,其他意義請參考signal()。     sa_mask 用來設置在處理該信號時暫時將sa_mask 指定的信號擱置。     sa_restorer 此參數沒有使用。     sa_flags 用來設置信號處理的其他相關操作,下列的數值可用。      sa_falgs還可以設置其他標志:     SA_RESETHAND:當調用信號處理函數時,將信號的處理函數重置為缺省值SIG_DFL     ··SA_RESTART:如果信號中斷了進程的某個系統調用,則系統自動啟動該系統調用     SA_NODEFER :一般情況下, 當信號處理函數運行時,內核將阻塞該給定信號。但是如果設置了 SA_NODEFER標記, 那么在該信號處理函數運行時,內核將不會阻塞該信號     sigaction

    sigaction()

    示例

      #include     static void int_hander(int s)     {     printf("Catch a signal sigint\n");     }     int     main(void)     {     int i;     struct sigaction act, oact;     act. sa_handler = int_hander;     sigemptyset(&act. sa_mask); //清空此信號集     act. sa_flags = 0;     sigaction(SIGINT, &act, &oact);     //signal(SIGINT, SIG_IGN);     while(1){     for(i=0; i<5; i++){     write(1, ".", 1);     sleep(1);     }     write(1, "\n", 1);     }     sigaction(SIGINT, &oact, NULL); //恢復成原始狀態     return 0;     } RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全