UNIX:高級環境編程 - 第十五章 IPC:進程間通訊

  IPC(InterProcess Communication)進程間通訊.爲啥沒有進程間通訊,這是由於進程間都是同步的關係,不須要通訊.shell

1.管道服務器

1.1管道特色:
函數

  (1)半雙工的(即數據只能在一個方向上流動),某些系統提供全雙工的管道.測試

  (2)管道只能在具備公共祖先的兩個進程之間使用.一般,一個管道由一個進程建立,在進程調用fork後,這個管道就能在父子進程之間通訊了.this

1.2使用:spa

  (1)在管道中鍵入一條命令,讓shell執行,shell會爲每一條命令單首創建一個進程,而後用管道將淺一條命令進程的標準輸出與後一條命令的標準輸入連接.  線程

  (2)管道經過調用pipe函數來建立:code

#include<unistd.h>
int pipe(int fd[2]);
#include "apue.h"

int
main(void)
{
    int n;
    int fd[2];
    pid_t pid;
    char line[MAXLINE];

    if (pipe(fd) < 0)
        err_sys("pipe error");
    if ((pid = fork()) < 0){
        err_sys("fork error");
    }else if(pid > 0){        /* parent */
        close(fd[0]);
        write(fd[1], "hello son, this is from your dad\n", 33);
    }else{        /* child */
        close(fd[1]);
        n = read(fd[0], line, MAXLINE);
        write(STDOUT_FILENO, line, n);
    }
    exit(0);
}

1.3原理:對象

  首先父進程建立一個父進程到父進程的管道,而後fork獲得子進程,子進程一樣獲得了父進程的管道.而後父進程關閉讀端,子進程關閉寫端.從而獲得了一條父進程寫 子進程讀的管道.blog

1.4 popen和pclose:

  常見的操做是建立一個連接到另外一個進程的管道,而後讀其輸出或向其輸入端發送數據,爲此,標準I/O庫提供了兩個函數popen和pclose來實現這樣的操做:建立一個管道,fork一個子進程,關閉未使用的管道端,執行一個shell運行命令,而後等待命令終止.

 

2.FIFO

  FIFO有時被稱爲命名管道.未命名的管道只能在兩個相關的進程之間使用,並且這兩個相關進程還要有一個共同的建立他們的祖先.

可是FIFO,不相關的進程也能夠交換數據.

  FIFO是一種文件類型.建立FIFO相似於建立一個文件.

2.1用途:

  (1)shell命令使用FIFO將數據從一條管道傳送到另外一條時,無需建立中間文件;

    用FIFO複製輸出流

  (2)客戶進程-服務器進程應用程序中,FIFO用做匯聚點,在客戶進程和服務器進程兩者之間傳遞數據.

    使用FIFO進行客戶進程-服務器進程通訊

 

XSI IPC(消息隊列\信號量或者共享存儲器)

  標識符和鍵:

    每一個內核中的IPC結構(消息隊列\信號量或者共享存儲器)都用一個非負整數的標識符加以引用.

    每一個IPC對象都與一個鍵(key)相關聯,將這個鍵做爲該對象的外部名.

  權限結構:

 

3 消息隊列

  消息隊列是消息的連接表,存儲在內核中,由消息隊列標識符標識.與命名管道同樣,消息隊列能夠在不相關進程之間進行通訊.兩者都是經過發送和接收的方式來傳遞數據的.

  在命名管道中  發送數據write    接收數據read  

  在消息隊列中  發送數據msgsnd    接收數據msgrcv

  他們對每一個數據都有一個最大長度的限制.

 

4 信號量

  信號量是一個計數器,他與IPC機構(管道 FIFO 消息隊列)不一樣.

  信號量主要用來爲多個進程提供對共享數據對象的訪問.

  爲了得到共享資源,進程須要執行下列操做:

  (1)測試控制該資源的信號量.

  (2)若此信號量的值未正,則進程能夠是使用該共享資源.在這種狀況下,進程會將信號量-1,表示它使用了一個資源單位.

  (3)不然,若信號量=0,則進程進入休眠狀態,直至信號量>0

  信號量值的測試以及減1操做應該是原子操做.

4.1分類:

  (1)內核信號量, 由內核控制路徑使用

  (2)用戶態進程使用的信號量,又分POSIX信號量和SYSTEM V信號量。

      POSIX信號量又分爲有名信號量和無名信號量。
        有名信號量,其值保存在文件中, 因此它能夠用於線程也能夠用於進程間的同步。

        無名信號量,其值保存在內存中。

信號量 記錄鎖和互斥量的時間比較:  

  若是在多個進程間共享一個資源,可使用這3種技術中的一種來協調訪問.

 

5 共享存儲:

  共享存儲容許兩個或以多個進程共享一個給定的存儲區.(同一邏輯內存)由於數據不須要在客戶進程和服務器進程之間複製,因此是最快的一種IPC.

  有一個數據同步的問題,就是在服務端在向內存裏面寫數據完成以前,不該當又客戶端取數據,一般,信號量用於同步共享存儲訪問.(也可使用 記錄鎖 或 互斥量)

相關文章
相關標籤/搜索