Questions tagged «fifo»

有关FIFO的问题-先进先出特殊文件,也称为命名管道


2
mknod创建的命名管道与mkfifo创建的FIFO是否等效?
我已经使用该mkfifo <file>命令创建了命名的FIFO,其中一个进程写入文件,而另一个进程从文件读取。 现在,我知道该mknod命令能够创建命名管道。这些命名管道是否等效于由创建的FIFO mkfifo,或者它们具有不同的功能?
22 fifo 

1
为什么命名管道和写入文件一样慢?
我试图了解命名管道的工作原理,以便简化单向进程间通信。我预计会由于将数据复制到循环缓冲区而产生一些开销,我本以为它存储在RAM中,因此我希望管道比写入文件快得多(因为RAM比磁盘快几个数量级)。 相反,我发现命名管道(或匿名管道)与文件的速度大致相同。这是在运行普通Linux并具有普通磁盘驱动器(非固态)的3 GHz桌面上。这是Python中的简化测试程序: import sys import time import random megabyte = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for x in range(1024**2)) while True: before = time.time() sys.stdout.write(megabyte) after = time.time() sys.stderr.write("{} microseconds\n".format(1e6 * (after - before))) 管道直达/dev/null: python test.py > /dev/null 每兆字节产生2.1微秒(恒定)。 管道到文件: python test.py > /tmp/testout.txt 在500微秒和930微秒之间跳转(随着文件变大,这个值越来越普遍-大概是在寻找磁盘空间)。 然后是命名管道: mkfifo testpipe cat testpipe > /dev/null …
18 fifo 

1
如何获得平均管道流速
如果myfile随着时间增加,我可以使用 tail -f | pv -lr > /dev/null 它给出的是瞬时速度,而不是平均速度。 如何获得平均速度(即速度函数v(t)在监视时间内的积分)。
16 pipe  monitoring  tail  fifo  pv 

3
从命名管道(cat或tail -f)连续读取
我已配置rsyslog为将某些日志事件记录到/dev/xconsole: *.*;cron.!=info;mail.!=info |/dev/xconsole /dev/xconsole是一个命名管道(fifo)。如果我想查看正在记录的内容,可以执行cat /dev/xconsole。令我惊讶的是,该命令cat /dev/xconsole在读取文件后没有完成,而是充当了tail -f。换句话说,这两个命令的行为相同: cat /dev/xconsole tail -f /dev/xconsole 有人可以解释为什么吗? 两者之间有什么区别吗?
16 pipe  cat  tail  fifo 

9
筛选或通过管道传输文件的某些部分
我有一个输入文件,其中的某些部分用开始和结束标记来分隔,例如: line A line B @@inline-code-start line X line Y line Z @@inline-code-end line C line D 我想对此文件进行转换,以使X,Y,Z行通过某些命令(nl例如)过滤,但其余各行保持不变。请注意,nl(数字行)在行之间累积状态,因此并不是将静态转换应用于X,Y,Z行。(编辑:有人指出,nl在不需要积累状态的模式可以工作,但我只是用nl作为一个例子来简化这个问题在现实中的命令是一个更复杂的自定义脚本。什么我期待对于将标准过滤器应用于输入文件的子部分的问题的通用解决方案) 输出应如下所示: line A line B 1 line X 2 line Y 3 line Z line C line D 文件中可能有几个此类需要转换的部分。 更新2我最初没有指定如果有更多的部分应该发生什么,例如: line A line B @@inline-code-start line X line Y line Z @@inline-code-end …


1
Linux中的“泄漏”管道
假设您具有如下所示的管道: $ a | b 如果b停止处理stdin,则在一段时间后,管道将被填满,并将a对其的stdout 写入,将阻塞(直到b再次开始处理或终止)。 如果我想避免这种情况,可以尝试使用更大的管道(或更简单地说,是buffer(1)),如下所示: $ a | buffer | b 这只会给我带来更多的时间,但a最终最终会停止。 我很想拥有(对于我要解决的非常特殊的情况)是拥有一个“泄漏的”管道,该管道在充满时会从缓冲区中丢弃一些数据(理想的是逐行)以a继续处理(您可能会想到,在管道中流动的数据是消耗性的,即,处理数据的b重要性不如a能够不阻塞地运行)。 总结一下,我很想拥有一个有界,漏水的缓冲区: $ a | leakybuffer | b 我可能可以很容易地用任何一种语言来实现它,我只是想知道我是否缺少某些“准备使用”的东西(或者像bash单线的东西)。 注意:在示例中,我使用的是常规管道,但问题同样适用于命名管道 在授予以下答案的同时,我也决定实施LeakyBuffer命令,因为以下简单解决方案有一些局限性:https : //github.com/CAFxX/leakybuffer
12 linux  pipe  fifo  buffer 

