linux進程間的通信機制——信號

1.核心理論

  • 信號:在linux中信號是一個古老的進程間的通訊機制,就像古代烽火臺所起到的傳遞信號的作用一樣。

  • 信號處理流程
    信號通訊機制就分爲三步:選擇信號→發送信號→處理信號

  • 信號類型
    linux系統支持的所有信號均定義在usr/include/asm/signal.h中,其中常見的信號有:
    SIGKILL:殺死進程
    SIGSTOP:暫停進程
    SIGCHLD:子進程停止貨結束時用來通知父進程。

2.函數學習:

  • 發送信號函數:
    函數名:kill
    函數原型:int kill (pid_t pid, int sig)
    頭文件:sys/types.h signal.h
    功能:發送信號給一個進程
    返回值:成功返回0,失敗返回-1或者errno
    參數:pid:要發送信號的進程,sig:發送的信號。

  • 處理信號函數:
    函數名:signal
    函數原型:typedef void(*sighandler_t)(int)
    sighandler_t signal(int signum , sighandler_t handler)
    頭文件:signal.h
    功能:設置信號的處理方式
    返回值:成功返回的是處理函數的指針,失敗返回的值SIG_ERR
    參數:signum:要處理的信號
    handler:信號的處理方式
    可設置的方式:
    SIG_IGN忽視這個信號,
    SIG_DEL:交給內核處理,
    用戶自定義的函數:交給用戶處理函數處理

3.信號通信實例

  • 實例中用到的函數
    pause:等待進程發送函數。
    atoi:將字符串轉化成整型。

  • 發送進程

#include <sys/types.h>
#include <signal.h>
#include  <stdio.h>

void main(int argc,char *argv[])
{
    pid_t pid;

    pid = atoi(argv[1]);

    kill(pid,SIGINT);

}

注意:關於參數argc和argv[],前者是參數的個數,後者是要傳遞的參數名argc[0]是函數名,後面纔是傳遞的參數。

  • 處理進程
#include <unistd.h>
#include <signal.h>

void myfunc(int a)
{
    printf("process B recieve SIGINT\n");
}

void main()
{

    signal(SIGINT,myfunc);

    pause();

}

程序的執行過程:
首先打開b(處理函數進程)進程:./bprocess
然後發送信號:kill -n SIGINT b進程的進程號

執行結果:打印出process B recieve SIGINT

發佈了56 篇原創文章 · 獲贊 57 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章