<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>
  • 網站首頁 > 物聯資訊 > 技術分享

    linux c 之signal 和sigaction區別

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    http://blog.csdn.net/muge0913/article/details/7331129

     

    要對一個信號進行處理,就需要給出此信號發生時系統所調用的處理函數。可以對一個特定的信號(除去SIGKILL和SIGSTOP信號)注冊相應的處理函數。注冊某個信號的處理函數后,當進程接收到此信號時,無論進程處于何種狀態,就會停下當前的任務去執行此信號的處理函數。

     

    1、注冊信號函數。

     

    [cpp] view plaincopyprint?  
    1. #include<signal.h>  
    2.   
    3. void(*signal(int signumber,void ((*func)(int))(int)  

     

     

    signumber表示信號處理函數對應的信號。func是一個函數指針。此函數有一整型參數,并返回void型。其實func還可以取其他定值如:SIG_IGN,SIG_DFL.

    SIG_IGN表示:忽略signumber所指出的信號。SIG_DFL表示表示調用系統默認的處理函數。signal函數的返回值類型同參數func,是一個指向某個返回值為空并帶有一個整型參數的函數指針。其正確返回值應為上次該信號的處理函數。錯誤返回SIG_ERR

    signal示例如下:

     

    [cpp] view plaincopyprint?  
    1. #include <stdio.h>  
    2.   
    3. #include <sys/types.h>  
    4.   
    5. #include <stdlib.h>   
    6.   
    7. #include <signal.h>   
    8.   
    9. void func(int sig)   
    10. {  
    11. printf("I get asignal!\n");  
    12. }   
    13. int main()   
    14. {    charbuffer[100];   
    15.   
    16.    if(signal(SIGINT, func) == SIG_ERR)  
    17.      {  
    18.      printf("signalerror exit now\n");  
    19.      exit(0);  
    20.      }  
    21.      printf("pid:%ld\n",(long)getpid());  
    22.   
    23.    for(;;)  
    24.   
    25.      {  
    26.   
    27.      fgets(buffer,sizeof(buffer),stdin);  
    28.   
    29.      printf("bufferis:%s\n",buffer);  
    30.   
    31.      }  
    32.  return 0;   
    33. }   

     

     

    通常情況下一個用戶進程需要處理多個信號。可以在一個程序中注冊多個信號處理函數。一個信號可以對應一個處理函數,同時多個信號可以對應一個處理函數。

    對于SIGINT信號 我們可以用ctrl+c或ctrl+z來中斷進程,來執行SIGINT注冊的函數。

     

    2、 高級信號處理。

    在linux系統提供了一個功能更強的系統調用。

     

    [cpp] view plaincopyprint?  
    1. #include <signal.h>  
    2.   
    3. int sigaction(int signumbet,const structsigaction *act,struct sigaction *oldact)  

     

     

     此函數除能注冊信號函數外還提供了更加詳細的信息,確切了解進程接收到信號,發生的具體細節。

    struct sigaction的定義如下:在linux2.6.39/include/asm-generic/signal.h中實現

     

    [cpp] view plaincopyprint?  
    1. struct sigaction  
    2.   
    3. {  
    4.   
    5.      void(*sa_handler)(int);  
    6.   
    7.      void(*sa_sigaction)(int,siginfo_t *,void *);  
    8.   
    9.      sigset_tsa_mask;  
    10.   
    11.      intsa_flags;  
    12.   
    13. }  

     

     

    siginfo_t在linux2.6.39/include/asm-generic/siginfo.h中實現:

     

    sa_flags的取值如下表,取0表示選用所有默認選項。

    SA_NOCLDSTOP:用于表示信號SIGCHLD,當子進程被中斷時,不產生此信號,當且僅當子進程結束時產生此信號。

    SA_NOCLDWATI:當信號為SIGCHLD,時可避免子進程僵死。

    SA_NODEFER:當信號處理函數正在進行時,不堵塞對于信號處理函數自身信號功能。

    SA_NOMASK:同SA_NODEFER

    SA_ONESHOT:當用戶注冊的信號處理函數被執行過一次后,該信號的處理函數被設為系統默認的處理函數。

    SA_RESETHAND:同SA_ONESHOT

    SA_RESTART:是本來不能重新于運行的系統調用自動重新運行。

    SA_SIGINFO:表明信號處理函數是由SA_SIGACTION指定的,而不是由SA_HANDLER指定的,它將顯示更多的信號處理函數信息。

     

    其實sinaction完全可以替換signal函數

     

     

     

     

     

    [cpp] view plaincopyprint?  
    1. #include <stdio.h>   
    2. #include <sys/types.h>   
    3. #include <stdlib.h>    
    4. #include <signal.h>    
    5.   
    6.   
    7. void func(int sig)    
    8.   
    9. {  
    10.   
    11. printf("I get a signal!\n");   
    12.   
    13. }    
    14.   
    15. int main()    
    16.   
    17. {   char buffer[100];    
    18.   
    19.     struct sigaction act;  
    20.     act.sa_handler=func;  
    21.     sigemptyset(&act.sa_mask);  
    22.     act.sa_flags = 0;  
    23.   
    24.     if(sigaction(SIGINT,&act, NULL) == -1)  
    25.     {  
    26.     printf("sigaction error exit now\n");  
    27.     exit(0);  
    28.     }  
    29.   
    30.     printf("pid:%ld\n",(long)getpid());   
    31.   
    32.     for(;;)  
    33.     {  
    34.     fgets(buffer,sizeof(buffer),stdin);  
    35.     printf("buffer is:%s\n",buffer);  
    36.     }  
    37.   
    38.     return 0;    
    39.   
    40. }    



     

    RFID設備管理軟件

    RFID設備管理軟件

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