Articles of fifo

在不同的执行过程中保持FIFO可读

我从来没有使用过一个命名pipe道,最近才意识到这正是我所需要的。 我正在运行一个使用gnu parallel的程序,这个程序可能会产生为mySQL上的一个数据库格式化的输出(GB到1TB,现在很难知道)。 我发现我可以打开两个terminal:terminal1得到如下的东西: find . -type f -name "*.h" | parallel –jobs 12 'cprogram {}' > /home/pipe 在哪里pipe道是由mkfifo制成的fifo。 在第二个terminal上,我运行一个类似这样的命令: mysql DataBaseName -e "LOAD DATA LOCAL INFILE '/home/pipe' INTO TABLE tableName"; 有用… 但是,这很笨拙…如果我理解正确,第一个过程结束时会产生一个EOF,导致pipe道closures。 理想情况下,我想在不同参数的循环中运行第一个进程。 每次迭代可能需要很长时间,我需要进行合理性检查,所以我不会松懈一周,以查明是否有错误或逻辑错误。 我想知道如何以标准的方式使用FIFO这种程序。

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() […]

无法写入通过NFS模拟的FIFO文件

我试图写入NFS文件,findNFS挂载,并阻止。 可能是什么问题呢? 我的/ etc / export: /tmp/test/ 10.0.0.0/24(rw,no_root_squash,async) NFS服务器和客户端上的ls / tmp / test是一样的 prw–w–w- 1 root root 0 2009-06-24 17:28 ui-input 我正在写根 谢谢。

Linux内核/ proc FIFO /pipe道

我目前正在尝试创build一个内核模块,它将根据内核事件生成数据,并将它们推送到一个文件中。 在阅读后,这是不好的(我同意),我决定将一个/ proc文件中的数据放在一个用户程序可以从必要时拉的数据更有意义。 然而,这个想法导致了各种各样的问题,特别是在何时以及如何清除这个文件。 所以我想……“为什么我不在/ proc中创build一个命名pipe道,并从中读取? 我有一个为proc文件设置读取函数和写入函数的一般要点,但是我仍然有一个概念上的麻烦,我怎么去做这件事。 也就是说,我将如何编写这样一个函数来获取任意数据并将其写入内核的pipe道? 有没有人有任何想法如何将数据从内核空间推送到命名pipe道? 最后,它不一定是/ proc文件(特别是如果我这样做是错误的),但这是我来到的结论。 然后,我将不得不弄清楚如何从用户空间程序附加到它,但我觉得这是一个单独的问题。

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

如何从C ++ / Qt Linux应用程序中逐行读取FIFO /命名pipe道? 今天我可以从Qt程序的fifo中打开和读取,但是我不能让程序逐行读取数据。 Qt读取整个文件,意味着等待“发件人”closures会话。 让我们以一些shell命令为例来展示我想要的应用程序。 先创build一个fifo mkfifo MyPipe 然后我们可以用猫从fifo读取 cat MyPipe 然后我们发送一些数据与另一只猫 cat > MyPipe 然后开始input一些东西,每次你input它就会到达读者。 然后用Ctrl + Dclosures它,双方结束。 现在,发送者很容易用QTextStream创build,你只需要在发送时刷新。 QFile file("MyPipe"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream out(&file); for(int i=0; i<3; i++) { out << "Hello…: " << i << "\n"; out.flush(); sleep(2); } file.close(); 但是,然后写一个逐行阅读的小读者是我现在卡在哪里,我所有的Qt库的尝试结束了,我得到的数据,但直到发件人在fifo上使用file.close() 。 不是当他冲水时,就像我用猫读书时发生的那样。 像这样的例子: QFile […]

FIFO实现

考虑下面的代码: 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会有多less字节,我怎么知道从reader.c中读取多less字节? 因为如果我在阅读器中读取10个字节,并且foo和bar在一起less于10个字节,我将把它们放在同一个variables中,而我不想要它们。 理想情况下,我将有一个读取每个variables的函数,但我不知道数据有多less字节。 我想在writer.c之间添加另一个write指令,在foo和bar之间用分隔符写,然后从reader.c中解码就没有问题。 这是要走的路吗? 谢谢。

我如何正确地写入到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中,那么这些数据将被读取。

在Linux中实时调度

今天早上我读了关于Linux实时调度。 根据罗伯特·洛夫(Robert Love)的“Linux系统编程”一书,这里有两个主要的调度。 一个是SCHED_FIFO,fifo,另一个是SCHED_RR,循环赛。 我了解了fifo和rralgorithm的工作原理。 但是,由于我们有系统调用, sched_setscheduler (pid_t pid, int policy, const struct sched_parem *sp) 我们可以明确地为我们的stream程设置调度策略。 所以在某些情况下,两个由root运行的进程可以有不同的调度策略。 作为具有SCHED_FIFO的一个进程和具有相同优先级的SCHED_RR的另一个进程。 在那种情况下,首先select哪个进程? FIFO分类过程还是RR分类过程? 为什么? 考虑这种情况。 有三个过程A,B,C。 所有的都有相同的优先权。 A和B是RR分类过程,C是FIFO分类。 A和B是可运行的(所以两者都在一段时间内交替运行)。 目前A正在运行。 现在C变成可运行的。 在这种情况下,是否 1. A will preempt for C, or 2. A will run until its timeslice goes zero and let C run. Or 3. A will run until […]

Linux非阻塞FIFO(按需日志)

我喜欢根据需要logging节目输出。 例如。 输出被logging到terminal,但是另一个进程可以随时挂载当前的输出。 经典的方法是: myprogram 2>&1 | tee /tmp/mylog 和按需 tail /tmp/mylog 但是,这将创build一个不断增长的日志文件,即使没有使用,直到驱动器空间不足。 所以我的尝试是: mkfifo /tmp/mylog myprogram 2>&1 | tee /tmp/mylog 和按需 cat /tmp/mylog 现在我可以随时读取/ tmp / mylog。 但是,任何输出都会阻塞程序,直到读取/ tmp / mylog。 我喜欢fifo来刷新所有未读回的数据。 怎么做?