2016-05-09 119 views
0

我想從FIFO讀取,但我不瞭解它的行爲。 這是寫的一面,爲write.c:從FIFO讀取C

for(int i = 1;i<argc;i++){ 
    if(write(fifoFd,argv[i],strlen(argv[i])) <= 0) 
     perror("Error writing"); 
    } 

這是讀側,read.c:

char buf[1024]; 
    while(1){ 
    int b = read(fifoFd,buf,1024); 
    if(b<=0) break; 
    } 
    printf("%s\n",buf); 

首先,我開始read.c ./read然後我執行./write 如果我執行像這樣寫./write backup *.txt有時我得到我的預期,即backupexample1.txtexample2.txt。 但有時我只得到example1.txtexample2.txt,我不理解這個,「備份」在哪裏?

+0

請參見[MCVE] – KevinDTimm

回答

3

您的代碼:

while(1){ 
    int b = read(fifoFd,buf,1024); 
    if(b<=0) break; 
} 
printf("%s\n",buf); 

你循環,通過您覆蓋緩衝區中的每一次循環,並然後打印緩衝區。因此,有時候,您讀取「備份」,然後讀取「example1.txtexample2.txt」(覆蓋「備份」),其他時候您只需一次讀取即可讀取整個文件。

如果更改循環讀入緩衝區的無人居住的部分,它將行爲一致:

int read = 0; 
while(read != 1024){ 
    int b = read(fifoFd,buf+read,1024-read); 
    if(b<=0) break; 
    read += b; 
} 
printf("%s\n",buf); 
+0

但不應在字符串中在同一條線上總是寫的? –

+0

@P_Ferreira你不會寫出所有的字符串,只有你收到的最後一個字符串。循環完成後'printf'調用*。 – davmac

+0

但是爲什麼有時候備份是單獨的,有時候這些字符串是在同一行? –