程序間的通訊(訊號通訊)

琨为玉也發表於2024-06-05

程序間的通訊(訊號通訊)

程序的訊號通訊是作業系統中程序間通訊(IPC)的一種方式,它允許一個程序向另一個程序傳送一個訊號,從而改變另一個程序的狀態或執行某個操作。訊號是非同步的,意味著訊號的傳送和接收並不依賴於接收程序的執行狀態。

訊號通訊的基本概念

  1. 訊號型別:作業系統定義了一系列的訊號,如SIGINT(由中斷字元(通常是Ctrl+C)產生)、SIGTERM(請求終止程式)、SIGSEGV(非法記憶體訪問)等。
  2. 訊號處理函式:程序可以指定一個訊號處理函式來響應某個訊號。當訊號被髮送時,作業系統會中斷接收程序的執行,並呼叫相應的訊號處理函式。
  3. 傳送訊號:程序可以使用kill系統呼叫來向另一個程序傳送訊號。程序還可以使用raise系統呼叫來給自己傳送訊號。
  4. 訊號阻塞:程序可以選擇阻塞某些訊號,即暫時不接收這些訊號。

傳送訊號(使用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,作者將及時改正,歡迎與各位老爺交流討論。

麻煩三連加關注!!!!

比心

相關文章