一尘不染

FIFO实现

linux

考虑以下代码:

writer.c

mkfifo("/tmp/myfifo", 0660);

int fd = open("/tmp/myfifo", O_WRONLY);

char *foo, *bar;

...

write(fd, foo, strlen(foo)*sizeof(char));
write(fd, bar, strlen(bar)*sizeof(char));

reader.c

int fd = open("/tmp/myfifo", O_RDONLY);

char buf[100];
read(fd, buf, ??);

我的问题是:

由于事先不知道foo和bar将有多少个字节,我如何知道要从reader.c读取多少个字节?
因为例如,如果我在reader中读取10个字节,而foo和bar小于10个字节,那么我会将它们都放在同一个变量中,而这是我不希望的。
理想情况下,我将对每个变量都具有一个读取功能,但是我又一次事先不知道数据将具有多少字节。
我考虑过要在writer.c中为foo和bar之间添加带有分隔符的另一条写指令,然后从reader.c对其进行解码就不会有问题。这是解决方法吗?

谢谢。


阅读 241

收藏
2020-06-07

共1个答案

一尘不染

分隔符是解决此问题的一种方法,只要您知道数据的顺序,并且将分隔符用作分隔符,而不将其用作数据的一部分,则分隔符就可以正常工作。

另一种方法是在每次写入管道之前,先以固定宽度跟随字节数。这样,您将知道有多少数据将通过管道传输。使用固定的宽度,因此您确切知道width字段的长度,因此您知道何时开始和停止读取每个数据块。

2020-06-07