有名管道(二)
?
一、從FIFO中讀取數(shù)據(jù):
約定:如果一個(gè)進(jìn)程為了從FIFO中讀取數(shù)據(jù)而以阻塞的方式打開(kāi)FIFO,則稱(chēng)內(nèi)核為該進(jìn)程的讀操作設(shè)置了阻塞標(biāo)志。
- 如果有進(jìn)程為寫(xiě)而打開(kāi)FIIF(寫(xiě)端存在),且當(dāng)前FIFO內(nèi)沒(méi)有數(shù)據(jù),則對(duì)于設(shè)置了阻塞標(biāo)志的讀操作來(lái)說(shuō),將一直阻塞,對(duì)于沒(méi)有設(shè)置阻塞標(biāo)志讀操作來(lái)說(shuō)返回-1,當(dāng)前errno值為EAGAIN提醒以后再試。
- 對(duì)于設(shè)置阻塞標(biāo)志的讀操作來(lái)說(shuō),造成阻塞的原因有兩種,當(dāng)前FIFO內(nèi)有數(shù)據(jù),但其他進(jìn)程正在讀這些數(shù)據(jù);另外FIFO內(nèi)沒(méi)有數(shù)據(jù)。解阻塞的原因則是FIFO中有新的數(shù)據(jù)寫(xiě)入,不論寫(xiě)入數(shù)據(jù)量的大小,也不論讀操作請(qǐng)求多少數(shù)據(jù)量。
- 如果沒(méi)有進(jìn)程寫(xiě)打開(kāi)FIFO,則設(shè)置了阻塞標(biāo)志的讀操作會(huì)阻塞。
- 如果寫(xiě)端關(guān)閉,管道中有數(shù)據(jù)讀取管道中的數(shù)據(jù),如果管道沒(méi)有數(shù)據(jù)讀端將不會(huì)繼續(xù)阻塞,此時(shí)返回0。(注意:如果FIFO有數(shù)據(jù),則設(shè)置了阻塞標(biāo)志的讀操作來(lái)說(shuō)不會(huì)因?yàn)镕IFO的字節(jié)數(shù)小于請(qǐng)求讀的字節(jié)數(shù)而阻塞,讀操作會(huì)返回FIFO現(xiàn)有的數(shù)據(jù)量。)
?
二、向FIFO中寫(xiě)入數(shù)據(jù)
約定:如果一個(gè)進(jìn)程為了向FIFO中寫(xiě)入數(shù)據(jù)而阻塞打開(kāi)FIFO,那么稱(chēng)該進(jìn)程內(nèi)的寫(xiě)操作設(shè)置了阻塞標(biāo)志。
1. 對(duì)于設(shè)置了阻塞標(biāo)志的寫(xiě)操作:
- 當(dāng)寫(xiě)入數(shù)據(jù)量不大于PIPE_BUF時(shí),linux將保證寫(xiě)入的原子性,如果此時(shí)管道空閑緩沖區(qū)不足以容納要寫(xiě)入的字節(jié)數(shù),則進(jìn)入睡眠,直到緩沖區(qū)中能夠?qū)懭氲淖止?jié)數(shù),才開(kāi)始進(jìn)行一次性寫(xiě)操作。
- 當(dāng)要寫(xiě)入的數(shù)據(jù)量大于PIPE_BUF時(shí),Linux將不再保證寫(xiě)入的原子性。FIFO緩沖區(qū)一有空閑,寫(xiě)進(jìn)程就會(huì)試圖向管道寫(xiě)入數(shù)據(jù),寫(xiě)操作在寫(xiě)完所有請(qǐng)求寫(xiě)的數(shù)據(jù)后返回。
2. 對(duì)于沒(méi)有設(shè)置阻塞標(biāo)志的寫(xiě)操作:
- 當(dāng)要寫(xiě)入的數(shù)據(jù)量大于PIPE_BUF時(shí),Linux將不再保證寫(xiě)入的原子性。在寫(xiě)滿所有FIFO空閑緩沖區(qū)后,寫(xiě)操作返回。
- 當(dāng)要寫(xiě)入的數(shù)據(jù)量不大于PIPE_BUF時(shí),linux將保證寫(xiě)入的原子性,如果當(dāng)前FIFO空閑緩沖區(qū)能夠容納寫(xiě)入的字節(jié)數(shù),寫(xiě)完成功返回;如果當(dāng)前FIFO空閑緩沖區(qū)不能容納請(qǐng)求寫(xiě)入的字節(jié)數(shù),則返回EANGIN錯(cuò)誤,提醒以后再寫(xiě)。
總結(jié)
- 上一篇: 成都欢乐谷取票没带身份证
- 下一篇: 试管婴儿需不需要吃叶酸