1
如何通过SSHFS使用inotify或命名管道?
谢谢sshfs魔术,我可以使用以下命令从远程服务器挂载主目录 sshfs user@server:/home/user ~/remote 乐观,我想我会设置一个本地inotify-hook上~/remote/logFile(在sshfs安装),因此本地程序可以对远程日志的变化作出反应。 cd ~/remote touch logFile # create remote file inotifywait logFile & # set up local inotify-hook ssh user@server -x touch /home/user/logFile # touch file from remote 什么都没发生。inotifywait除非我touch在本地将文件设为静音。类似地,写入命名管道失败。 为什么是这样?我如何弥合这一差距? 我可以inotifywait在远程上运行,破解文件系统更改序列化策略并维持与本地的连接,但是我基本上是在重新实现SSHFS。它完全杀死了抽象。
12 sshfs  inotify  fifo 

3
阻止自动EOF到命名管道,并在需要时发送EOF
我有一个程序,在读取给定流中的EOF时会自动退出(在以下情况下为stdin)。 现在,我想制作一个Shell脚本,该脚本创建一个命名管道并将程序的stdin连接到它。然后,脚本使用和(以及其他工具退出时自动生成EOF)多次写入管道。我面临的问题是,当第一个操作完成时,它会向管道发送EOF并退出程序。如果我使用类似的东西,那么我打算退出程序时无法发送EOF。我正在研究一种平衡的解决方案,但无济于事。 我已经找到了如何防止EOF以及如何手动发送EOF的方法,但是我无法将它们结合在一起。有什么提示吗? echocatechotail -f #!/bin/sh mkfifo P program < P & : # Run in background # < P tail -n +1 -f | program echo some stuff > P # Prevent EOF? cat more_stuff.txt > P # Prevent EOF? send_eof > P # How can I do this? …

4
程序输出重定向
当尝试使用“大于”的语法(例如foo 2> myfile)重定向程序输出时,此处可能出现的数字是什么,它们代表什么? 我相信1是/dev/stdout,2是/dev/stderr。5和6呢?有3、4或大于6的数字吗?

6
半异步管
假设我有以下管道: a | b | c | d 我如何可以等待完成c(或b)在sh或bash?这意味着该脚本d可以开始任何时间(和它不是必须等待),但需要完整的输出c正确地工作。 用例是difftool用于git比较图像的。它由调用,git并需要处理其输入(a | b | c部分)并显示比较结果(d部分)。呼叫者将删除a和所需的输入b。这意味着在从脚本返回之前,进程c(或b)必须终止。另一方面,我不能等待,d因为这意味着我正在等待用户输入。 我知道我可以将的结果写入c一个临时文件,或者在中使用FIFO bash。(不过,不确定FIFO是否会有所帮助。)在没有临时文件的情况下是否可以实现此目的sh? 编辑 如果我能以可靠的方式找出c(或b)进程的进程ID,也许就足够了。然后整个管道可以异步启动,我可以等待进程ID。遵循以下原则 wait $(a | b | { c & [print PID of c] ; } | d) 编辑^ 2 我已经找到了解决方案,欢迎提出评论(或更好的解决方案)。
11 bash  shell  pipe  fifo 

3
命名管道,文件描述符和EOF
两个窗口,同一用户,带有bash提示。在window-1中输入: $ mkfifo f; exec <f 因此,bash现在正尝试从文件描述符0中读取文件,该文件描述符0映射到命名管道f。在window-2中输入: $ echo ls > f 现在window-1打印一个ls,然后外壳消失。为什么? 下一个实验:使用再次打开window-1 exec <f。在window-2中输入: $ exec 3>f $ echo ls >&3 在上面的第一行之后,window-1唤醒并显示提示。为什么?在上面的第二行之后,window-1打印ls输出,并且shell保持活动状态。为什么?实际上,现在在window-2中,echo ls > f不会关闭window-1外壳。 答案必须与window-2中引用命名管道的文件描述符3 的存在有关!

3
如何实现$ RANDOM之类的“生成器”?
$RANDOM每次访问时,特殊变量都有一个新值。在这方面,它使人联想到某些语言中的“生成器”对象。 有没有办法实现这样的事情zsh? 我尝试使用命名管道执行此操作,但是我没有找到一种在不终止“ generator”进程的情况下以受控方式从fifo提取项目的方法。例如: % mkfifo /tmp/ints % (index=0 while ( true ) do echo $index index=$(( index + 1 )) done) > /tmp/ints & [1] 16309 % head -1 /tmp/ints 0 [1] + broken pipe ( index=0 ; while ( true; ); do; echo $index; index=$(( ... 还有其他方法可以在zsh中实现这种生成器类型的对象吗? 编辑:这不起作用: …
10 zsh  fifo  ipc 

2
mkfifo-磁盘I / O是否实际发生?
我有2个应用程序: 生产者(N个实例) 消费者(1个实例) 我目前从生产者那里写出中间结果,然后消费者从磁盘读取这些文件并产生最终结果。 我想通过将生产者的输出直接“流化”到消费者来最小化此I / O。 我碰到命名管道(mkfifo)和随后的例子在这里。这看起来不错,但我无法确定这是如何实现的?FIFO队列是否只是通过文件进行缓冲?如果是这样,那可能对我没有帮助。我希望内容在不使用磁盘的情况下完全“通过内存”传输。也许跨进程不可能吗?
10 io  fifo 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.