进程的通信
管道
什么是管道
由于進程之間是相互獨立的,因此在進程與進程之間進行相互聯系的時候,此時就需要采用一種機制,通過管道的方式將進程一個進程的執行數據交給另外一個進程,此時就可以以通過管道來實現
匿名管道和命名管道
匿名管道
創建一個匿名管道的方式是pipe(int pipe[2])
要創建一個匿名管道,此時兩個管道之間必須有父子關系,同時匿名管道對數據的讀取是基于流的方式實現的,,同時為了使得進程之間的資源能夠正確訪問,此時就需要采用一種機制使得進程之間的既可以正常訪問資源,這樣的機制就是同步機制.管道是基于父子關系的進程之間的,此時管道的生命周期就會隨進程.同時管道是單向的,這就像家里自來水管中的額數一樣,它只有一個方向的流動.管道讀端關閉,寫端還一直在寫此時會觸發SIGPIP信號,當寫端已經不再繼續寫了,但是讀端還在一直進行讀操作,此時進程會讀到0,當寫入的數據小于管道規定的數據的長度的時候,此時系統會保證數據的原子寫入,當寫入的數據大于管道的最大規定的字節數的時候,此時就不會再進行寫操作.
命名管道:
命名管道是基于mkfifo,通過mkfifo創建的管道存在于磁盤中,命名管道和匿名管道之間的區別在于兩者之間的打開方式不同,命名管道是通過open來打開,但是匿名管道是通過創建就會打開
消息隊列
雖然進程進通信已經有管道了,但是管道只能基于有血緣關系的進程之間進行通信,為了實現任何進程之間的通信,此時就引入了消息隊列.其中消息隊列時基于一個一個的數據塊的,同時數據塊是由類型的,數據塊也是由規定的做大長度的,系統中的消息隊列的長度也是有限制的,發送者在進行發送的時候此時就需要將數據的類型進行標記,接收者在進行接受的時候就可以通過這個類型來直到這個數據是否來自發送方.
共享內存
沒有血緣關系的進程之間的通信雖然可以利用消息隊列完成,但是在創建消息隊列的時候,此時必須先將兩個進程之間通過消息隊列的類型來確認此時接受的消息是否正確,這樣勢必會造成兩個進程之間的通信效率會降低,此時為了使得兩個進程之間能夠高效的進行通信,就提出了共享內存.共享內存是通過一段共享內存,將兩個進程關聯到這塊內存,此時兩個進程已經都關聯到這塊內存中,因此只要一個進程向這塊內存中發送數據,此時另外一個進程就會看到這個消息,因此消息隊列是塊的IPC形式
信號量
信號量實際就是一個計數器,技術器中的數值代表的是當前資源的多少.
幾個命令
查看消息隊列:
ipcs -q
刪除消息隊列:
ipcrm -q
查看共享內存:
ipcs -m
刪除共享內存:
ipcrm -m
進程的退出碼
總結