·程序間通訊:作業系統為系統提供的用於實現程序間通訊的方式
程序之間是無法直接通訊的,因為每個程序都有獨立的虛擬地址空間,存取的都是自己的虛擬地址,因此程序具有獨立性,無法直接通訊
根據通訊場景的不同,因此提供了多種不同的通訊方式
程序間通訊方式種類:管道、共用記憶體、訊息佇列、號誌
·管道
特性:半雙工通訊--可以選擇方向的單向通訊
本質:在核心中開闢一塊緩衝區(核心空間中的一塊記憶體)
原理:多個程序通過存取同一塊核心中的緩衝區實現通訊(複製緩衝區的操作控制程式碼)
分類:匿名管道:緩衝區沒有識別符號,只能用於具有親緣關係的程序間通訊
命名管道:緩衝區具有識別符號,可用於同一主機上任意的程序間通訊
linux下一切皆檔案--所有東西都是當做檔案一樣進行操作(包括管道),通過IO操作完成對管道的存取
·匿名管道
返回值:成功返回0;失敗返回-1
特性:只能用於具有親緣關係的程序間通訊
匿名管道沒有識別符號,無法被其他程序找到,只能通過子程序複製父程序的方式獲取到操作控制程式碼實現通訊
讀寫特性:若管道中沒有資料,則read會阻塞
若管道中資料滿了,則write會阻塞
所有的管道的讀端被關閉,則繼續write則會觸發異常,導致程序崩潰退出
所有的管道的寫端被關閉,則繼續read則會讀完資料後返回0,不再阻塞
注:管道是半雙工通訊,在通訊時,一旦選定了 方向,應將不使用的那一端關閉。
· 命名管道:本質是 核心中的一塊緩衝區,具有識別符號,可以被其他程序找到,因此可用於同一主機上的任意程序間通訊
命名管道的識別符號就是一個可見於檔案系統的管道型別檔案
多個程序通過開啟同一個管道檔案,存取同一塊核心中的緩衝區實現通訊
命令操作:mkfifo filename 建立一個命名管道檔案
函數操作:int mkfifo(const char *pathname, mode_t mode);
pathname:檔名稱;mode:建立許可權
返回值:成功返回0;失敗返回-1
·總結:管道的本質:核心空間中的一塊緩衝區
原理:多個程序通過存取同一塊緩衝區實現資料傳輸
分類:匿名管道、命名管道
匿名管道:只能用於具有親緣關係的程序間通訊
命名管道:可以用於同一主機上任意程序間通訊
特性:①半雙工通訊--可以選擇方向的單向通訊
提供位元組流傳輸服務:有序的、可靠的、基於連線的一種流式傳輸
基於連線:所有讀端關閉則write異常;所有寫端關閉則read返回0
②自帶同步與互斥:
同步:通過同一時間程序對臨界資源的唯一存取實現存取操作安全
互斥:通過一些條件判斷讓程序對臨界資源的存取更加合理有序
互斥的體現:對管道進行寫入操作的大小不超過PIPE_BUF-4096大小,則保證操作的原子性
同步的體現:管道沒有資料則read阻塞,管道資料寫滿則write阻塞
③生命週期隨程序:不人為干預情況下,所有開啟管道的程序退出後,管道緩衝區被釋放
·共用記憶體:用於實現程序間的資料共用
本質:一塊實體記憶體
原理:開闢一塊實體記憶體空間,多個程序將同一塊對映到自己的虛擬地址空間,通過虛擬地址直接進行存取,進而實現資料共用
特性:最快的程序間通訊方式,生命週期隨核心
共用記憶體通過虛擬地址直接存取實體記憶體,實現資料共用,相對於其他方式需要將資料拷貝到核心,使用時拷貝到使用者態,少了兩次資料拷貝操作
注意事項:對共用記憶體的操作需要注意安全問題
操作流程:
①建立或開啟共用記憶體
②將共用記憶體對映到程序的虛擬地址空間
③通過對映的虛擬地址進行各種記憶體操作
④解除對映關係
⑤刪除共用記憶體
int shmget(key_t key, size_t size, int shmflg);
key:識別符號(多個程序通過相同的識別符號開啟同一塊共用記憶體)
size:建立時所開闢的空間大小(以記憶體頁為單位)
shmflg:開啟方式 + 建立許可權--IPC_CREAT|IPC_EXCL|0664
返回值: 成功返回一個非負整數--操作控制程式碼;失敗返回-1
void *shmat(int shmid, const void *shmaddr, int shmflg);
shmid:shmget返回的操作控制程式碼
shmaddr:對映地址,通常設定為NULL
shmflg:對映成功後的存取方式;SHM_RDONLY-唯讀;0-讀寫
返回值:成功則返回對映後的首地址;失敗返回(void *)-1
int shmdt(const void *shmaddr);
shmaddr:對映後的首地址
返回值:成功返回0;失敗返回-1
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmid:shmget返回的操作控制程式碼
cmd:操作型別--IPC_RMID 標記共用記憶體為被銷燬
buf:對於IPC_RMID,成功返回0,失敗發返回-1
·訊息佇列
本質:核心中的一個優先順序佇列,多個程序通過存取同一個佇列,向佇列中新增或者獲取節點而實現程序間的資料塊傳輸
特性:自帶同步與互斥,生命週期隨核心
·號誌
本質:核心中的一個計數器 + pcb等待佇列
作用:用於實現程序間的同步與互斥,協調程序對臨界資源的存取
P操作:計數器-1,判斷若計數小於0則阻塞程序
V操作:計數器+1,喚醒一個阻塞的程序
通過自身的計數器對資源進行計數,通過計數判斷程序對資源的獲取是否合理,不合理則阻塞。等待產生一個資源之後,喚醒阻塞的程序
同步的實現:通過計數器對資源進行計數,在獲取資源之前進行P操作
互斥的實現:計數器為1,表示資源只有一個,程序存取資源之前進行P操作,存取完畢後進行V操作
相關推薦:《Linux視訊教學》
以上就是經典技巧之Linux程序間通訊的詳細內容,更多請關注TW511.COM其它相關文章!