linux查看fifo内容,linux 有名管道(FIFO)
http://blog.csdn.net/firefoxbug/article/details/8137762
管道的緩沖區(qū)是有限的(管道制存在于內(nèi)存中,在管道創(chuàng)建時(shí),為緩沖區(qū)分配一個(gè)頁(yè)面大小)
管道所傳送的是無(wú)格式字節(jié)流,這就要求管道的讀出方和寫(xiě)入方必須事先約定好數(shù)據(jù)的格式,比如多少字節(jié)算作一個(gè)消息(或命令、或記錄)等等
如果當(dāng)前打開(kāi)操作是為讀而打開(kāi)FIFO時(shí),若已經(jīng)有相應(yīng)進(jìn)程為寫(xiě)而打開(kāi)該FIFO,則當(dāng)前打開(kāi)操作將成功返回;否則,可能阻塞直到有相應(yīng)進(jìn)程為寫(xiě)而打開(kāi)該FIFO(當(dāng)前打開(kāi)操作設(shè)置了阻塞標(biāo)志);或者,成功返回(當(dāng)前打開(kāi)操作沒(méi)有設(shè)置阻塞標(biāo)志)。
如果當(dāng)前打開(kāi)操作是為寫(xiě)而打開(kāi)FIFO時(shí),如果已經(jīng)有相應(yīng)進(jìn)程為讀而打開(kāi)該FIFO,則當(dāng)前打開(kāi)操作將成功返回;否則,可能阻塞直到有相應(yīng)進(jìn)程為讀而打開(kāi)該FIFO(當(dāng)前打開(kāi)操作設(shè)置了阻塞標(biāo)志);或者,返回ENXIO錯(cuò)誤(當(dāng)前打開(kāi)操作沒(méi)有設(shè)置阻塞標(biāo)志)。
一旦設(shè)置了阻塞標(biāo)志,調(diào)用mkfifo建立好之后,那么管道的兩端讀寫(xiě)必須分別打開(kāi),有任何一方未打開(kāi),則在調(diào)用open的時(shí)候就阻塞。
約定:如果一個(gè)進(jìn)程為了從FIFO中讀取數(shù)據(jù)而阻塞打開(kāi)FIFO,那么稱(chēng)該進(jìn)程內(nèi)的讀操作為設(shè)置了阻塞標(biāo)志的讀操作。(意思就是我現(xiàn)在要打開(kāi)一個(gè)有名管道來(lái)讀數(shù)據(jù)!)
可以理解為管道的兩端都建立好了,但是寫(xiě)端還沒(méi)開(kāi)始寫(xiě)數(shù)據(jù)!)
則對(duì)于設(shè)置了阻塞標(biāo)志的讀操作來(lái)說(shuō),將一直阻塞(
就是block住了,等待數(shù)據(jù)。它并不消耗CPU資源,這種進(jìn)程的同步方式對(duì)CPU而言是非常有效率的。)
對(duì)于沒(méi)有設(shè)置阻塞標(biāo)志讀操作來(lái)說(shuō)則返回-1,當(dāng)前errno值為EAGAIN,提醒以后再試。
造成阻塞的原因有兩種
FIFO內(nèi)有數(shù)據(jù),但有其它進(jìn)程在讀這些數(shù)據(jù)(
對(duì)于各個(gè)讀進(jìn)程而言,這根有名管道是臨界資源,大家得互相謙讓,不能一起用。)
FIFO內(nèi)沒(méi)有數(shù)據(jù)。解阻塞的原因則是FIFO中有新的數(shù)據(jù)寫(xiě)入,不論信寫(xiě)入數(shù)據(jù)量的大小,也不論讀操作請(qǐng)求多少數(shù)據(jù)量。
注:如果FIFO中有數(shù)據(jù),則設(shè)置了阻塞標(biāo)志的讀操作不會(huì)因?yàn)镕IFO中的字節(jié)數(shù)小于請(qǐng)求讀的字節(jié)數(shù)而阻塞,此時(shí),讀操作會(huì)返回FIFO中現(xiàn)有的數(shù)據(jù)量。
約定:如果一個(gè)進(jìn)程為了向FIFO中寫(xiě)入數(shù)據(jù)而阻塞打開(kāi)FIFO,那么稱(chēng)該進(jìn)程內(nèi)的寫(xiě)操作為設(shè)置了阻塞標(biāo)志的寫(xiě)操作。(意思就是我現(xiàn)在要打開(kāi)一個(gè)有名管道來(lái)寫(xiě)數(shù)據(jù)!)
當(dāng)要寫(xiě)入的數(shù)據(jù)量不大于PIPE_BUF
時(shí),linux將保證寫(xiě)入的原子性。如果此時(shí)管道空閑緩沖區(qū)不足以容納要寫(xiě)入的字節(jié)數(shù),則進(jìn)入睡眠,直到當(dāng)緩沖區(qū)中能夠容納要寫(xiě)入的字節(jié)數(shù)時(shí),才開(kāi)始進(jìn)行
一次性寫(xiě)操作。(PIPE_BUF ==>> /usr/include/linux/limits.h)
當(dāng)要寫(xiě)入的數(shù)據(jù)量大于PIPE_BUF時(shí),linux將不再保證寫(xiě)入的原子性。FIFO緩沖區(qū)一有空閑區(qū)域,寫(xiě)進(jìn)程就會(huì)試圖向管道寫(xiě)入數(shù)據(jù),寫(xiě)操作在寫(xiě)完所有請(qǐng)求寫(xiě)的數(shù)據(jù)后返回。
當(dāng)要寫(xiě)入的數(shù)據(jù)量大于PIPE_BUF時(shí),linux將不再保證寫(xiě)入的原子性。在寫(xiě)滿(mǎn)所有FIFO空閑緩沖區(qū)后,寫(xiě)操作返回。
當(dāng)要寫(xiě)入的數(shù)據(jù)量不大于PIPE_BUF時(shí),linux將保證寫(xiě)入的原子性。如果當(dāng)前FIFO空閑緩沖區(qū)能夠容納請(qǐng)求寫(xiě)入的字節(jié)數(shù),寫(xiě)完后成功返回;如果當(dāng)前FIFO空閑緩沖區(qū)不能夠容納請(qǐng)求寫(xiě)入的字節(jié)數(shù),則返回EAGAIN錯(cuò)誤,提醒以后再寫(xiě);
設(shè)置了阻塞標(biāo)志
if (buf_to_write <= PIPE_BUF) //寫(xiě)入的數(shù)據(jù)量不大于PIPE_BUF時(shí)
then
if ( buf_to_write > system_buf_left )//保證寫(xiě)入的原子性,要么一次性把buf_to_write全都寫(xiě)完,要么一個(gè)字節(jié)都不寫(xiě)!
then
block ;
until ( buf_to_write <= system_buf_left );
goto write ;
else
write ;
fi
else
write ; //不管怎樣,就是不斷寫(xiě),知道把緩沖區(qū)寫(xiě)滿(mǎn)了才阻塞
fi
管道寫(xiě)端 pipe_read.c
//pipe_read.c
#include
#include
#include
#include
#include
#include
#include
#define FIFO_NAME "/tmp/my_fifo"
#define BUFFER_SIZE PIPE_BUF
int?main()
{
int?pipe_fd;
int?res;
int?open_mode?=?O_RDONLY;
char?buffer[BUFFER_SIZE?+?1];
int?bytes?=?0;
memset(buffer,?'
總結(jié)
以上是生活随笔為你收集整理的linux查看fifo内容,linux 有名管道(FIFO)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux删除软件包git的命令,lin
- 下一篇: linux变量赋值用中括号,Shell脚