進程間通信方式預習2

1.接口mmap()的使用方法

mmap()系統調用使得進程之間可以通過映射同一個普通文件實現共享內存,普通文件被映射到地址空間後,進程可以向訪問普通文件一樣對文件進行訪問,不必再調用read(),writr()等操作。Mmap()系統調用並不完全是用於共享內存設計的,它本身提供了不同於一般對普通文件的訪問形式,進程可以像讀寫內存一樣對普通文件的操作,而posix或系統v的共享內存ipc則純粹用於共享目的,當然mmap()實現共享內存也是其主要應用之一。

 

2.系統調用mmap()用於共享內存的兩種方法

1.使用普通文件提供的內存映射,適用於任何進程之間,此時需要打開或創建一個文件,然後再調用mmap(),典型代碼如下:

Fd = open(name, flag, mode);

If (fd < 0

Ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

2.用特殊文件提供匿名內存映射,適用於具有血緣關係的進程之間,由於父子進程特殊的親緣關係,在父進程中現調用mmap(),然後調用fork,那麼在調用fork()之後,子進程繼承父進程匿名映射後的地址空間,同樣也繼承mmap()返回的地址,這樣父進程就可以通過映射區域進行通信了,注意,這裏不是一般的繼承關係,一般來說,子進程單獨維護從父進程繼承下來的一些變量,而mmap()返回的地址,卻由父子進程共同維護。

對於具有親緣關係的進程實現共享內存最好的方式應該是採用匿名內存映射的方式,此時不必指定具體的文件,只要設置相應的標誌即可。

 

3.系統V共享內存與系統調用mmap()原理上的區別

系統V共享內存指的是把所有共享數據放在共享內存區域,任何想要訪問該數據的進程都必須在本進程的地址空間新增一塊內存區域,用來映射存放共享數據的物理內存頁面。

系統調用mmap()通過映射一個普通文件實現共享內存,系統V則是通過映射特殊文件系統shm中的文件實現進程間共享內存通信的,也就是說,每個共享內存區域對應特殊文件系統shm中的一個文件。

 

4.系統vmmap()映射普通文件實現共享內存通信的對比

1.系統V共享內存中的數據,從來不寫到實際磁盤文件中去,而通過mmap()映射普通文件實現的共享內存通信可以指定何時將數據寫入磁盤文件中。

2.系統V共享內存是隨內核持續的,即使所有訪問共享內存的進程都已經正常終止,共享內存區仍然存在(除非顯示刪除共享內存),在內核重新引導之前,對該共享內存區域的任何該寫操作都將一直保留。

3.通過調用mmap()映射普通文件進行進程間通信時,一定要注意考慮進程何時將終止對通信的影響,而通過系統V共享內存實現 通信的進程則不然。

 

5.從管道讀取數據,讀函數返回值意義

1.若管道寫端不存在,則認爲已經讀到數據的末尾,讀函數返回的讀出字節數爲0.

2.當管道寫端存在,若請求的字節數目大於PIPE_BUF,則返回管道中現有的數據字節數,若不大於PIPE_BUF,則返回現有數據字節數(此時管道中數據量小於請求的數據量),或者返回請求的字節數(管道中數目不小於請求的數據量)。

 

6.向管道寫數據的注意點

1.向管道中寫數據時,linux將不保證寫入的原子性,管道緩衝區一有空閒區域,寫程序就會試圖向管道中寫入數據,如果讀進程不讀走管道緩衝區中的數據,那麼寫操作將一直阻塞。

只有在管道的讀端存在時,向管道中寫入數據纔有意義,否則向管道中寫入數據的進程將收到內核傳來的SIFPIPE信號,應用程序可以處理該信號,也可以忽略(默認動作是應用程序終止)。

 

7.向FIFO中寫入數據的注意點

如果一個進程爲了向FIFO中寫入數據而阻塞打開FIFO,那麼該進程內的寫操作設置了阻塞標誌的寫操作。

1.對於設置了阻塞標誌的寫操作

1.當寫入數據不大於PIPE_BUF時,linux將保證寫入的原子性,若管道空閒緩衝區不足以容納要寫入的字節數,則進入睡眠,直到緩衝區中能夠容納要寫入的字節數時,纔開始進行一次性寫操作。

2.當數據量大於PIPE_BUF時,linux不再保證寫入的原子性,FIFO緩衝區一有空閒區域,寫程序就會試圖向管道寫入數據,寫操作在寫完所以請求寫的數據後返回。

 

2.對於沒有設置阻塞標誌的寫操作

1.當要寫入的數據量大雨PIPE_BUF時,linux不再保證寫入的原子性,在寫滿所以FIFO空閒緩衝區後,寫操作返回。

2.當要寫入的數據量不大於PIPE_BUF時,linux將保證寫入的原子性,如果當前FIFO空閒緩衝區能夠容納請求的字節數,寫完後成功返回,如果不能容納下,則返回EAGAIN錯誤,提醒以後再寫。

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