首页
学习
活动
专区
圈层
工具
发布

FIFO实现
EN

Stack Overflow用户
提问于 2010-05-20 09:47:56
回答 4查看 3K关注 0票数 5

考虑以下代码:

writer.c

代码语言:javascript
复制
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

代码语言:javascript
复制
int fd = open("/tmp/myfifo", O_RDONLY);

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

我的问题是:

因为事先不知道foo和bar有多少字节,我怎么知道从reader.c读取多少字节呢?

因为,例如,如果我在reader中读取10个字节,而foo和bar加在一起少于10个字节,我会将它们放在同一个变量中,这是我不想要的。

理想情况下,每个变量都有一个read函数,但我也不知道数据有多少字节。

我考虑在writer.c中添加另一条write指令,在带有分隔符的write for foo和bar之间,这样我就可以从reader.c中解码它了。这是做这件事的方法吗?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-20 09:50:45

分隔符是一种方法,只要您知道数据的顺序,并且只将分隔符用作分隔符,而不是将其用作数据的一部分,就可以很好地使用分隔符。

另一种方法是在每次写入管道之前加上后面的字节数,宽度固定。因此,您将知道有多少数据将从管道中流出。使用固定的宽度,这样您就可以确切地知道宽度字段的长度,这样就可以知道何时开始和停止读取每个数据块。

票数 6
EN

Stack Overflow用户

发布于 2010-05-20 09:55:50

分隔符确实是实现这一点的一种方法--而且足够方便的是,C字符串附带了这样一个分隔符--字符串末尾的nul终止符。

如果您更改了write()调用,使它们也写出nul终止符(请注意,sizeof(char)被定义为1,因此可以省略它):

代码语言:javascript
复制
write(fd, foo, strlen(foo) + 1);
write(fd, bar, strlen(bar) + 1);

然后,您可以在读取字符串后将其拆分(您仍需要将它们读取到一个缓冲区中,然后将其拆分,除非您一次读取一个字符)。

票数 1
EN

Stack Overflow用户

发布于 2010-05-20 09:58:42

为了稍微概括WhirlWind的答案,您必须建立某种不同的协议。你发送的东西必须有顺序,否则你不知道从上到下,正如你所指出的。

WhirlWind的两个建议都会奏效。您还可以在管道或FIFO之上实现自定义(或标准)协议,以便将代码移植到具有不同系统的更加分布式的环境中,并简化以后的任务。然而,问题的症结在于,在你能够真正沟通之前,你必须为沟通设定规则。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2870549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档