标签: mkfifo

在Python中创建临时FIFO(命名管道)?

如何在Python中创建临时FIFO(命名管道)?这应该工作:

import tempfile

temp_file_name = mktemp()
os.mkfifo(temp_file_name)
open(temp_file_name, os.O_WRONLY)
# ... some process, somewhere, will read it ...
Run Code Online (Sandbox Code Playgroud)

但是,由于Python Docs 11.6中的重大警告以及潜在的删除,我犹豫不决,因为它已被弃用.

编辑:值得注意的是,我已尝试tempfile.NamedTemporaryFile(并通过扩展tempfile.mkstemp),但os.mkfifo抛出:

OSError -17:文件已存在

当您在mkstemp/NamedTemporaryFile创建的文件上运行它时.

python security file fifo mkfifo

27
推荐指数
3
解决办法
5万
查看次数

如何在Python中正确写入FIFO?

当我在Python中打开用于写入的FIFO(命名管道)时,会发生一些非常奇怪的事情.考虑当我尝试打开FIFO以便在交互式解释器中写入时会发生什么:

>>> fifo_write = open('fifo', 'w')
Run Code Online (Sandbox Code Playgroud)

上面的行阻塞,直到我打开另一个解释器并键入以下内容:

>>> fifo_read = open('fifo', 'r')
>>> fifo.read()
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我不得不等待管道打开阅读,但我们跳过它.上述代码将阻塞,直到有预期的数据可用.但是,假设我回到第一个解释器窗口并键入:

>>> fifo_write.write("some testing data\n")
>>> fifo_write.flush()
Run Code Online (Sandbox Code Playgroud)

预期的行为是,在第二个解释器上,调用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
Run Code Online (Sandbox Code Playgroud)

而fifo读者仍在等待.但是,如果我打电话,fifo_writer.close()那么数据会被刷新.如果我使用shell命令来提供管道:

$ echo "some data" > fifo
Run Code Online (Sandbox Code Playgroud)

然后读者输出是:

>>> fifo_read.read()
'some data\n'
Run Code Online (Sandbox Code Playgroud)

有没有人经历过这个?如果是这样,有一个解决方法吗?我目前的操作系统是Ubuntu 11.04和Linux 2.6.38.

python linux fifo mkfifo

17
推荐指数
2
解决办法
2万
查看次数

Fifo文件Windows示例

我想知道是否有Linux等效的Linux mkfifo.相当于我的意思是使用st_mode S_IFIFO创建文件的方式.谢谢你的回答.

windows mkfifo

17
推荐指数
1
解决办法
8590
查看次数

PhantomJS:管道输入

我正在尝试使用PhantomJS将html页面呈现为pdf.我不想把文件写到磁盘上,我在内存中有html,我想在内存中使用pdf.

这个问题上使用Pooria Azimi的优秀答案,我能够从命名管道中获取pdf.当在另一端尝试相同(用命名管道替换输入文件)时,我最终得到一个空白的pdf.

这就是我现在正在做的事情(简化):

mkfifo in_pipe.html out_pipe.pdf
./phantomjs rasterize.js in_pipe.html out_pipe.pdf
Run Code Online (Sandbox Code Playgroud)

然后在另一个终端:

echo '<center>hey!</center>' > in_pipe.html
cat out_pipe.pdf > out.pdf
Run Code Online (Sandbox Code Playgroud)

文件out.pdf已创建,但为空.我错过了什么吗?

linux pipe named-pipes mkfifo phantomjs

15
推荐指数
1
解决办法
4662
查看次数

什么条件导致打开的非阻塞命名管道(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)
Run Code Online (Sandbox Code Playgroud)

读取偶尔会引发错误-11:资源暂时不可用.

什么时候出现这个错误?这似乎非常罕见,因为常见情况返回数据:

  • 如果没有编写器打开管道,则返回空的str('').
  • 如果编写器已打开管道,但fifo中没有数据,则还会返回空的str('')
  • 当然,如果作者将数据放入fifo中,那么将读取该数据.

python linux named-pipes fifo mkfifo

13
推荐指数
1
解决办法
4112
查看次数

是否应该关闭用mkfifo打开的命名管道?

我正在使用命名管道来捕获另一个程序(Matlab)中的外部程序(wgrib2)的输出.Matlab代码如下所示,并system访问命令行以生成管道.这是我的问题:

  1. myfifo使用后我是否必须关闭命名管道?代码运行后似乎仍然存在.
  2. 如果myfifo需要关闭,关闭它的命令是什么?
  3. 我将在下面多次运行代码示例(> 1000),如果我重用命名管道并且直到最后都不关闭它,那么可以吗?
