linux 有名管道(FIFO)

2022-06-18 18:30:11 字數 2653 閱讀 7246

管道的緩衝區是有限的(管道制存在於記憶體中,在管道建立時,為緩衝區分配乙個頁面大小)

管道所傳送的是無格式位元組流,這就要求管道的讀出方和寫入方必須事先約定好資料的格式,比如多少位元組算作乙個訊息(或命令、或記錄)等等

多個寫程序,乙個讀程序。可以參考我之前的部落格

一旦設定了阻塞標誌,呼叫mkfifo建立好之後,那麼管道的兩端讀寫必須分別開啟,有任何一方未開啟,則在呼叫open的時候就阻塞。

可以理解為管道的兩端都建立好了,但是寫端還沒開始寫資料!)

則對於設定了阻塞標誌的讀操作來說,將一直阻塞(

就是block住了,等待資料。它並不消耗cpu資源,這種程序的同步方式對cpu而言是非常有效率的。)

造成阻塞的原因有兩種

fifo內有資料,但有其它程序在讀這些資料(

對於各個讀程序而言,這根有名管道是臨界資源,大家得互相謙讓,不能一起用。)

注:如果fifo中有資料,則設定了阻塞標誌的讀操作不會因為fifo中的位元組數小於請求讀的位元組數而阻塞,此時,讀操作會返回fifo中現有的資料量。

設定了阻塞標誌

if (buf_to_write <=  pipe_buf) 		//寫入的資料量不大於pipe_buf時

then

if ( buf_to_write > system_buf_left ) //保證寫入的原子性,要麼一次性把buf_to_write全都寫完,要麼乙個位元組都不寫!

then

block ;

until ( buf_to_write <= system_buf_left );

goto write ;

else

write ;

fielse

write ; //不管怎樣,就是不斷寫,知道把緩衝區寫滿了才阻塞

fi

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

//pipe_read.c

#include

#include

#include

#include

#include

#include

#include

#define fifo_name "/tmp/my_fifo"  

#define buffer_size pipe_buf  

int main()  

while(res > 0);  

close(pipe_fd);  

}  else  

printf

("process

%d finished, %d bytes read\n", getpid(), bytes);  

exit

(exit_success);  }1

2345

6789

1011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

//pipe_write.c

#include

#include

#include

#include

#include

#include

#include

#define fifo_name "/tmp/my_fifo"  

#define buffer_size pipe_buf  

#define ten_meg (1024 * 100)  

int main()  

}  printf

("process

%d opening fifo o_wronly\n", getpid());  

pipe_fd = open(fifo_name, open_mode);  

printf

("process

%d result %d\n", getpid(), pipe_fd);  

//sleep(20);

if (pipe_fd != -1)  

bytes += res;  

printf

("%d\n",bytes);

}  close(pipe_fd);  

}  else  

printf

("process

%d finish\n", getpid());  

exit

(exit_success);  

}

FIFO 有名管道

有名管道相關的關鍵概念 管道應用的乙個重大限制是它沒有名字,因此,只能用於具有親緣關係的程序間通訊,在有名管道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供乙個路徑名與之關聯,以fifo的檔案形式存在於檔案系統中。這樣,即 使與fifo的建立程序不存在親...

21 有名管道fifo

1.特點 有名管道 在磁碟上有這樣乙個檔案,可通過命令ls l檢視字首帶p的檔案 偽檔案,在磁碟上大小永遠為0 在核心中有乙個對應的緩衝區 半雙工的通訊方式 預設阻塞 2.使用場景 沒有血緣關係的程序間通訊 3.建立方式 命令 mkfifo 管道名 函式 mkfifo 類似於mkdir 4.fifo...

Linux c 管道和有名管道(FIFO)

一.管道 1.只能用於具有親緣關係的程序之間的通訊 2.半雙工通訊模式 3.一種特殊的檔案,是一種只存在於核心中的讀寫函式 管道基於檔案描述符,管道建立時,有兩個檔案描述符 a.fd 0 固定用於讀管道 b.fd 1 固定用於寫管道 建立管道 pipe 一般步驟 1.pipe 建立管道 2.fork...