linux
環境程序間通訊
引言
linux
作為乙個開源的作業系統,是我們進行作業系統和提高程式設計水平的最佳途徑之一。
好的程式如同好的**一樣,完成的完美、巧妙。開放原始碼的程式都是經過無數人檢驗地,本文將以
linux-kernel-
2.6.5
為例對
pipe
的工作機制進行闡述。
一、
程序間通訊的分類
大型程式大多會涉及到某種形式的程序間通訊,乙個較大型的應用程式設計成可以相互通訊的「碎片」,從而就把乙個任務分到多個程序中去。程序間通訊的方法有三種方式:
管道(
pipe)
套接字(
socket)
system v ipc 機制
管道機制在
unix
開發的早期就已經提供了,它在本機上的兩個程序間的資料傳遞表現的相當出色;套接字是在
bsd(
berkeley software development
)中出現的,現在的應用也相當的廣泛;而
system v ipc
機制unix system v
版本中出現的。
二、
工作機制
管道分為
pipe
(無名管道)和
fifo
(命名管道),它們都是通過核心緩衝區按先進先出的方式資料傳輸,管道一端順序地寫入資料,另一端順序地讀入資料讀寫的位置都是自動增加,資料唯讀一次,之後就被釋放。在緩衝區寫滿時,則由相應的規則控制讀寫程序進入等待佇列,當空的緩衝區有寫入資料或滿的緩衝區有資料讀出時,就喚醒等待佇列中的寫程序繼續讀寫。
管道的讀寫規則:
管道兩端可分別用描述字fd[0]以及fd[1]來描述,需要注意的是,管道的兩端是固定了任務的。即一端只能用於讀,由描述字fd[0]表示,稱其為管道讀端;另一端則只能用於寫,由描述字fd[1]來表示,稱其為管道寫端。如果試圖從管道寫端讀取資料,或者向管道讀端寫入資料都將導致錯誤發生。一般檔案的i/o函式都可以用於管道,如close、read、write等等。
四、pipe的資料結構
首先要定義乙個檔案系統型別:pipe_fs_type。
[code]fs/pipe.c
static struct file_system_type pipe_fs_type = ;[/code]
變數pipe_fs_type其型別是 struct file_system_type 用於向系統註冊檔案系統。
pipe
以類似檔案的方式與程序互動,但在磁碟上無對應節點,因此效率較高。pipe主要包括乙個inode和兩個file結構——分別用於讀和寫。pipe的緩衝區首位址就存放在inode的i_pipe域指向pipe_inode_info結構中。但是要注意pipe的inode並沒有磁碟上的映象,只在記憶體中交換資料。
static struct super_block *pipefs_get_sb(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data)
上為超級的生成函式。
include/linux/pipe.h
#ifndef _linux_pipe_fs_i_h
#define _linux_pipe_fs_i_h
#define pipefs_magic 0x50495045
struct pipe_inode_info ; 2
管道等待佇列指標
wait
3 核心緩衝區基位址
base
4 緩衝區當前資料量 6
管道的讀者資料量 7
管道的寫者資料量 8
等待佇列的讀者個數 9
等待佇列的寫者個數 11
、12
主要對fifo
五、管道的建立:
通過pipe
系統呼叫來建立管道。
int do_pipe(int *fd)
六、管道的釋放
管道釋放時
f-op
的release
域在讀管道和寫管道中分別指向
pipe_read_release()
和pipe_write_release()
。而這兩個函式都呼叫
release
(),並決定是否釋放
pipe
的記憶體頁面或喚醒該管道等待佇列的程序。
以下為管道釋放的**:
static int pipe_release(struct inode *inode, int decr, int decw)
else
up(pipe_sem(*inode));
return 0;}
七、管道的讀寫
1
.從管道中讀取資料:
如果管道的寫端不存在,則認為已經讀到了資料的末尾,讀函式返回的讀出位元組數為0;
當管道的寫端存在時,如果請求的位元組數目大於pipe_buf,則返回管道中現有的資料位元組數,如果請求的位元組數目不大於pipe_buf,則返回管道中現有資料位元組數(此時,管道中資料量小於請求的資料量);或者返回請求的位元組數(此時,管道中資料量不小於請求的資料量)。
2.向管道中寫入資料:
向管道中寫入資料時,linux將不保證寫入的原子性,管道緩衝區一有空閒區域,寫程序就會試圖向管道寫入資料。如果讀程序不讀走管道緩衝區中的資料,那麼寫操作將一直阻塞。
八、管道的侷限性
管道的主要侷限性正體現在它的特點上:
九、後記
寫完本文之後,發現有部分不足之處。在由於管道讀寫的**過於冗長,限於篇幅不一一列出。有不足和錯誤之處還請各位老師指正。通過一段時間對linux的核心**的學習,開源的程式往往並非由「權威人士」、「享譽海內外的專家」所編寫,它們的由乙個個普通的程式設計師寫就。但專業造就專家,長時間集中在某個領域中能夠建立出據程式設計師應該珍視的財富。
完成之時特別感謝我的搭檔周欣和張博的大力支援和幫助。
十、參考資料
《**閱讀方法與實踐》 (希臘)diomidis spinellis
著趙學良
譯清華大學出版社
《linux 核心指導》
李善平陳文智
著浙江大學出版社
《linux
程式設計權威指南》
於明儉陳向陽
方漢編著
機械工業出版社
ibm
developerworks
中國**
Linux環境程序間通訊 共享記憶體
詳細內容出處 原理 mmap通過對映某個檔案來達到任意兩個程序之間的通訊。另外還可以通過匿名檔案對映的方式,來讓有親屬關係的程序也能互相通訊。所以mmap方式的共享記憶體又稱為對映記憶體。當然如果需要嚴格控制程序之間通訊的同步,可以使用到互斥量或者訊號量來控制。mmap的實現方式是通過各個程序不同的...
Linux程序間通訊
程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...