Linux的pipe為什麼只能單向通訊

2025-02-22 01:00:18 字數 4431 閱讀 3582

1樓:匿名使用者

瀉藥。那來看下linux的實現好了。資料只能單向移動的意思是fifo,於是linux中實際構建了乙個迴圈佇列。

具體一點則是,申請乙個緩衝區,作為pipe()操作中匿名管道檔案實體,緩衝區設倆指標,乙個讀指標,乙個寫指標,並保證讀指標向前移動不能超過寫指標,否則喚醒寫程序並睡眠,直到讀滿需要的位元組數。同理寫指標向前也不能超過讀指標,否則喚醒讀程序並睡眠,直到寫滿要求的位元組數。pipe()返回的兩個檔案控制代碼最後指向的其實是乙個inode,只不過乙個是read only乙個是write only.

試想同時兩個程序讀[或者寫,假設只有兩個程序]的後果,由於i_count會等於2——如果小於2則說明兩個程序同時關閉了寫控制代碼,因此會直接退出讀函式。此時倆程序會分別認為對方才是寫者而反覆醒來,反覆監測,然並卵沒有資料,於是反覆睡眠。如果有多個程序,倆程序同時讀[或者寫],會造成資料混亂,因為讀指標只有乙個,而你不能保證讀寫的順序。

全雙工指的是我讀的時候可以寫,寫的時候還可以讀,方法很簡單,建立兩條管道就可以了。

2樓:網友

#include

int pipe(int filedes[2]);

返回值:成功,返回0,否則返回-1。引數陣列包含pipe使用的兩個檔案的描述符。fd[0]:讀管道,fd[1]:寫管道。

必須在fork()中呼叫pipe(),否則子程序不會繼承檔案描述符。兩個程序不共享祖先程序,就不能使用pipe。

資料只能單向通訊的意思是fifo,於是linux中實際構建了乙個迴圈佇列。具體一點則是,申請乙個緩衝區,作為pipe()操作中匿名管道檔案實體,緩衝區設倆指標,乙個讀指標,乙個寫指標,並保證讀指標向前移動不能超過寫指標,否則程序進入睡眠,直到讀滿需要的位元組數。同理寫指標向前也不能超過讀指標,否則程序進入睡眠,直到寫滿要求的位元組數。

linux下的管道通訊問題

3樓:網友

pipe(id);//error

應該是pipe(fd);

int pipe(int filedes[2]);

pipe()會建立管道,並將檔案描述詞由引數filedes陣列返回。

filedes[0]為管道里的讀取端。

filedes[1]則為管道的寫入端。

linux系統的程序間通訊有哪幾種方式

4樓:檀香透窗欞

一、方式。

1、管道(pipe)及有名管道( mkpipe):

管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊;

2、訊號(signal):

訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身。

linux除了支援unix早期訊號語義函式sigal外,還支援語義符合標準的訊號函式sigaction。

實際上,該函式是基於bsd的,bsd為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式。

3、訊息佇列(message):

訊息佇列是訊息的鏈結表,包括posix訊息佇列system v訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

4、共享記憶體:

使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。

5、訊號量(semaphore):

主要作為程序間以及同一程序不同執行緒之間的同步手段。

6、套介面(socket):

更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由unix系統的bsd分支開發出來的,但現在一般可以移植到其它類unix系統上:linux和system v的變種都支援套接字。

二、概念。程序間通訊概念:

ipc—-interprocess communication

每個程序各自有不同的使用者位址空間,任何乙個程序的全域性變數在另乙個程序中都看不到所以程序之間要交換資料必須通過核心。

在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊。

5樓:網友

# 管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。

# 有名管道 (named pipe) :有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。

# 訊號量( semophore ) 訊號量是乙個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。

因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。

# 訊息佇列( message queue ) 訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

# 訊號 ( sinal ) 訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。

# 共享記憶體( shared memory ) 共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由乙個程序建立,但多個程序都可以訪問。共享記憶體是最快的 ipc 方式,它是針對其他程序間通訊方式執行效率低而專門設計的。

它往往與其他通訊機制,如訊號兩,配合使用,來實現程序間的同步和通訊。

# 套接字( socket ) 套解口也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同及其間的程序通訊。