system('mkfifo myfifo');     % Make a named pipe myfifo
% Call the external program wgrib2 and dump its output to the named pipe myfifo
system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166 > myfifo &');
fid = fopen('myfifo', 'r');  % Open the named pipe
a = fscanf(fid, '%c');       % Read the output as character
fclose(fid);                 % Close the "file" (myfifo still exists afterward)
Run Code Online (Sandbox Code Playgroud)

pipe mkfifo

13
推荐指数
2
解决办法
1万
查看次数

为什么我的程序在打开mkfifo-ed管道时会挂起?

我使用mkfifo来创建一个命名管道.然后我使用以下程序打开它.但是,该程序挂起在"fopen"行.这里有什么问题吗?

int main(int argc, char** argv) {
char* line = "hello, world!";
FILE* fp = fopen("/tmp/myFIFO", "rw");
fprintf(fp, line);
fclose(fp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

c c++ mkfifo

12
推荐指数
2
解决办法
1万
查看次数

fifo - 循环阅读

我想使用os.mkfifo进行程序之间的简单通信.我在循环中读取fifo时遇到问题.

考虑这个玩具示例,我有一个读者和一个使用fifo的作家.我希望能够在循环中运行阅读器来读取进入fifo的所有内容.

# reader.py
import os
import atexit

FIFO = 'json.fifo'

@atexit.register
def cleanup():
    try:
        os.unlink(FIFO)
    except:
        pass

def main():
    os.mkfifo(FIFO)
    with open(FIFO) as fifo:
#        for line in fifo:              # closes after single reading
#        for line in fifo.readlines():  # closes after single reading
        while True:
            line = fifo.read()          # will return empty lines (non-blocking)
            print repr(line)

main()
Run Code Online (Sandbox Code Playgroud)

而作者:

# writer.py
import sys

FIFO = 'json.fifo'


def main():
    with open(FIFO, 'a') as fifo:
        fifo.write(sys.argv[1])

main()
Run Code Online (Sandbox Code Playgroud)

如果我python …

python mkfifo

10
推荐指数
2
解决办法
2万
查看次数

带有poll()的命名管道上的O_RDWR

我经历了不同的linux命名管道客户端/服务器实现,但大多数使用读/写的阻塞默认值.

因为我已经使用poll()来检查其他标志,所以通过poll()检查传入的FIFO数据也是个好主意...

经过所有研究后,我认为在O_RDWR模式下打开管道是在没有编写器打开管道时防止管道上无限数量的EOF事件的唯一方法.

这样管道的两端都是关闭的,其他客户端也可以打开可写端.为了回应我会使用单独的管道......

我的问题是,尽管我发现了一些使用O_RDWR标志的示例,但open()联机帮助页将此标志描述为在分配给FIFO时无法使用.(http://linux.die.net/man/3/open)

但是如何在没有O_RDWR的情况下在管道上使用poll()?你认为"O_RDWR"是打开管道的合法方式吗?

linux ipc pipe mkfifo

9
推荐指数
1
解决办法
9355
查看次数

设置用Java读取的阻塞文件

我想设置一个用Java读取的阻塞文件.也就是说,有一个文件,当包装FileInputStream和任何read()方法被调用时,调用块.

我想不出一个简单的与操作系统无关的方法 - 在类Unix操作系统上,我可以尝试使用mkfifo该文件创建FIFO 并从中读取.一个可能的解决方法是创建一个非常大的文件并从中读取 - 在捕获堆栈之前读取不太可能完成,但是它很丑陋而且很慢(实际上读取在缓存时仍然非常快).

相应的套接字read()案例很容易设置 - 自己创建一个套接字并从中读取,你可以有确定性的阻塞.

目的是检查方法的堆栈以确定在这种情况下顶框架是什么.想象一下,我有一个组件定期对所有正在运行的线程的堆栈跟踪进行采样,然后尝试对该线程当前正在执行的操作进行分类.它可以做的一件事是文件IO.所以我需要知道文件IO期间"堆栈顶部"是什么样的.我已经通过实验确定了(只是以各种方式读取文件并对堆栈进行采样),但我想编写一个如果这种情况发生变化就会失败的测试.

编写这样一个测试的自然方法是启动一个执行文件读取的线程,然后检查顶部框架.为了可靠地执行此操作,我想要一个阻塞读取(否则线程可能会在执行堆栈跟踪之前完成其读取等).

java testing io mkfifo

7
推荐指数
2
解决办法
1640
查看次数

标签 统计

mkfifo ×10

linux ×4

python ×4

fifo ×3

pipe ×3

named-pipes ×2

c ×1

c++ ×1

file ×1

io ×1

ipc ×1

java ×1

phantomjs ×1

security ×1

testing ×1

windows ×1