- Linux下程序間通信的方式有:
- 管道
- 消息隊列
- 信号
- 信号量
- 共享存儲
- 套接字
一、管道
- 管道是半雙工的,資料隻能向一個方向流動;需要雙方通信時,需要建立起兩個管道
PIPE無名管道
詳情參閱:https://blog.csdn.net/qq_41453285/article/details/89376509
管道的實質是一個核心緩沖區:程序以先進先出的方式從緩沖區存取資料,管道一端的程序順序的将資料寫入緩沖區,另一端的程序則順序的讀出資料
該緩沖區可以看做是一個循環隊列,讀和寫的位置都是自動增長的,不能随意改變,一個資料隻能被讀一次,讀出來以後在緩沖區就不複存在了
當緩沖區讀空或者寫滿時,有一定的規則控制相應的讀程序或者寫程序進入等待隊列,當空的緩沖區有新資料寫入或者滿的緩沖區有資料讀出來時,就喚醒等待隊列中的程序繼續讀寫
無名管道的特點:隻支援單向資料流
隻能用于具有親緣關系的程序之間
沒有名字
管道的緩沖區是有限的(管道隻存在于記憶體中,在管道建立時,為緩沖區配置設定一個頁面大小)
管道所傳送的是無格式位元組流,這就要求管道的讀出方和寫入方必須事先約定好資料的格式,比如多少位元組算作一個消息(或指令,或記錄)等等
FIFO命名管道
詳情參閱:https://blog.csdn.net/qq_41453285/article/details/89472561
匿名管道,由于沒有名字,隻能用于親緣關系的程序間通信。為了克服這個缺點,提出了有名管道(FIFO)
FIFO是一種檔案類型,其會建立管道檔案讓不同程序之間進行通信
二、消息隊列
- 詳情參閱: https://blog.csdn.net/qq_41453285/article/details/90575054
- 消息隊列 是消息的連結表 ,存儲在核心中,由消息隊列辨別符辨別
- 特點總結:
- 消息隊列是消息的連結清單,具有特定的格式,存放在記憶體中并由消息隊列辨別符辨別
- 消息隊列允許一個或多個程序向它寫入與讀取消息
- 管道和消息隊列的通信資料都是先進先出的原則
- 消息隊列可以實作消息的随機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取。比FIFO更有優勢
- 息隊列克服了信号承載資訊量少,管道隻能承載無格式位元組流以及緩沖區大小受限等缺
- 前主要有兩種類型的消息隊列:POSIX消息隊列以及System V消息隊列,系統V消息隊列目前被大量使用。系統V消息隊列是随核心持續的,隻有在核心重新開機或者人工删除時,該消息隊列才會被删除
三、信号
- 詳情參閱: https://blog.csdn.net/qq_41453285/category_8841776.html
- 信号(Signals )是Unix系統中使用的最古老的程序間通信的方法之一。作業系統通過信号來通知程序系統中發生了某種預先規定好的事件(一組事件中的一個),它也是使用者程序之間通信和同步的一種原始機制。一個鍵盤中斷或者一個錯誤條件(比如程序試圖通路它的虛拟記憶體中不存在的位置等)都有可能産生一個信号。Shell也使用信号向它的子程序發送作業控制信号
- 常見的信号有:
- SIGHUP:使用者從終端登出,所有已啟動程序都将收到該程序。系統預設狀态下對該信号的處理是終止程序
- SIGINT:程式終止信号。程式運作過程中,按Ctrl+C鍵将産生該信号
- SIGQUIT:程式退出信号。程式運作過程中,按Ctrl+鍵将産生該信号
- SIGKILL:使用者終止程序執行信号。shell下執行kill -9發送該信号(該信号不能被捕獲)
- SIGTERM:結束程序信号。shell下執行kill程序pid發送該信号(該信号可以被捕獲)
- SIGALRM:定時器信号
- SIGCLD:子程序退出信号。如果其父程序沒有忽略該信号也沒有處理該信号,則子程序退出後将形成僵屍程序
- 信号是軟體層次上對中斷機制的一種模拟,是一種 異步通信方式
四、信号量
- 詳情參閱: https://blog.csdn.net/qq_41453285/article/details/90601316https://blog.csdn.net/qq_41453285/article/details/90612787
- 信号量是一個計數器,用于多程序對共享資料的通路,信号量的意圖在于 程序間同步
- 可以用來 處理生産者與消費者之間的關系
如果SV的值大于0,就将它減1;如果SV的值為0,則挂起程序的執行
V(SV):如果有其他程序因為等待SV而挂起,則喚醒之;如果沒有,則将SV加1
例如:初始化時二進制信号量SV的值為1
此時程序A執行了P(SV)操作将SV減1,則程序B若再執行P(SV)則會被挂起
當A執行完離開關鍵代碼段之後,并執行V(SV)操作将SV加1,則會喚醒程序B開始執行

五、共享存儲
- 詳情參閱: https://blog.csdn.net/qq_41453285/article/details/90612807
- 共享存儲允許兩個或多個程序 共享一個給定的存儲區
- 共享存儲不屬于某一特定程序,申請時是由系統提供的,大家都可以使用
- 因為資料不需要在程序之間複制,是以這是 最快的一種IPC結構: 為了在多個程序間交換資訊,核心專門留出了一塊記憶體區,可以由需要通路的程序将其 映射到自己的私有位址空間 。程序就可以直接讀寫這一塊記憶體而不需要進行資料的拷貝,進而大大提高效率
- 重點: 父程序fork子程序或者exec執行一個新的程式。在子程序和新程式裡面不會繼承父程序之前使用的共享存儲
因為共享存儲大家都可以使用,是以當有多個程序對共享存儲進行操作時,需要
控制好讀寫操作(也就是互斥操作)六、套接字
- 套接字是一種通信機制,憑借這種機制,客戶/伺服器(即要進行通信的程序)系統的開發工作 既可以在本地單機上進行,也可以跨網絡進行
- 套接字的特性由3個屬性确定:域,端口号,協定類型