訊號(signal)機制是unix系統最為古老的程序間通訊機制,很多條件可以產生訊號:
(1)單使用者按某些按鍵時,產生訊號。
(2)硬體異常產生訊號:除數為0、無效的儲存訪問等等。這些情況由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如,核心對正在訪問乙個無效儲存區的程序產生乙個sigegv訊號。
(3)程序用 kill 函式將訊號傳送給另乙個程序。
(4)使用者可以用kill命令將訊號傳送給其他程序。
幾種常見的訊號(signum):
sigint : 來自鍵盤(ctrl + c)的中斷訊號。
sigkill:該訊號結束接收訊號的程序。
sighup:從終端發出的結束訊號。
sigterm:kill 命令發出的訊號。
sigchld:標誌子程序停止或結束的訊號。
sigstop:來自鍵盤(ctrl + z)或除錯程式的停止執行訊號。
當某訊號出現時,將按照以下三種方式中的一種進行處理:
(1)忽略此訊號:大多數訊號都按照這種方式進行處理,但是有兩種訊號決不能被忽略– sigkill 和 sigstop。因為它們向 root 使用者提供了一種終止程序的方法。
(2)執行使用者期望的動作:通知核心在某種訊號發生時,呼叫乙個使用者函式,在使用者函式中,執行使用者期望的處理。
(3)執行系統預設的動作:絕大多數訊號的系統預設動作是終止該程序。
#include
void (*signal(int signum, void(*func)(int)))(int);
其中:
typedef void (*sighandler_t)(int)
sighandler_t (int signum, sighandler_t handler)
func可能的值是:
1、sig_ign:忽略此訊號。
2、sig_del:安系統預設方式處理。
3、訊號處理函式:使用使用者處理函式處理。
傳送訊號的主要函式有 kill 和 raise。
二者區別:
kill 既可以向自身傳送訊號,也可以向其他程序傳送訊號。與 kill 函式不同的是,raise函式只向自身傳送訊號。
#include
#include
int kill(pid_t pid, int signum);
int raise(int signum);
kill 函式 pid 引數四種不同的情況:
(1)pid > 0
將訊號傳送給程序 id 為 pid 的程序。
(2)pid == 0
將訊號傳送給同組的程序。
(3)pid < 0
將程序傳送給程序 id 等於 pid 絕對值的程序。
(4)pid == -1
將程序傳送給所有程序。
#include
unsigned
int alarm(unsigned
int seconds);
功能:經過 seconds 秒後會產生乙個sigalarm訊號。
#include
int pause(void);
功能:pause函式是呼叫程序掛起直至捕捉乙個訊號才結束程序。
#include
void handlerfunc(int signum)
else
if (signum == sigquit)
}int main(int argc, const
char *argv)
在終端輸入ps -aux
即可查詢程序號,然後在終端輸入kill -s sigint [pid]
或者kill -s sigquit [pid]
即可產生乙個 sigint 訊號或者 sigquit 訊號。 Linux Unix程式設計 程序通訊IPC 訊號量
訊號量是為了控制臨界資源而產生的乙個或一組計數器,在本質上是乙個整形變數 p操作 程序申請臨界資源是發出p操作 流程 檢查訊號量取值,如大於0,分配臨界資源,訊號量減1,否則代表當前無空餘資源,程序阻塞直到指定資源到達為止。v操作 程序釋放臨界資源時發生v操作 流程 釋放臨界資源,訊號量的取值加1 ...
IPC物件之訊號量
1.訊號量 1 訊號量 semaphore 也叫訊號燈。它是不同程序間或乙個給定程序內部不同執行緒間同步的機制。2 二值訊號量 值為0或1。與互斥鎖類似,資源可用時值為1,不可用時值為0。3 計數訊號量 值在0到n之間。同來統計資源,其值代表可用資源數。4 等待操作是等待訊號量的值變為大於0,然後將...
IPC之共享記憶體(2)
在記憶體對映檔案中給計數器持續加1 本程式的目的是使父子程序之間共享存放著計數器的乙個記憶體區 int main exit 0 for i 0 i nloop i exit 0 共享乙個記憶體區和乙個訊號量的父子程序 父程序在呼叫fork之前建立的記憶體對映關係由父子程序之間共享。我們在開啟檔案以後...