2016-05-09 110 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

但是为什么有时候备份是单独的,有时候这些字符串是在同一行? –