第七章 程序間通訊

2021-06-13 13:08:18 字數 3059 閱讀 6873

第七章、程序間通訊

1、程序間通訊簡介

多個程序之間相互通訊、交換資訊的方法

方法:1)本地程序通訊:共享記憶體、訊號量、管道、命名管道、訊息佇列

2)遠端通訊:套介面、全雙工管道

2、共享記憶體和訊號量

1)共享記憶體

通過兩個或多個程序共享同一塊記憶體區域實現程序間通訊

最底層的通訊機制,最快速的通訊機制(不需要中間介質)

不足:同步問題,通過訊號量實現程序的同步

兩種方法:對映/dev/mem裝置(引起系統崩潰)和記憶體映像(檔案系統額外開銷)

①共享記憶體建立與開啟

#include

#include

#include

int shmget(key_t key, int size, int flag);

key表示建立或開啟的共享記憶體的鍵,size表示共享記憶體的大小(建立時才有效),flag表示呼叫函式的操作型別或訪問許可權

呼叫成功,返回共享記憶體的引用識別符號;呼叫失敗,返回-1

②附加

void *shmat(int shmid, void *addr, int flag);

shmid表示要附加的共享記憶體段的引用識別符號,flag表示shmat函式的操作方式,addr表示位址

③分離程序對共享記憶體區域訪問完成後,呼叫shmdt使共享記憶體區域與該程序的位址空間分離

int shmdt(void *addr);

並不刪除共享記憶體本身。addr為要分離的共享記憶體區域的指標

④共享記憶體的控制

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

shmid為共享記憶體的引用識別符號,cmd表示希望執行的操作,buf是指向shmid_ds結構體的指標

2)訊號量

用於對多個程序訪問共享資源進行控制的機制

為了解決互斥共享資源的同步問題,實質是整數計數器,記錄了可供訪問的共享資源的單元個數

當有程序要求使用資源,首先檢測資源的訊號量,當大於0時,可以使用,訊號量值減一,結束使用,訊號量值加一;當等於0時,程序休眠,知道訊號量值大於0被喚醒,訪問該資源

①訊號量集的建立與開啟

#include

int semget(key_t key, int nsems, int flag);

key表示建立或開啟的訊號量集的鍵,nsems表示訊號量的個數(建立時才有效),flag表示呼叫函式的操作型別或訪問許可權

呼叫成功,返回訊號量的引用識別符號;呼叫失敗,返回-1

②對訊號量的操作

int semop(int semid, struct sembuf semoparray, size_t nops);

semid為訊號量集的引用id,semoparray用於指定呼叫semop函式所做的操作,nops指出semoparray元素個數

③訊號量的控制

int semctl(int semid, int semnum, int cmd, union semun arg);

semid為訊號量集的引用識別符號,semnum致命某個特定的訊號量,cmd表示希望執行的操作,arg是semun聯合

3、管道通訊

當乙個管道建立後,將獲得來那個檔案描述符,分別成為讀取端和匯入端

不足:只能用於兩個程序通訊;同源性,即同乙個程序派生的程序;半雙工,即只允許單方向傳輸資料;只存在系統核心,不存在檔案系統

1)管道的建立和關閉

int pipe(int filedescriptors[2]);

int close(int filedescriptor);

2)管道的讀寫操作

特殊的檔案,read、write

4、命名管道

先入先出佇列,一種特殊的管道

特點:任何兩個程序,不限制同源;存在檔案系統,除非對其刪除

1)命名管道的建立

#include

#include

①int mkfifo(const char *pathname, mode_t mode);

pathname存放管道的檔名,mode指定檔案許可權

②int mknod(char *pathname, mode_t mode, dev_t dev);

dev只有在檔案為裝置檔案時起作用

③shell命令

mkfifo fifo_test

mknod fifo_test p

2)命名管道的使用

open、read、write、close

5、訊息佇列

一系列連續排列的訊息,儲存在核心中,與管道類似

為每個訊息指定型別,接受下一條訊息,或接受下一條特定型別的訊息

傳遞的訊息由兩部分組成,即訊息型別和傳遞的資料

1)訊息佇列的建立與開啟

#include

#include

#include

int msgget(key_t key, int flag);

key表示建立或開啟的訊息佇列的鍵,flag表示呼叫函式的操作型別或訪問許可權

呼叫成功,返回訊息佇列的引用識別符號;呼叫失敗,返回-1

2)向訊息佇列中傳送訊息

訊息被新增到訊息佇列的末尾

int msgsnd(int msqid, const void *ptr, size_t nbytes, int flag);

msqid是訊息佇列的引用識別符號,ptr指向要傳送的訊息,nbytes表示訊息資料長度,flag指定訊息佇列滿時的處理方法

3)從訊息佇列中接收訊息

int msgrcv(int msqid, const void *ptr, size_t nbytes, long type, int flag);

msqid是訊息佇列的引用識別符號,ptr指向要存放的緩衝區,nbytes表示訊息資料長度,flag指定訊息長度大於指定值時的處理方法,type表示接受的訊息型別

4)訊息佇列的控制

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

msqid為訊息佇列的引用識別符號,cmd表示希望執行的操作,buf是指向msqid_ds結構體的指標

第七章 程序環境

1.main 函式 c程式總是從main函式開始執行的。main函式的原型是 int main int argc,char argv 其中,argc是命令列引數的數目,argv是指向引數的各個指標構成的陣列。當核心執行c程式時 使用乙個exec函式 在呼叫main前先呼叫乙個特殊的啟動例程。可執行程...

第七章 程序排程 介紹

7.2 排程指標 t周轉時間 t完成時間 t到達時間 7.3 先進先出 fifo example 1 工作平均周轉時間為 10 20 30 3 20 example 2 工作平均周轉時間為 100 110 120 3 120 7.4 最短任務優先 sjf example 1 工作平均周轉時間為 10...

第七章 進度計畫

一 單項選擇題 1.快速跟進是指 採用並行執行任務,加速專案進展 用乙個任務取代另外的任務 如有可能,減少任務數量 減輕專案風險 試題解析 a 參 採用並行執行任務,加速專案進展 2.下面哪一項可以決定進度的靈活性?pert 總浮動adm 趕工 試題解析 b 參 總浮動 3.是專案衝突的主要原因,尤...