程序管理之程序間通訊

2021-09-12 13:13:31 字數 4266 閱讀 5609

四、訊息佇列(message queue)

五、共享記憶體(shared memory)

六、套接字(socket)

程序作為人類的發明,自然也免不了脫離人類的習性,也有通訊的需求。如果程序之間不進行任何通訊,那麼程序所能完成的任務就要大打折扣。人類的通訊方式無外乎對白(通過聲音溝通)、打手勢、寫信、發電報、擁抱等方法。同理,程序也可以通過同樣的方式來進行通訊。本篇我們就來看看程序的這些互動方式。

#include

intpipe

(int fd[2]

);

乙個程序向儲存空間的一端寫入資訊,另乙個程序儲存空間的另外一端讀取資訊,這個就是管道。ls -l | grep string:將ls -l的結果通過管道傳遞給grep。

一般管道的使用方式都是:父程序建立乙個管道,然後fork產生乙個子程序,由於子程序擁有父程序的副本,所以父子程序可以通過管道進行通訊。

對於從父程序到子程序的管道,父程序關閉讀端(fd[0]),子程序關閉寫端(fd[1]);

對於從子程序到父程序的管道,子程序關閉讀端(fd[0]),父程序關閉寫端(fd[1])。

#include

intmkfifo

(const

char

*path, mode_t mode)

;int

mkfifoat

(int fd,

const

char

*path, mode_t mode)

;

posix標準中的fifo又名有名管道或命名管道。我們知道前面講述的posix標準中管道是沒有名稱的,所以它的最大劣勢是只能用於具有親緣關係的程序間的通訊

int

semget

(key_t key,

int num_sems,

int sem_flags)

;int

semop

(int sem_id,

struct sembuf *sem_opa, size_t num_sem_ops)

;int

semctl

(int sem_id,

int sem_num,

int command,...);

1. 測試控制該資源的訊號量;

2.若訊號量的值為正,則程序可以使用該資源,程序的訊號量值減1,表示乙個資源被使用;

3.若此訊號量為0,則程序進入休眠,直到該訊號量值大於0;

4.當程序不再使用乙個由乙個訊號控制的共享資源時,該訊號量加1,如果有程序正在休眠等待該訊號量,則該程序會被喚醒。

問題描述:使用乙個緩衝區來儲存物品,只有緩衝區沒有滿,生產者才可以放入物品;只有緩衝區不為空,消費者才可以拿走物品

因為緩衝區屬於臨界資源,因此需要使用乙個互斥量 mutex 來控制對緩衝區的互斥訪問。

為了同步生產者和消費者的行為,需要記錄緩衝區中物品的數量。數量可以使用訊號量來進行統計,這裡需要使用兩個訊號量:empty 記錄空緩衝區的數量,full 記錄滿緩衝區的數量。其中,empty 訊號量是在生產者程序中使用,當 empty 不為 0 時,生產者才可以放入物品;full 訊號量是在消費者程序中使用,當 full 訊號量不為 0 時,消費者才可以取走物品

}問題描述:允許多個程序同時對資料進行讀操作,但是不允許讀和寫以及寫和寫操作同時發生。

乙個整型變數count 記錄在對資料進行讀操作的程序數量,乙個互斥量count_mutex 用於對 count 加鎖,乙個互斥量data_mutex 用於對讀寫的資料加鎖

;訊息佇列是一列具有頭和尾的佇列,新來的訊息放在佇列尾部,而讀取訊息則從佇列頭部開始,如下圖所示:

這樣看來,它和管道十分類似,一頭讀,一頭寫?的確,看起來很像管道,但又不是管道:

int

shmget

(key_t key, size_t size,

int shm***)

;void

*shmat

(int shm_id,

const

void

*shm_addr,

int shm***)

;int

shmdt

(const

void

*shmaddr)

;int

shmctl

(int shm_id,

int command,

struct shmid_ds *buf)

;

共享記憶體就是兩個程序共同擁有同一片物理記憶體。對於這片記憶體中的任何內容,二者均可以訪問。要使用共享記憶體進行通訊,程序a首先需要建立一片記憶體空間作為通訊用,而其他程序b則將片記憶體對映到自己的(虛擬)位址空間。這樣,程序a讀寫自己位址空間中對應共享記憶體的區域時,就是在和程序b進行通訊。

套接字(socket)的功能非常強大,可以支援不同層面、不同應用、跨網路的通訊。使用套接字進行通訊需要雙方均建立乙個套接字,其中一方作為伺服器方,另外一方作為客戶方。伺服器方必須首先建立乙個服務區套接字,然後在該套接字上進行監聽,等待遠方的連線請求。客戶方也要建立乙個套接字,然後向伺服器方傳送連線請求。伺服器套接字在受到連線請求之後,將在伺服器方機器上新建乙個客戶套接字,與遠方的客戶方套接字形成點到點的通訊通道。之後,客戶方和伺服器方便可以直接通過類似於send和recv的命令在這個建立的套接字管道上進行交流了。

程序間通訊之

共享記憶體的概述 共享記憶體就是允許兩個不相關的程序訪問同乙個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,就好像它們...

程序間通訊之協同程序

unix系統過濾程式從標準輸入讀取資料,對其進行適當處理後寫到標準輸出。幾個過濾程式通常在shell管道命令列中線性地連線。當乙個程式產生某個過濾程式的輸入,同時又讀取該過濾程式的輸出時,則該過濾程式就成為協同程序 coprocess korn shell提供了協同程序。bourne shell b...

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...