進程間的信號通信

1.信號通信:
信號(signal)機制是Unix系統中最爲古老的進程間通信機制,很多條件可以產生一個信號:
(1)當用戶按某些按鍵時,產生信號。    
(2)硬件異常產生信號:除數爲0,無效的存儲訪問等等。這些情況通常由硬件檢測到,將其通知內核,然後內核產
生適當的信號通知進程,例如,內核對正訪問一個無效存儲區的進程產生一個SIGSEGV信號。     
(3)進程用kill函數將信號發送給另一個進程。
(4)用戶可用kill命令將信號發送給其他進程。
2.信號類型:
下面是幾種常見的信號:
(1)SIGHUP: 從終端上發出的結束信號。
(2)SIGINT: 來自鍵盤的中斷信號(Ctrl-C)。
(3)SIGKILL:該信號結束接收信號的進程,殺死進程。
(4)SIGTERM:kill 命令發出的信號。
(5)SIGCHLD:子進程停止或結束時通知父進程。
(6)SIGSTOP:來自鍵盤(Ctrl-Z)或調試程序的停止執行信號,暫停進程。
3.信號處理:
當某信號出現時,將按照下列三種方式中的一種進行處理:
(1)忽略此信號:大多數信號都按照這種方式進行處理,但有兩種信號決不能被忽略,它們是:SIGKILL\SIGSTOP。
這兩種信號不能被忽略的原因是:
它們向超級用戶提供了一種終止或停止進程的方法。
(2)執行用戶希望的動作:
通知內核在某種信號發生時,調用一個用戶函數。在用戶函數中,執行用戶希望的處理。
(3)執行系統默認動作:
對大多數信號的系統默認動作是終止該進程。
4.幾個有關信號處理的函數:
 (1)kill
 函數功能:發送信號給指定的進程
 函數的原型: int kill(pid_t pid, int sig);
 函數的參數:傳送指給定的sig信號給參數pid;
                       pid > 0: 進程號爲pid的進程;
                       pid = 0; 把信號傳給和目前進程同進程組的所有進程;
                       pid = -1,  把信號給系統內所有的進程;
                       pid  <0 ;  傳給進程組號爲pid絕對值的所有進程;
  返回值:   成功爲0,出錯-1;
  頭文件:  #include <sys/types.h>
            #include <signal.h> 
    
(2) raise
函數的作用:向進程自身發送一個信號;
函數的原型: int  raise(int sig);
返回值:成功是0,出錯-1;
頭文件:#include <signal.h>
(3)alarm
函數的作用:設置鬧鐘信號,scod時間後SOGALRM信號傳送給目前的進程;
函數的原型: unsigned int alarm(unsigned int sceconds);
返回值: 返回之前鬧鐘的剩餘秒數, 未設鬧鐘返回0;
(4) pause
函數的作用:  市當前進程掛起,直至捕獲到一個信號;
函數的原型:int  pause(void)
頭文件: #include <unistd.h>
(5)signal
函數的作用:  設置信號處理方式
函數的原型:void ( * signal (int signum, void  ( *handler ) (int) ) )(int)
這樣看函數很難理解,我們可以對其進行下面的操作,就容易理解
typedef   void (*handler) (int) ) sighandler_t
signal (int signum, sighandler_t handler);
函數說明:signal()會依參數signum指定的信號編號來設置該信號的處理函數,當指定信號到達時就會跳轉到參數
handler指定的函數執行。如果參數handler不是函數指針,則必須是下列兩個常量之一:
SIG_IGN:忽略參數signum指定的信號。
SIG_DFL:將參數signum指定的信號重設爲核心預設的信號處理方式。
返回值:返回先前的信號處理函數,如果出錯則返回-1。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章