2013-05-12 163 views
0

我的代碼有兩個問題。在C中製作fifo

第一個問題是,一旦我創建了一個fifo,我不知道如何在代碼中添加一個條件以便將來運行,如果fifo存在 - 那麼就不要創建它。試圖谷歌,「訪問」不起作用(它只是在那裏,並沒有繼續)。

我的第二個問題是,代碼卡在「打開(」MyFifo ...「行,即使這是我創建fifo後的第一次(意思是我剛創建了fifo,mkfifo成功了,並且我到達的open()線 - 這是卡在那裏)

//create new fifo 
if(mkfifo("myFifo",0666)<0) 
{ 
    perror("fifo creation failed."); 
    exit(1); 
} 

//get fifo fd 
if((fd=open("myFifo",O_RDONLY))==-1) 
{ 
    perror("failed opening fifo."); 
    exit(1); 
} 

任何想法,我做錯了

回答

1

函數調用你要找的是stat如果該文件存在,它將填補。?。具有修改時間等文件屬性的struct stat如果文件不存在,stat()將返回-1和errno將被設置爲EACCESS


mkfifo man page說,

打開FIFO讀取正常阻塞,直到一些其它進程打開的寫作相同的FIFO,反之亦然。

要讓open()停止掛起,請啓動另一個首先寫入FIFO的進程。如果其他進程打開先寫入的FIFO,則讀取程序根本不會掛在open()上。

+0

謝謝。另一個問題:從fifo讀取也阻止?我的意思是,如果我讀了一個空的fifo,我的過程將被阻止,直到有人寫信給它?我怎樣才能實現「當有人寫信給fifo時閱讀」? – Jjang 2013-05-12 20:57:17

+2

FIFO上的'read'阻塞,直到另一個進程'寫'給它。參見[Beej的Unix IPC指南](http://beej.us/guide/bgipc/output/html/multipage/fifos.html)。 – andrewdotn 2013-05-12 21:04:21

+1

'EACCESS'不是從'stat()'得到的唯一可能的錯誤;如果名稱是路徑名,並且其中一個組件是不存在的目錄或ELOOP,或者......您可以獲得ENOTDIR,但只需嘗試創建FIFO並不一定是不可行的,錯誤不是'EEXIST'。然後你知道這個名字存在;你只需要使用'stat()'來驗證它是否是一個FIFO('S_ISFIFO()')。 – 2013-05-12 22:03:21