<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

    intsigaction(int signo,conststruct sigaction*restrict act,

                 struct sigaction*restrict oact);

     

    結構sigaction定義如下:

    structsigaction{
      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_NODEFER:  當信號處理函數正在進行時,不堵塞對于信號處理函數自身信號功能。
    SA_RESETHAND:當用戶注冊的信號處理函數被執行過一次后,該信號的處理函數被設為系統默認的處理函數。

    SA_SIGINFO 提供附加信息,一個指向siginfo結構的指針以及一個指向進程上下文標識符的指針

    最后一個參數是一個替代的信號處理程序,當設置SA_SIGINFO時才會用他。

     

     

     

     

    使用示例為:

     

    [html] view plaincopy在CODE上查看代碼片派生到我的代碼片  
    1. #include <stdio.h>  
    2. #include <signal.h>  
    3.   
    4.   
    5. void WrkProcess(int nsig)  
    6. {  
    7.         printf("WrkProcess .I get signal.%d threadid:%d/n",nsig,pthread_self());  
    8.   
    9.   
    10.         int i=0;  
    11.         while(i<5){  
    12.                 printf("%d/n",i);  
    13.                 sleep(1);  
    14.                 i++;  
    15.         }  
    16. }  
    17.   
    18. int main()  
    19. {  
    20.         struct sigaction act,oldact;  
    21.         act.sa_handler  = WrkProcess;  
    22. //      sigaddset(&act.sa_mask,SIGQUIT);  
    23. //      sigaddset(&act.sa_mask,SIGTERM)  
    24.         act.sa_flags = SA_NODEFER | SA_RESETHAND;    
    25. //        act.sa_flags = 0;  
    26.   
    27.         sigaction(SIGINT,&act,&oldact);  
    28.   
    29.         printf("main threadid:%d/n",pthread_self());  
    30.   
    31.         while(1)sleep(5);  
    32.   
    33.         return 0;  
    34. }  

     

     

     

     

    1)執行改程序時,ctrl+c,第一次不會導致程序的結束。而是繼續執行,當用戶再次執行ctrl+c的時候,程序采用結束。

     

    2)如果對程序稍微進行一下改動,則會出現另外一種情況。

    改動為:act.sa_flags = SA_NODEFER;

    經過這種改變之后,無論對ctrl+d操作多少次,程序都不會結束。

     

    3)下面如果再對程序進行一次改動,則會出現第三種情況。

     

    For example:  act.sa_flags = 0;

    在執行信號處理函數這段期間,多次操作ctrl+c,程序也不會調用信號處理函數,而是在本次信號處理函數完成之后,在執行一次信號處理函數(無論前面產生了多少次ctrl+c信號)。

    如果在2)執行信號處理函數的過程中,再次給予ctrl+c信號的時候,會導致再次調用信號處理函數。

    4)如果在程序中設置了sigaddset(&act.sa_mask,SIGQUIT);程序在執行信號處理函數的過程中,發送ctrl+/信號,程序也不會已經退出,而是在信號處理函數執行完畢之后才會執行SIGQUIT的信號處理函數,然后程序退出。如果不添加這項設置,則程序將會在接收到ctrl+/信號后馬上執行退出,無論是否在ctrl+c的信號處理函數過程中。

     

     

    原因如下:

    1)情況下,第一次產生ctrl+c信號的時候,該信號被自己設定的信號處理函數進行了處理。在處理過程中,由于我們設定了SA_RESETHAND標志位,又將該信號的處理函數設置為默認的信號處理函數(系統默認的處理方式為IGN),所以在第二次發送ctrl+d信號的時候,是由默認的信號處理函數處理的,導致程序結束;

    2)情況下,我們去掉了SA_RESETHAND了標志位,導致程序中所有的ctrl+d信號均是由我們自己的信號處理函數來進行了處理,所以我們發送多少次ctrl+c信號程序都不會退出;

    3)情況下,我們去掉了SA_NODEFER標志位。程序在執行信號處理函數過程中,ctrl+c信號將會被阻止,但是在執行信號處理函數期發送的ctrl+c信號將會被阻塞,知道信號處理函數執行完成,才有機會處理信號函數執行期間產生的ctrl+c,但是在信號函數執行產生的多次ctrl+c,最后只會產生ctrl+c。2)情況下,由于設置了SA_NODEF,ctrl+c信號將不會被阻塞。所以能夠并行執行下次的信號處理函數。

    4)情況下,我們是設置了在執行信號處理函數過程中,我們將屏蔽該信號,當屏蔽該信號的處理函數執行完畢后才會進行處理該信號。

     

     

     

    附:

    當我們按下ctrl+c的時候,操作為:向系統發送SIGINT信號,SIGINT信號的默認處理,退出程序。

    當我們按下ctrl+/的時候,操作為:向系統發送SIGQUIT信號,該信號的默認處理為退出程序。

     

     

    FROM:  http://blog.csdn.net/jiang1013nan/article/details/5409684

     

    參考: sigaction函數解析

    http://blog.chinaunix.net/uid-1877180-id-3011232.html

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全