程序間的通訊(訊號通訊)
程序的訊號通訊是作業系統中程序間通訊(IPC)的一種方式,它允許一個程序向另一個程序傳送一個訊號,從而改變另一個程序的狀態或執行某個操作。訊號是非同步的,意味著訊號的傳送和接收並不依賴於接收程序的執行狀態。
訊號通訊的基本概念
- 訊號型別:作業系統定義了一系列的訊號,如SIGINT(由中斷字元(通常是Ctrl+C)產生)、SIGTERM(請求終止程式)、SIGSEGV(非法記憶體訪問)等。
- 訊號處理函式:程序可以指定一個訊號處理函式來響應某個訊號。當訊號被髮送時,作業系統會中斷接收程序的執行,並呼叫相應的訊號處理函式。
- 傳送訊號:程序可以使用
kill
系統呼叫來向另一個程序傳送訊號。程序還可以使用raise
系統呼叫來給自己傳送訊號。 - 訊號阻塞:程序可以選擇阻塞某些訊號,即暫時不接收這些訊號。
傳送訊號(使用kill
)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
int main() {
pid_t pid; // 目標程序的PID
// 假設我們有一個程序ID為target_pid的程序
pid = 12345; // 替換為實際的程序ID
// 傳送SIGTERM訊號給目標程序
if (kill(pid, SIGTERM) == -1) {
perror("kill");
exit(EXIT_FAILURE);
}
printf("SIGTERM訊號已傳送給程序%d\n", pid);
return 0;
}
接收訊號並處理(設定訊號處理函式)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
// 訊號處理函式
void handle_sigterm(int signum) {
printf("接收到訊號%d,開始清理並退出...\n", signum);
// 在這裡執行清理操作,如關閉檔案、釋放資源等
exit(0); // 退出程式
}
int main() {
// 設定SIGTERM訊號的處理函式
if (signal(SIGTERM, handle_sigterm) == SIG_ERR) {
perror("signal");
exit(EXIT_FAILURE);
}
// 模擬程序正在執行
while (1) {
printf("程序正在執行...\n");
sleep(1);
}
return 0;
}
在這個例子中,我們首先定義了一個訊號處理函式handle_sigterm
,它會在接收到SIGTERM
訊號時被呼叫。然後,我們使用signal
函式將SIGTERM
訊號的處理函式設定為handle_sigterm
。最後,我們進入一個無限迴圈來模擬程序正在執行。當SIGTERM
訊號被髮送到該程序時,handle_sigterm
函式會被呼叫,然後程式會執行清理操作並退出。
如果程式碼用法有什麼問題,請將問題發至網易郵箱 m17872844806@163.com,作者將及時改正,歡迎與各位老爺交流討論。
麻煩三連加關注!!!!
比心