Linux進程間通信方式--信號,管道,消息隊列,信號量,共享內存

1、概述

通信方法 無法介於內核態與用戶態的原因
管道(不包括命名管道) 侷限於父子進程間的通信。
消息隊列 在硬、軟中斷中無法無阻塞地接收數據。
信號量 無法介於內核態和用戶態使用。
內存共享 需要信號量輔助,而信號量又無法使用。
套接字 在硬、軟中斷中無法無阻塞地接收數據。

2、信號

信號又稱軟終端,通知程序發生異步事件,程序執行中隨時被各種信號中斷,進程可以忽略該信號,也可以中斷當前程序轉而去處理信號。信號攜帶的數據比較有限。引起信號原因:

1).程序中執行錯誤碼;

2).其他進程發送來的;

3).用戶通過控制終端發送來;

4).子進程結束時向父進程發送SIGCLD;

5).定時器生產的SIGALRM;

3、管道

單向,一段輸入,另一端輸出,先進先出FIFO。管道也是文件。管道大小4096字節。

特點:管道滿時,寫阻塞;空時,讀阻塞。

分類:普通管道(通信進程間必要要有相同的父進程)位於內存;命名管道位於文件系統,沒有親緣關係管道只要知道管道名也可以通訊。

管道是由內核管理的一個緩衝區(buffer),相當於我們放入內存中的一個紙條。管道的一端連接一個進程的輸出。這個進程會向管道中放入信息。管道的另一端連接一個進程的輸入,這個進程取出被放入管道的信息。一個緩衝區不需要很大,它被設計成爲環形的數據結構,以便管道可以被循環利用。當管道中沒有信息的話,從管道中讀取的進程會等待,直到另一端的進程放入信息。當管道被放滿信息的時候,嘗試放入信息的進程會等待,直到另一端的進程取出信息。當兩個進程都終結的時候,管道也自動消失。

http://pic002.cnblogs.com/images/2012/413416/2012101010564376.jpg

4、消息隊列

消息隊列是先進先出FIFO原則

消息結構模板

strut msgbuf
{
long int  mtype;//消息類型
char mtext[1];//消息內容

}

       不同於管道,通信的兩個進程可以是完全無關的進程,不需要同步,而管道要求,不論是匿名管道還是有名管道,通信的兩個進程都必須是正在運行的進程。而且從消息隊列中選取消息時,並不一定要按照先進先出的順序。

5、共享內存

共享內存是分配一塊能被其他進程訪問的內存,實現是通過將內存去映射到共享它的進程的地址空間,使這些進程間的數據傳送不再涉及內核,即,進程間通信不需要通過進入內核的系統調用來實現;對共享內存段的訪問有時需要使用信號量進行同步。

共享內存與其他的進程間通信最大的優點是:數據的複製只有兩次,一次是從輸入文件到共享內存區,一次從共享內存區到輸出文件

而其他的則是需要複製4次:服務器將輸入文件讀入自己的進程空間,再從自己的進程空間寫入管道/消息隊列等;客戶進程從管道/消息隊列中讀出數據到自己的進程空間,最後輸出到客戶指定的文件中;

要使用共享內存,應該有如下步驟:
1.開闢一塊共享內存     shmget()
2.允許本進程使用共某塊共享內存  shmat()
3.寫入/讀出
4.禁止本進程使用這塊共享內存   shmdt()
5.刪除這塊共享內存     shmctl()或者命令行下ipcrm


6、信號量

信號量是一種用於提供不同進程間或一個進程間的不同線程間線程同步手段的原語,systemV信號量在內核中維護

二值信號量 : 其值只有0、1 兩種選擇,0表示資源被鎖,1表示資源可用;
計數信號量:其值在0 和某個限定值之間,不限定資源數只在0 1 之間;

計數信號量集 ;多個信號量的集合組成信號量集

轉 http://blog.csdn.net/21aspnet/article/details/7479469

http://www.cnblogs.com/vamei/archive/2012/10/10/2715398.html  待處理


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章