管道的緩衝區是有限的(管道制存在於記憶體中,在管道建立時,為緩衝區分配乙個頁面大小)
管道所傳送的是無格式位元組流,這就要求管道的讀出方和寫入方必須事先約定好資料的格式,比如多少位元組算作乙個訊息(或命令、或記錄)等等
多個寫程序,乙個讀程序。可以參考我之前的部落格
一旦設定了阻塞標誌,呼叫mkfifo建立好之後,那麼管道的兩端讀寫必須分別開啟,有任何一方未開啟,則在呼叫open的時候就阻塞。
可以理解為管道的兩端都建立好了,但是寫端還沒開始寫資料!)
則對於設定了阻塞標誌的讀操作來說,將一直阻塞(
就是block住了,等待資料。它並不消耗cpu資源,這種程序的同步方式對cpu而言是非常有效率的。)
造成阻塞的原因有兩種
fifo內有資料,但有其它程序在讀這些資料(
對於各個讀程序而言,這根有名管道是臨界資源,大家得互相謙讓,不能一起用。)
注:如果fifo中有資料,則設定了阻塞標誌的讀操作不會因為fifo中的位元組數小於請求讀的位元組數而阻塞,此時,讀操作會返回fifo中現有的資料量。
設定了阻塞標誌
if (buf_to_write <= pipe_buf) //寫入的資料量不大於pipe_buf時123then
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
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...