Articles of fifo

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来刷新所有未读回的数据。 怎么做?

如何在命名pipe道(mkfifo)上执行非阻塞fopen?

如果我有一个程序创build并试图使用mkfifo打开一个命名pipe道,我怎样才能打开pipe道读取或写入没有阻塞? 具体来说,我正在写一个C程序,可以使用或不使用gui(用Java编写)来运行。 在C程序中,我成功地使用mkfifo创build了命名pipe道,但是当我这样做时 FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/ 在GUI打开pipe道进行写入之前,fopen不会返回。 我希望做的是让pipe道准备被读取一次(如果)GUI决定写入它 – 我将把文件描述符放在一个select()调用中。 有理由期望java GUI可能永远不会被启动,所以我不能依靠它在任何特定点甚至根本上打开pipe道的另一端。 我也会有第二条pipe道,我想我也会遇到同样的问题。 此外,我不能在没有阅读器的输出pipe上设置O_NONBLOCK。 有什么build议么? (这是在Linux系统上运行)

强制程序在redirect时刷新其标准输出

我有一个封闭的源程序,打印输出到标准输出。 我需要parsing输出。 所以我redirect输出到fifo(从我可以读取在父进程分叉和执行二进制)使用dup2,然后执行该程序。 问题是文件中的fprintf调用被缓冲,因为它正在写入一个文件。 在调用exec之前,我尝试在标准输出上用_IONBF调用setvbuf。 但问题依然存在。 为什么setvbuf在我的情况下没有帮助? 我怎样才能强制输出得到刷新?

如何以编程方式configurationWindows中的串行FIFO接收和传输缓冲区?

从Windows的设备pipe理器中,可以为高级设置中的COM端口configuration串行端口的接收缓冲区和发送FIFO缓冲区大小: 我想以编程方式为COM端口configurationTX和RX FIFO缓冲区的值。 理想的方法是在LabVIEW或甚至通过.NET /命令行进行,因为两者都可以很容易地从LabVIEW接口。 编辑:只是为了澄清这是关于16550兼容的UART FIFO缓冲区,而不是像VISA I / O缓冲区等软件缓冲区。