问题标签 [fifo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1035 浏览

c - 无法让 Unix FIFO 正常工作?

我正在尝试在 Linux 中编写一个简单的守护程序,它将创建一个 FIFO,然后收集写入 FIFO 的任何内容,并稍后将该数据写入文件。

我的期望是,一旦我的守护进程创建了 FIFO,我就可以重复执行“echo text > /myfifo”。完成后,我可以执行“echo quit > /myfifo”,我的程序将退出并将所有数据写入磁盘。

我目前正在使用 poll() 来了解 FIFO 上何时有更多数据。这工作正常,直到我第一次将数据回显到 FIFO 之后。数据回显良好,但此后我的民意调查不断返回 SIGHUP。

在每个进程写入 FIFO 后,我是否需要重置(或关闭并重新打开)FIFO?

我的代码的伪代码如下所示:

0 投票
5 回答
294 浏览

python - 如何建立一个有限制的撤消存储?

我想建立一个数据结构来存储有限的撤消缓冲区,以存储 6 dict 数据为例,下面的伪代码:

我的问题是,现有的内置数据类型或标准库类型可以用于这样的目的吗?

并且这样的结构是否有可能在一个结构实例中存储多种类型,例如,如果我想一次性存储 dict 和自定义类?

谢谢!

Rgs,

KC

0 投票
2 回答
404 浏览

.net - 我可以从 .NET 中的并发线程读取和写入 FIFO 吗?

我正在使用Queue<T>缓存视频。这个想法是用数据(Enqueue)填充它,开始播放(Dequeue)并在数据到达时不断填充。我可以从后台线程进行填充吗?

0 投票
4 回答
15994 浏览

c++ - 如何从 C++/Qt Linux 应用程序中逐行读取 FIFO/命名管道?

如何从 C++/Qt Linux 应用程序中逐行读取 FIFO/命名管道?

今天我可以从 Qt 程序中打开并读取 fifo,但我无法让程序逐行读取数据。Qt 读取整个文件,这意味着他等到“发送者”关闭他的会话。

让我们以一些 shell 命令为例来展示我希望应用程序执行的操作。

首先创建一个fifo

然后我们可以使用 cat 从 fifo 中读取

然后我们用另一只猫发送一些数据

然后开始输入一些东西,每次你敲回车时它都会到达阅读器。然后当你用 Ctrl+D 关闭它时,两边都会结束。

现在发送者很容易用 QTextStream 创建,你只需要在你想发送的时候刷新。

但是然后写一个逐行读取的小阅读器是我现在卡住的地方,我对Qt lib的所有尝试最终都得到了数据,但直到发件人在fifo上使用file.close() . 不是当他冲洗时,就像我使用 cat 阅读时发生的那样。

像这个例子:

我错过了什么?

感觉就像我需要在流上使用某种 isReady 或 lineAvailable 或类似的东西,但我在文档中找不到任何适合...

/谢谢


注意

如果我使用低级 c 风格并在当时阅读一个字符,我确实得到了我正在寻找的风格。但是能够做同样的 Qt 风格会很好。


更新

当我启动调试器时,程序挂在 readLine() 上,直到对方关闭 fifo 才继续。

我确实使用“>>”得到了同样的结果

0 投票
3 回答
6776 浏览

java - 为我自己的类对象制作我自己的FIFO Queue类来填充它?

我正在尝试创建一个填充了我自己的类对象的 FIFO 队列。
我找到了这个例子,但如果我用 < PCB > 替换 < E > 它不起作用:

0 投票
3 回答
1378 浏览

c# - C# 阻塞 FIFO 队列会泄漏消息吗?

我正在做一个学术开源项目,现在我需要在 C# 中创建一个快速阻塞 FIFO 队列。我的第一个实现只是将一个同步队列(带动态扩展)包装在读取器的信号量中,然后我决定以以下(理论上更快)的方式重新实现

这是我们在教科书中找到的带有静态数组的经典 FIFO 队列实现。它旨在以原子方式递增指针,并且由于我无法使指针在达到(容量-1)时回到零,因此我计算模数。从理论上讲,使用 Interlocked 与在进行增量之前锁定相同,并且由于存在信号量,因此可以有多个生产者/消费者进入队列,但一次只能修改一个队列指针。首先,因为 Interlocked.Increment 先递增,然后返回,我已经明白我仅限于使用后递增值并从数组中的位置 1 开始存储项目。没问题,到了一定值我就回0了

它有什么问题?您不会相信,在重负载下运行时,有时队列会返回 NULL 值。我确定,重复一遍,我确定,没有任何方法将null排入队列。这绝对是正确的,因为我尝试在 Enqueue 中进行空检查以确保没有抛出任何错误。我用 Visual Studio 为此创建了一个测试用例(顺便说一下,我使用像 maaaaaaaany 人这样的双核 CPU)

一旦消费者线程得到一个空值,就会计算一个错误。当使用 1 个生产者和 1 个消费者执行测试时,它成功了。当使用 2 个生产者和 2 个消费者或更多进行测试时,会发生灾难:甚至检测到 2000 次泄漏。我发现问题可能出在 Enqueue 方法中。根据设计合同,生产者只能写入空的单元格(null),但是通过一些诊断修改我的代码我发现有时生产者试图在非空单元格上写入,然后被“好“ 数据。

然后经常发生“太糟糕”的异常。但是并发写入引发的冲突太奇怪了,因为增量是原子的,并且写入器的信号量只允许与空闲数组单元一样多的写入器。

有人可以帮我吗?如果您与我分享您的技能和经验,我将不胜感激。

谢谢你。

0 投票
4 回答
16738 浏览

c - 在 C 中实现 FIFO 队列

对于嵌入式应用程序,我正在尝试使用 ANSI C 实现结构的先进先出 (FIFO) 队列。最直接的方法似乎是实现链表,这样每个结构都包含指向队列中下一个的指针。因此,我将结构本身定义为:

到现在为止还挺好。如果我将指向队列中第一个和最后一个项目的指针定义为:

...然后我希望能够通过说明(例如)向队列添加新操作:

...所以返回时,lastAction 将是指向队列中新创建的最后一个动作的指针。因此,将动作添加到队列的例程如下所示:

一切都会很好,花花公子,除了这段代码不会编译。错误在说

...编译器声称“->”左侧的项目不是有效的结构。当然,它必须是。如果事实上我做了应该是完全多余的演员:

...然后编译器很高兴。但是,我担心错误消息暗示我在这里可能做错了一些微妙的事情。所以(直截了当),谁能告诉我为什么编译器不高兴,以及是否有更好的方法来做我想做的事情。

0 投票
2 回答
869 浏览

python - 如何实现支持命名空间的 FIFO 队列

我正在使用以下方法来处理基于 Google App Engine db.Model 的 FIFO 队列(请参阅此问题)。

该队列按预期工作(非常好)。

现在我的代码有一个方法可以访问延迟队列调用的这个 FIFO 队列:

我想增强此方法和队列数据结构,添加一个 client_ID 参数,该参数表示需要访问其自己的队列的特定客户端。就像是:

我如何将队列编码为可识别 client_ID?

约束:
- 客户端数量是动态的,不是预定义
的 - 任务队列不是一个选项(1. 最多十个队列 2. 我想完全控制我的队列)

您知道如何使用新的Namespaces api添加此行为(请记住,我不是从 webapp.RequestHandler 调用 db.Model)?
另一种选择:我可以添加一个client_ID db.StringProperty到 QueueItem 使用它有一个拉方法过滤器:

有更好的主意吗?

0 投票
1 回答
460 浏览

c# - 缓存先前搜索的策略 (ASP.NET)

我有一个 ASP.NET MVC 2 Web 应用程序(.NET 4,C#),用户可以在其中搜索位置

该页面是使用自动完成框实现的,类似于许多网站。(谷歌、YouTube 等)

现在,对服务器的 AJAX 调用导致对数据库的存储过程调用。(虽然高效,但可能会导致慢速打字机进行大量往返)。

我想知道如何创建一个策略来缓存最后 100 次搜索的结果?

我不能使用 OutputCache,因为调用是通过客户端的 AJAX 进行的。我需要缓存存储过程的输出(查询文本的匹配位置列表)。

换句话说,很多人会搜索“纽约”或“旧金山”,而这些数据只能通过手动管理员更改来更改(例如,我们可以手动使缓存失效)。

那么,我怎样才能缓存最后 100 次搜索呢?我希望有一个类似 FIFO 的功能,如果缓存已经有 100 次搜索,最旧的搜索就会被丢弃,所有的东西都会被下移。

我希望代码是这样的:

我认为显而易见的选择是 .NET Queue

但是我以前从未使用过,所以有什么建议吗?我将如何为 get/set 实现并发,我需要使用完全锁定的单例吗?有没有人为此使用队列?我们还有哪些其他选择?我几乎需要一个自定义队列来限制堆栈中的项目数量。

谢谢你的帮助。

0 投票
1 回答
152 浏览

c - open() 导致程序终止

我使用以下程序写入 fifo:

如果我启动这个程序,启动另一个 shell 并在那里输入

我可以看到程序向管道写入了一些内容,并且我可以在读取 shell 中看到输出。如果我用 CTRL^C 停止 cat 命令,FIFO Writer 也会终止,没有错误消息。这是什么原因?为什么没有抛出错误?

奇怪的是,如果我用 Eclipse CDT 启动上面的代码并用 CTRL^C 关闭读取 shell,程序会继续打印“错误:3”。

期待你的想法,海因里希