2012-08-27 178 views
0

我一直在嘗試實現fifo寫入和讀取,場景如此,writer1向fifo寫入4個字節,reader1讀取2個字節,reader2讀取接下來的2個字節,下面是我做了什麼,從FIFO讀取/寫入

writer.c

#include<stdio.h> 
#include<unistd.h> 
#include<fcntl.h> 
#include<sys/types.h> 
#include<sys/stat.h> 
#include<string.h> 
int main() 
{ 
FILE *file; 
unsigned char message[] = {0x66,0x66,0x67,0x67}; 
file = fopen("fifo1","wb"); 
fwrite(&message, 1,4,file); 
} 

reader.c

#include<stdio.h> 
#include<unistd.h> 
#include<fcntl.h> 
#include<sys/types.h> 
#include<sys/stat.h> 
#include<string.h> 
int main() 
{ 
FILE *file; 
unsigned char buff[2]; 
file = fopen("fifo1","rb"); 
fread(&buff, 1,2,file); 

printf("%c\n",buff[0]);printf("%c\n",buff[1]); 
} 

然後我遵守他們與跑reader1第一終端和reader2第二終端和作家在th e第三終端。

我以爲我會在其中一個讀取器中獲得前兩個字節(ff),而在另一個讀取器中獲得後兩個字節(gg),但它沒有像我想的那樣工作,有人可以讓我知道我做錯了什麼,請注意,我不在乎誰讀了前兩個字節或後兩個字節,這裏重要的是兩個讀取器一次讀取2個字節。我使用Ubuntu,GCC mkfifo創建了fifo。

回答

0

fread被緩衝,所以它正在讀取所有四個字節,然後給你你要求的兩個。

要獲得您要查找的行爲,請使用openread而不是fopenfread

+0

寫入和讀取與二進制確定 – Ivan

+0

真棒的人,它工作:) – Ivan

0

你可能已經簡化了這個例子,刪除了這個特性,但爲什麼讀者不在等待確保文件存在?喜歡的東西:

while (!fopen("fifo1","rb) { 
    wait(10); 
} 
fread... 

,或者至少確保它是開放的

if (!fopen("fifo1", "rb) { 
    printf("error, cannont open file"); 
} 

測試每個腳本以及手動。運行一個作家。並檢查並查看文件是否符合您的期望。手動將文件放在那裏,並檢查閱讀器是否正在查找並閱讀文件。