2012-09-11 34 views
3

當我有兩個過程,服務器和一個客戶端,這應該通過管道(C++,Linux)的通信。 服務器打開與O_RDONLY標誌管道,並與O_WRONLY客戶端。 但是,服務器模塊在open功能,而客戶端似乎已成功運行(在open函數返回成功等方面做了write功能)。open()的塊試圖打開管,用於讀取

我已閱讀,如果O_NONBLOCK標誌設置,讀功能將繼續,但我不希望它繼續,如果沒有客戶端連接 - 這是確定阻塞,直到客戶端連接,但在我的情況下,客戶端運行完成後,即使它仍然受阻......

你能普萊舍告訴我,我做錯了......?

下面是代碼:

// Server side 
int pipe; 
int status, nr_read = 0; 

status = mkfifo(FIFO_NAME, 0666); 
if (status < 0) 
{ 
    // If the file already exists, delete it 
    unlink(FIFO_NAME); 

    // Try again 
    status = mkfifo(FIFO_NAME, 0666); 

    if(status < 0) 
    { 
     printf("mkfifo error: %d\n", status); 
     return status; 
    } 
} 

pipe = open(FIFO_NAME, O_RDONLY); 
printf("Never gets here...\n"); 
[...] 
nr_read = read(pipe, my_char_array, CHAR_ARRAY_SIZE); 
[...] 
close(pipe); 
unlink(FIFO_NAME); 

它從來沒有得到的 「printf」 上線......

// Client side: 
int pipe, nr_sent = 0; 
int status = 0; 

pipe = open(FIFO_NAME, O_WRONLY); 
if (pipe < 0) 
{ 
    printf("open fifo error: %d\n", status); 
    return pipe; 
} 

[...] 
nr_sent = write(pipe, my_char_array, CHAR_ARRAY_LENGTH); 
[...] 
close(pipe); 

編輯

我沒有提該行 #define FIFO_NAME "MYFIFO"

...這裏是問題: 爲喬迪Hagins說,該路徑是相對的一個過程,從不同的文件夾被啓動,他們試圖打開不同的文件。

+0

難道你accidentially重新FIFO中的客戶端連接後? –

+0

在調試過程中,我等待服務器到達「打開」行,點擊繼續,然後運行客戶端...所以我不相信... – Ioanna

+0

您是否檢查過該文件實際上是由'mkfifo'創建的? –

回答

4

讀取端將無法完成阻塞開到寫入端已經完成了管道。

如果您不希望使用此功能,請打開讀取端O_NONBLOCK,並使用select來確定寫入端何時相應地建立了連接和過程輸入。

編輯

哎呀。只是注意到你說你的服務器即使在運行客戶端後也沒有完成開放。真奇怪。我只是剪切/粘貼你的代碼,並在添加缺少的頭文件和缺少的變量/常量後,運行服務器/客戶端,並按預期運行。

服務器等待客戶端,並且在客戶端運行,服務器完成了打開和讀取數據。

檢查您的文件以確保您具有實際的FIFO。

您應該看到這樣的事情:

> ls -lat /tmp/FIFO 
prw-r--r-- 1 user user 0 2012-09-11 10:22 /tmp/FIFO 


> stat /tmp/FIFO 
    File: `/tmp/FIFO' 
    Size: 0    Blocks: 0   IO Block: 4096 fifo 
Device: 6802h/26626d Inode: 186603  Links: 1 
Access: (0644/prw-r--r--) Uid: (10042/ user) Gid: (10042/ user) 
Access: 2012-09-11 10:22:48.000000000 -0400 
Modify: 2012-09-11 10:22:48.000000000 -0400 
Change: 2012-09-11 10:22:48.000000000 -0400 
+0

解決了,謝謝你的例子。我將FIFO從「MYFIFO」(一個#define,我沒有在問題中發佈,不幸)更名爲「/ tmp/FIFO」,如同你的例子,現在它不再阻塞了......如果「open」函數必然需要一個完整的路徑,而不是爲什麼當試圖打開閱讀時阻塞,並且在打開文字時沒有阻塞? – Ioanna

+1

'open()'不需要完整的路徑。但是,您必須確保客戶端和服務器中的路徑引用相同的文件。另外,某些文件系統不能支持FIFO文件,但在創建文件時會導致錯誤。我最好的猜測是你的服務器和客戶端實際上並不是指同一個文件(也許它們是從不同目錄運行的,並且由於它們使用相對文件名,服務器正在創建一個新的FIFO,並且客戶端正在使用一個已經存在)。無論如何,很高興提供幫助。 –

+0

是的,就是這樣,他們是從不同的目錄中跑出來的。謝謝! – Ioanna