Linux環境程序間通訊

2021-03-31 08:56:59 字數 3467 閱讀 1517

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.管道與...