|   有名管道的用法  時間:2016-12-29作者:華清遠見 有(you)名管道又稱(cheng)為FIFO,是進程(cheng)間通信的一種(zhong)方式。FIFO具有(you)以下(xia)特點:   1.全(quan)雙工(gong)的通(tong)信模式,數據先(xian)進先(xian)出; 2.可以用于任意的(de)(de)進程之間,通過指定相同的(de)(de)管道文件進行通信; 3.文件名存在文件系統中(zhong),而管(guan)道中(zhong)的內容存在于內存中(zhong)。可通過(guo)open、read、write對其操作; 使(shi)用FIFO的步(bu)驟(zou)如下: 一、創建/打(da)開一個(ge)FIFO FIFO是一種文件類型(xing),在(zai)Linux系統中FIFO的類型(xing)用p表示。如下所(suo)示: 
	-rwxr-xr-x 1 root root 7368 2008-10-29 09:05 create_fifo  
	可以看到,雖然FIFO文件存在于文件系統中(可供不同的進程打開),但FIFO中的內容都存放在內存中,所以文件大小始終為0。 
	#include <sys/stat.h>  函數mkfifo用于創(chuang)建(jian)一(yi)個有名管(guan)道,參數path指定要創(chuang)建(jian)的FIFO的路徑,mode為該管(guan)道文件的訪問權限(xian),一(yi)般用八進(jin)制(zhi)數表(biao)示。 
	#include <sys/stat.h>  函數open通過指定路(lu)徑打開(kai)一個文(wen)件(jian),不同的進程可以(yi)調用open打開(kai)同一個FIFO進行通信(xin)。參考下面的代碼(相關(guan)頭文(wen)件(jian)省略) 
	#define BUF_SIZE 51  二、讀(du)/寫FIFO 進(jin)程(cheng)打開FIFO后,就可以根據open時指定的選項(xiang)對其進(jin)行(xing)相應的讀/寫操作(請參(can)考open的幫助(zhu)文檔中關于(yu)選項(xiang)的說(shuo)明)。 
	#include <unistd.h> 對FIFO的寫操作,大家可以仿照上面的代碼。 后(hou)總結一下(xia)在使用FIFO時(shi)要(yao)注意的問題(ti): 1. 在用open打(da)開(kai)FIFO時有(you)可能會阻塞,原因就(jiu)是(shi)當前只有(you)讀端(duan)或寫(xie)端(duan)存在。換句話說,如果程序在打(da)開(kai)FIFO時指定(ding)了只讀方式/只寫(xie)方式,那么該進 程對(dui)于打開的(de)FIFO來說就是(shi)一(yi)個讀端/寫(xie)端。如果指定的(de)是(shi)讀寫(xie)方(fang)式(shi),那么進程既是(shi)讀端又是(shi)寫(xie)端。 2. 從(cong)FIFO中讀數(shu)據(ju)時(用read函數(shu)),如果(guo)沒(mei)有(you)數(shu)據(ju),默(mo)認是阻塞等待,直(zhi)到有(you)數(shu)據(ju)被寫入FIFO。如果(guo)read函數(shu)返回0,說明該FIFO所有(you)的(de)寫端都已關 閉,程序要做相應的(de)處理(li)。   向(xiang)FIFO寫(xie)入數據時(使用(yong)write函數),如果FIFO有足夠空間(jian),write函數會(hui)返回(hui)寫(xie)入的字節數;如果空間(jian)不(bu)夠,write函數會(hui)阻塞,直到寫(xie)完為止。當所 有(you)的讀端都關閉時,再向FIFO寫數(shu)據會出(chu)錯。內核(he)會向寫進(jin)程(cheng)發管道斷裂的信號(SIGPIPE), 從而終止該(gai)進(jin)程(cheng)。處理的辦法有(you)兩種:程(cheng)序以讀寫方式打開 FIFO或是在程序中捕捉SIGPIPE信號,由(you)用(yong)戶(hu)自行處理。 
 相關資訊 發表評論 
 |