2009-02-24 465 views
17

如果我有一個程序創建並嘗試使用mkfifo打開一個命名管道,如何打開一個管道進行讀寫操作而不會阻塞?如何在命名管道(mkfifo)上執行非阻塞fopen?

具體而言,我正在寫其可以具有或不具有GUI(用Java編寫的)來運行,一個C程序。

在C程序中,我成功地使用mkfifo創建命名管道,但是當我做

FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/ 

的fopen不返回,直到GUI將打開該管道進行寫入。我希望做的是讓管道準備好讀取一次(如果)GUI決定寫入它 - 我將把文件描述符放在select()調用中。期望java GUI可能永遠不會被啓動是合理的,所以我不能依靠它來在任何特定點甚至根本上打開管道的另一端。

我也會有第二個管開放的寫作,我想我也會有同樣的問題。此外,我無法在沒有閱讀器的輸出管道上設置O_NONBLOCK。

有什麼建議嗎?

(這是一個Linux系統上運行)

+0

您是否需要在select()在輸入管道上點火之前打開輸出管道? – 2009-02-24 03:47:13

+0

@tinkertim - 我想技術上不是 - 我已經在設置函數中設置了它們,但是我可以先設置輸出管道然後調用select,爲什麼? – Zxaos 2009-02-24 04:47:12

回答

12

你可以open()你管O_RDONLY | O_NONBLOCK,如果你想要的C流,你可以用fdopen()得到它。但是,有可能是與select()一個問題 - 據我所知,管道的fd開放閱讀有沒有作家總是閱讀準備,read()返回0,所以select()將無限期解僱。

克服這將是打開的管道O_RDWR的缺憾方式;也就是說,至少有一個作家(你的C++程序)。無論如何,這將解決您的問題。