我试图从一个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;?
答案 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);