从fifo C读

时间:2016-05-09 16:20:06

标签: c fifo

我试图从一个fifo读取,我不理解它的行为。 这是写端,write.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而我不理解这一点,&#34; backup&#34;?

1 个答案:

答案 0 :(得分:3)

您的代码:

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

循环,每次循环覆盖缓冲区,然后打印缓冲区。所以,有时候,你会读到&#34; backup&#34;然后是&#34; example1.txtexample2.txt&#34; (这会覆盖&#34;备份&#34;),有时你只需一次阅读即可全部阅读。

如果更改循环以读入缓冲区的未填充部分,它将表现一致:

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