IPC之訊號程式設計(2)

2021-08-04 14:24:07 字數 2005 閱讀 6698

訊號(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之前建立的記憶體對映關係由父子程序之間共享。我們在開啟檔案以後...