考虑以下代码:
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对其进行解码就不会有问题。这是解决方法吗?
谢谢。
分隔符是解决此问题的一种方法,只要您知道数据的顺序,并且将分隔符用作分隔符,而不将其用作数据的一部分,则分隔符就可以正常工作。
另一种方法是在每次写入管道之前,先以固定宽度跟随字节数。这样,您将知道有多少数据将通过管道传输。使用固定的宽度,因此您确切知道width字段的长度,因此您知道何时开始和停止读取每个数据块。