读取时并非所有写入FIFO的消息都被接收

时间:2014-11-11 13:29:04

标签: c linux mkfifo

在linux下用C语言处理fifo文件时,我遇到了一个奇怪的问题。

让我们从代码开始:

#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>

int main(int args, char *argv[])
{
mkfifo("fif",0666);
int x = fork();

if(x!=0)
{
     if(strcmp(argv[1],"read")==0)
     {
     int rea=open("fif",O_RDONLY,0666);
     wait(NULL);
     char buf[50];
     read(rea,buf,50);
     printf("\n %s \n",buf);
     close(rea);
     }
}

else
{
     if(strcmp(argv[1],"write")==0)
     {
     int wri=open("fif",O_WRONLY,0666);
     write(wri,argv[2],strlen(argv[2])+1);
     close(wri);
     }
}



return 0;
}

现在我想要代码的一些细节。

运行这样的程序后:

./prog write hello
./prog write how
./prog write are_you
./prog read

我想进入终端:

hello
how
are_you

但不是这样,我只是得到了这个:

are_you

问题是:我想向FIFO写入几条消息,然后通过读取FIFO,它旨在接收存储在其中的全文。但不幸的是,只有最后一条消息存储/写入标准输出(在这种情况下是终端),就像执行的唯一命令一样:

./prog write are_you

我试图删除这一行:

mkfifo("fif",0666);

因为我认为,如果FIFO文件已经存在,该行可以创建并覆盖现有的FIFO文件。但这并没有改变任何事情。

那么我必须做些什么来使其按预期工作?

1 个答案:

答案 0 :(得分:1)

首先,请注意您正在将终止\0字符写入FIFO:

 write(wri,argv[2],strlen(argv[2])+1);

当您阅读fifo的内容时,您还会阅读\0个字符,并将数据传递给printf。问题是,printf在找到第一个\0时停止读取字符串,因此您只能看到来自fifo的第一条消息。

如果您在strace下运行阅读程序:

,您可以清楚地看到这一点
read(3, "are_you\0hello\0how\0", 50)    = 18
...(snip)...
write(1, " are_you \n", 10)             = 10
相关问题