当前位置: 首页 > 面试题库 >

FIFO实现

秦飞航
2023-03-14
问题内容

考虑以下代码:

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字段的长度,因此您知道何时开始和停止读取每个数据块。



 类似资料:
  • 我需要一个简单的FIFO实现的队列来存储一堆整数(我不介意它是泛型实现)。 在或Trove/Guava库中已经为我烘焙了什么?

  • 我很好奇如何在Java中实现FIFO(先进先出)算法。我已经创建了3个类,但必须实现FIFO和SJF(最短作业优先)的调度算法。 对于模拟器类,我们有以下变量: 那么方法是: 其他方法有: 还有另外两个类进程和CPU。进程保存有关应存储在那里的单个进程的任何信息。

  • 本文向大家介绍Linux 进程通信之FIFO的实现,包括了Linux 进程通信之FIFO的实现的使用技巧和注意事项,需要的朋友参考一下 FIFO通信(first in first out) FIFO 有名管道,实现无血缘关系进程通信。 创建一个管道的伪文件 a.mkfifo testfifo 命令创建 b.也可以使用函数int mkfifo(const char *pathname, mode_t

  • MySQL fifo Plugin 是数据库与其他第三方应用程序进程间通信解决方案。 1. 背景 你是否有这样的需求: 你需要监控访问网站的IP,当同一个IP地址访问次数过多需要做出处理,例如拉黑,直接丢进iptables 防火墙规则连中。你的做法只能每个一段时间查询一次数据库,并且判断是否满足拉黑需求? 你是否需要监控某些数据发生变化,并通知其他程序作出处理。例如新闻内容修改后,需要立即做新页面

  • 目标:在OpenCL中实现下面所示的图表。OpenCl内核需要做的主要工作是将系数数组和临时数组相乘,然后在最后将所有这些值累加为一。(这可能是时间最密集的操作,并行性在这里非常有用)。 我正在为执行乘法和加法的内核使用一个辅助函数(我希望这个函数也是并行的)。 图片描述: 每次一个值被传递到与系数数组大小相同的数组(临时数组)中。现在,每次一个值被传递到这个数组中,临时数组都会并行地与系数数组相

  • 问题内容: 有什么方法可以用Go语言创建Unix FIFO?没有,也没有在包装,虽然我预期命名的FIFO在很大程度上是在POSIX操作系统的使用。实际上,有一个用于创建未命名FIFO(管道)的功能,但是没有用于创建命名管道的功能。 我是唯一需要他们的人吗? 问题答案: 为了使其能够在Linux上运行,我只是做了一个 它似乎可以解决问题。 这是基础mknod()调用的参考