6樓:網友

管道訊息佇列。

unix domain socket

共享記憶體訊號量。

linux下fork兩子程序為什麼只有乙個讀取到pipe的內容?

7樓:網友

父程序寫入的內容被子程序讀取後,pipe就空了,第二個子程序會block在那裡。

你的lockf根本就沒有成功,返回值是 -1,你可以修改一下**看看 lockf的返回值。 查了一下 lockf 的man page,發現它要求檔案描述符要以寫的方式開啟:

the file is specified by fd, a file descriptor open for writing

所以我把你**改了一下,改成兩個子程序寫pipe,而父程序讀,這樣lockf就沒問題了。

#include

#include

#include

#include

int pid1,pid2;

int main()

elseelse}}

8樓:網友

pipe讀了之後就空了啊。

哪個方法不能用於linux程序通訊 臨界區

9樓:215743077真藥

程序間通訊程序間通訊就是不同程序之間傳播或交換資訊,程序的使用者空間是互相獨立的,程序之間可以利用系統空間交換資訊。

管道(pipe)管道是一種半雙工的通訊方式,資料只能單向流動。如果要進行雙工通訊,需要建立兩個管道。

管道只能在具有親緣關係的程序間使用,例如父子程序或兄弟程序。

有名管道(named pipe)

有名管道也是雙半工的通訊方式,但它允許無親緣關係的程序間使用。

訊號量(semophore)

訊號量常用來作為一種鎖機制來使用,它是乙個記數器,用來控制多程序對共享資源的訪問,防止多個程序同時訪問乙個共享資源。訊號量主要用作為程序間或同一程序間不同執行緒之間的同步手段。

訊號(sinal)

訊號是一種比較複雜的通訊方式,用於通知接收程序某些事件已經發生,要注意訊號處理中呼叫的函式是否為訊號安全。

訊息佇列(message queue)

訊息佇列是由訊息的連結串列組成,存放在核心中並由訊息佇列識別符號標識。

共享記憶體(shared memory)

共享記憶體就是對映一段被其他程序所訪問的記憶體,這段共享記憶體由乙個程序建立,可由多個程序訪問。共享記憶體是最快的ipc方式,它是針對其他程序間通訊方式的低執行效率而專門設計的。它往往與其他通訊機制,如訊號量,配合使用,來實現程序間的同步和通訊。

套接字(socket)

套接字也是程序間通訊的一種方式,與其他方式不同的是,它可以用在不同主機間的程序通訊(也是它的主要用途)。

幾種方式的缺點。

管道: 速度慢,容量有限,只能用於親緣關係程序間通訊。

有名管道: 同管道,不過允許無親緣關係程序間通訊。

訊息佇列: 容量受系統限制,佇列中會遺留資料,讀時要考慮到這些未讀完的資料。

訊號量: 主要用於同步,無法傳遞複雜的資料資訊。

1 1為什麼只能等於,1 1為什麼只能等於

這個問題大家都承認它,因為這和日常經驗相符,比如1個蘋果加1個蘋果就是2個蘋果。但是從數學角度任何看待它?這主要涉及2個概念,即什麼是加法?什麼是數1?peano算術公理回答了這個問題,設n是自然數集 1 1是自然數 2 每個自然數n都有乙個確定的後繼數n 並且n 也是自然數 3 若a和b的後繼數相...

為什麼 Linux 上軟體那麼少

ubuntu的軟體中心一大堆軟體啊。apt直接就安裝了。每個linux系統都有很多很多開源軟體,不能用windows的管理思維來弄linux。可檢視 linux就該這麼學 了解linux。為什麼linux軟體少?linux可以安裝mpkg是手機中的智慧型程式,jar只是一般程式,功能不都強大。但mp...

Linux為什麼改了root密碼,輸入的正確密碼還是進不去呢

這是緊急模式 都沒正常啟動 可能是系統磁碟資料已經損壞了 passwd檔案不可寫之類 虛擬機器可以考慮重灌或恢復快照 為什麼linux下root密碼正確卻登入不了?為什麼linux終端輸入login進入root許可權,輸入正確的使用者名稱和密碼還是提示登入錯誤 這個就是密碼不對!是不是被人改了?su...