訊號(signal)機制是unix系統中最為古老的程序間通訊機制,有很多條件可以產生乙個訊號:
1、當使用者按某些按鍵時,產生訊號。
2、硬體異常產生訊號:除數為零,無效的儲存訪問等等。這些訊號通常有硬體檢測得到,將其通知核心,然後核心產生適當的訊號通知程序,例如:核心對正在訪問乙個無效儲存區的程序產生乙個sigsegv訊號。
3、程序用kill函式將訊號傳送給另乙個程序。
4、使用者可以用kill命令將訊號傳送給其他程序。
sighup:從終端發來的結束訊號
sigint:來自鍵盤的中斷訊號(ctrl+c)
sigkill:該訊號結束接收訊號的程序
sigterm:kill命令發出的訊號
sigchld:表示子程序停止或結束的訊號
sigstop:來自鍵盤(ctrl+z)或除錯程式的停止執行訊號
當某訊號出現時,將按下面三種方式中的一種處理:
1、忽略此訊號
大多數訊號都是按這種方式處理的,但有兩種訊號不能被忽略。sigkill和sigstop。這兩種訊號不能被忽略的原意是他們向超戶提供了一種終止或停止程序的一種方法。
2、執行使用者希望的動作
通知核心在某種訊號發生時,呼叫乙個使用者函式。在使用者函式中,執行使用者希望的處理。
執行系統預設動作
對大多數訊號的系統預設動作是終止該程序。
傳送訊號的主要訊號有kill和raise。
區別:
kill既可以向自身傳送訊號,也可以向其他程序傳送訊號。而raise函式是向程序自身傳送訊號。
kill的pid引數有四種不同情況:#include(sys/types.h)
#include(signal.h)
int kill(pid_t pid,int signo)
int raise(int signo)
1、pid>0
將訊號傳送給程序id為pid的程序。
2、pid==0
將訊號傳送給同組程序。
3、pid<0
將訊號傳送給其程序組id等於pid絕對值得程序。
4、pid==-1
將訊號傳送給所有程序。
alarm
使用alarm函式可以設定乙個時間值(鬧鐘時間),當到達所設定的時間,產生sigalrm訊號。如果不捕捉此訊號,則預設動作是終止該程序。
seconds:經歷指定的秒數後會產生訊號sigalrm。#include
insigned int alarm(unsigned
int seconds)
pause
pause函式使呼叫函式掛起直至捕捉到乙個訊號。
#include
int pause(void)
只有執行了乙個訊號處理函式後,掛起才結束。
§當系統捕捉到某個訊號時,可以忽略該訊號或是使用指定的處理函式來處理該訊號,或是使用系統預設的方式。
§§訊號的處理方法主要有兩種,一種是使用簡單的signal函式,另一種是使用訊號集函式組。
signal
func可能是:#include
void(*signal(int signo,void(*func)(int)))(int)
//可以理解為
//typedef void(*sighandler_t)(int)
//sighandler_t signal(int signum,sighandler_t handler)
1、sig_ign:忽略此訊號
2、sig_del:按系統預設方式處理
3、訊號處理函式名:使用該函式處理
這裡我們執行起程式之後用kill給程序傳送資訊。格式為:
kill -s 資訊 pid
程序號可以用:ps aux 檢視
例如我查的我的程序號為623 那麼我的傳送資訊格式為:kill -s sigquit 623
linux c開發(5 2)程序間通訊 管道通訊
什麼是管道?管道是單向的 先進先出的,他把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序 寫程序 在管道的尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料。管道建立 管道包括無名管道和有名管道兩種,前者用於父程序和子程序間的通訊,後者可用於同一系統中的任意兩個程序間的通訊。無名管道由pi...
linux C 程序間通訊 訊息佇列
linux 引入訊息佇列的原因是,實現對緊急事件的處理。可以為訊息設定優先順序 下面是乙個共享訊息佇列的例子,在linux2.6的核心中能夠執行,通過訊息佇列實現程序間的通訊,可以自己選擇優先順序,本列優先順序設定為子程序自己的pid.2.6中能夠執行,include include include...
Linux C 程序間的訊號通訊
1 訊號通訊 核心中存在64種訊號,即linux 核心可以傳送64種訊號,命令 kill l 可以檢視 a 訊號的傳送 kill raise alarm kill pid t pid,int sig raise int sig 等價於 kill getpid int sig 即發給自己 附 終止程序...