Articles of mkfifo

Python和FIFO

我试图了解在Linux下使用Python的FIFO,我发现了一个奇怪的行为,我不明白。 以下是fifoserver.py import sys import time def readline(f): s = f.readline() while s == "": time.sleep(0.0001) s = f.readline() return s while True: f = open(sys.argv[1], "r") x = float(readline(f)) g = open(sys.argv[2], "w") g.write(str(x**2) + "\n") g.close() f.close() sys.stdout.write("Processed " + repr(x) + "\n") 这是fifoclient.py import sys import time def readline(f): s = f.readline() […]

在c中实现stream水线 什么是最好的方法来做到这一点? (自己的linuxshell)

我想不出有什么办法可以在c中实现stream水线操作。 这就是为什么我决定写在这里。 我不得不说,我明白了pipe / fork / mkfifo是如何工作的。 我已经看到了很多实现2-3个pipe道的例子。 这很容易。 我的问题开始,当我要实现壳,pipe道数不明。 我现在得到了什么:例如。 ls -al | tr az AZ | tr AZ az | tr az AZ 我把这样的线路变成这样的东西: array[0] = {"ls", "-al", NULL"} array[1] = {"tr", "az", "AZ", NULL"} array[2] = {"tr", "AZ", "az", NULL"} array[3] = {"tr", "az", "AZ", NULL"} 所以我可以使用 execvp(array[0],array) 稍后的。 现在,我相信一切都好。 问题开始,当我试图将这些函数的input/输出redirect到彼此。 以下是我如何做到这一点: […]

PhantomJS:pipe道input

我正在尝试使用PhantomJS来呈现一个HTML页面到PDF。 我不想将文件写入磁盘,我有内存中的HTML,我想在内存中的PDF。 在这个问题上使用Pooria Azimi的出色答案,我可以从命名pipe道获得pdf。 当在另一端尝试相同的时候(用命名pipe道replaceinput文件),我最终得到一个空白的pdf。 这就是我现在正在做的(简化): mkfifo in_pipe.html out_pipe.pdf ./phantomjs rasterize.js in_pipe.html out_pipe.pdf 然后在另一个terminal: echo '<center>hey!</center>' > in_pipe.html cat out_pipe.pdf > out.pdf 文件out.pdf被创build,但是是空的。 我错过了什么吗?

我如何正确地写入到Python的FIFO?

当我在Python中打开FIFO(命名pipe道)进行写入时,发生了一些非常奇怪的事情。 考虑一下当我尝试打开一个FIFO来写交互式解释器时会发生什么: >>> fifo_write = open('fifo', 'w') 上面的行会阻止,直到我打开另一个解释器并input以下内容: >>> fifo_read = open('fifo', 'r') >>> fifo.read() 我不明白为什么我不得不等待pipe道打开阅读,但让我们跳过。 上面的代码将阻塞,直到有数据如预期。 但是,让我们回到第一个解释器窗口并键入: >>> fifo_write.write("some testing data\n") >>> fifo_write.flush() 预期的行为是,在第二个解释器上, read的调用将返回,我们将在屏幕上看到数据,除了这不是发生在我身上。 如果我调用os.fsync ,会发生以下情况: >>> import os >>> fifo_write.flush() >>> os.fsync(fifo_write.fileno()) Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [Errno 22] Invalid argument 而fifo读者仍在等待。 但是,如果我调用fifo_writer.close()那么数据将被刷新。 如果我使用shell命令来提供pipe道: $ […]

什么条件导致一个打开的,无阻塞的命名pipe道(fifo)不可读取?

情况: new_pipe = os.open(pipe_path, os.O_RDONLY | os.O_NONBLOCK) # pipe_path points to a FIFO data = os.read(new_pipe, 1024) 读取偶尔会引起errno -11:资源暂时不可用。 什么时候提出这个错误? 这似乎是非常罕见的,因为常见的情况下返回数据: 如果没有编写者打开pipe道,则返回空str('')。 如果作者打开了pipe道,但没有数据在FIFO中,则返回空str('') 当然,如果作者将数据放在fifo中,那么这些数据将被读取。

具有poll()的命名pipe道上的O_RDWR

我已经经历了多种不同的命名pipe道客户端/服务器实现,但其中大部分使用读/写阻塞默认值。 因为我已经使用poll()来检查其他标志,但是通过poll()检查传入的FIFO数据也是一个好主意。 在所有的研究之后,我认为在O_RDWR模式下打开pipe道是防止在没有打开作者的情况下在pipe道上无限次数的EOF事件的唯一方法。 这样pipe道的两端都closures,其他客户端也可以打开可写入端。 要回应我会使用单独的pipe道… 我的问题是,虽然我发现了一些使用O_RDWR标志的例子,但open()手册页将该标志描述为分配给FIFO时正在使用。 ( http://linux.die.net/man/3/open ) 但是如何在不使用O_RDWR的情况下在pipe道上使用poll()呢? 你认为“O_RDWR”是一个合法的方式来打开pipe道?