捕獲信號

pause函數掛起調用它的進程,直到有任何消息到達。
調用進程必須由能力處理送達的信號,不然信號的默認部署就會發生。。

#include <unistd.h>編程

int pause(void);數組

只有進程捕獲到一個信號的時候pause才返回,若是遞送到的信號引起了對信號的處理,那麼處理工做將在pause返回前執行。
pause老是返回-1,而且變量errno設置爲EINTR。
 
 
發送信號和捕獲信號是相輔相成的。
每一個進程可以決定響應除了SIGSTOP和SIGKILL以外的其餘全部信號
SIGSTOP和SIGKILL不能被捕獲或者忽略。
捕獲信號不是真的去捕獲它,而是等待信號被髮送過來。
 
 
當執行一個程序的時候,全部信號的狀態都是系統默認或者忽略。
當一個進程調用fork的時候,其子進程繼承父進程的信號處理方式,因此信號捕捉函數的地址在子進程中是有意義的。
 
 
 
定義信號處理器。
某些狀況下,一個信號的默認動做就是所但願的行爲。但更多場合下,你能夠改變默認行爲或者執行額外的代碼。
若是想改變默認行爲就必須定義並安裝一個自動以的信號處理器。
 
 
 
指向函數的指針
  –能夠用指針變量指向整形變量、字符串、數組、結構體、也能夠指向一個函數。
  –一個函數在編譯時被分配一個入口地址。這個入口地址就稱爲函數指針。
  –能夠用一個指針變量指向函數,而後經過該指針變量調用此函數
 
 
 
函數指針例子
int func(int i1,int i2)
{
    return i1 + i2;
}

int main()
{
    int (*pfunc)(int, int) ;
    pfunc = func;
    printf("%d\n", pfunc(3, 5));
    return 0;
}
回調函數
  –回調函數就是一個經過函數指針調用的函數。
  –若是把函數的指針(地址)做爲參數傳遞給另外一個函數,當這個指針被用來調用其所指向的函數時,咱們就說這是回調函數。
  –回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
  –Windows編程下的窗口過程就是典型的回調函數。
 
 
 
signal函數
  –UNIX/Linux處理信號最經常使用的接口是signal函數
•在命令行使用kill命令,向指定進程發送信號。
  –使用kill函數

#include <signal.h>函數

void (*signal(int signo, void (*func)(int))) (int);spa

參數signo是前面表格中的信號名。
參數func是接到此信號後要調用的函數。該函數有個int型參數,int表明捕獲到的信號值
 
 
 
進程捕捉到信號並對信號進行處理時,進程正在執行的指令序列就被信號處理程序臨時中斷,它首先執行該信號處理程序中的指令。
若是信號處理程序返回(沒有調用exit(0)或者abort),則繼續執行在捕捉到信號時進程正在執行的正常指令序列。
在信號處理程序中,不能判斷捕捉到信號時進程正在何處執行。
 
 
signal函數例子
 
void catch_Signal(int Sign)
{
    switch(Sign)
    {
    case SIGINT:
        printf("SIGINT Signal\n");
    }
}
int main(int arg, char *args[])
{
    signal(SIGINT, catch_Signal);
    pause();
    return 0;
}

 

編譯後執行該程序
用kill命令發送信號給該程序
  –kill命令做用其實不是‘殺死’的意思,而是將指定信號發送給指定進程。
 
 
 
 
 
 
 
 
 
相關文章
相關標籤/搜索