天天看點

程序通信基礎

程序同步與程序通信很容易混淆,它們的差別在于:

  • 程序同步:控制多個程序按一定順序執行;
  • 程序通信:程序間傳輸資訊。

程序通信是一種手段,而程序同步是一種目的。也可以說,為了能夠達到程序同步的目的,需要讓程序進行通信,傳輸一些程序同步所需要的資訊。

  1. 管道

管道是通過調用 pipe 函數建立的,fd[0] 用于讀,fd[1] 用于寫。

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

它具有以下限制:

  • 隻支援半雙工通信(單向交替傳輸);
  • 隻能在父子程序或者兄弟程序中使用。
    程式通信基礎
  1. FIFO

也稱為命名管道,去除了管道隻能在父子程序中使用的限制。

#include <sys/stat.h>
int mkfifo(const char *path, mode_t mode);
int mkfifoat(int fd, const char *path, mode_t mode);
           

FIFO 常用于客戶-伺服器應用程式中,FIFO 用作彙聚點,在客戶程序和伺服器程序之間傳遞資料。

<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/2ac50b81-d92a-4401-b9ec-f2113ecc3076.png"/> </div><br>

  1. 消息隊列

相比于 FIFO,消息隊列具有以下優點:

  • 消息隊列可以獨立于讀寫程序存在,進而避免了 FIFO 中同步管道的打開和關閉時可能産生的困難;
  • 避免了 FIFO 的同步阻塞問題,不需要程序自己提供同步方法;
  • 讀程序可以根據消息類型有選擇地接收消息,而不像 FIFO 那樣隻能預設地接收。
  1. 信号量

它是一個計數器,用于為多個程序提供對共享資料對象的通路。

  1. 共享存儲

允許多個程序共享一個給定的存儲區。因為資料不需要在程序之間複制,是以這是最快的一種 IPC。

  1. 套接字