在C和Python之间读写Fifo文件

时间:2016-10-09 21:27:31

标签: python c file-io fifo

一般情况下,我正在创建两个由我的.c和.py程序读取和写入的fifo队列。为了使我的.c程序能够与python交互,我已经包含了<python2.7/Python.h>库。

首先,我的.c程序创建一个名为CFifo的文件,并使用fprintf将文本写入其中。没问题。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <python2.7/Python.h>


int main() {
    FILE *CFifo, *pythonFifo, *pythonFile;
    char buffer[1024];

    // declare python
    Py_SetProgramName("writer.py");

    // init python
    Py_Initialize();

    // open python
    pythonFile = fopen("writer.py", "r");

    // C writes to file, python reads from this file
    CFifo = fopen("./CFifo", "w");  

    // Print strings to file using fprintf
    fprintf(CFifo, "This is a test");

    // close file python reads
    fclose(CFifo);

我的C程序的第二部分应该读取我的python程序写的信息(在第二个fifo队列中),而不是在打开./pythonFifo时挂在终端中。

    // make second fifo queue
    // python writes to this file, C reads from it
    mkfifo("./pythonFifo", 0777);

    // run python program
    PyRun_SimpleFile(pythonFile, "writer.py");
    pythonFifo = fopen("./pythonFifo", "r");

    while(fgets (buffer, sizeof(buffer), pythonFifo)) {
        printf("%s", buffer);
    }

    // close python
    Py_Finalize();
    fclose(pythonFifo);
    remove("./pythonFifo");

    return 0;
}

这是负责写入fifo队列的python部分。

# open fifo file that python writes to
filename_write = "./pythonFifo"
pipe = os.open(filename_write, os.O_WRONLY)
for output in finalStringList:
   os.write(pipe, output)
os.close(pipe)

第二个文件的目的是编写从第一个文件读取的修改信息。

1 个答案:

答案 0 :(得分:1)

你无法从这里到达那里。来自mkfifo手册页......

  

以这种方式创建FIFO特殊文件后,任何进程   可以打开它进行阅读或书写,就像普通人一样   文件。但是,它必须在两端同时打开   您可以继续对其进行任何输入或输出操作。打开一个   用于读取的FIFO通常会阻塞,直到某个其他进程打开   用于写入的FIFO相同,反之亦然。

双方需要先打开文件才能继续。但由于PyRun_SimpleFile以同步方式运行python脚本,因此永远不会到达后面打开文件的C代码。如果您尝试首先在C代码中打开它,它将在运行python代码之前挂起。你有一个经典的僵局。

我在您的示例中添加了几个打印件,并且能够在单独的控制台中看到程序前进cat pythonFifoecho foo > pythonFifo。它当然会返回垃圾,但证明了问题。

实际上,你可以从这里(再次,手册页)到达那里

  

有关FIFO特殊文件的非阻塞处理,请参见fifo(7)。

但如果你的python代码在管道中写的不仅仅是适合的话,那么你就会让自己陷入更多的死锁状态。你可能最好让你的python程序写入某个变量并让你的C代码从那里读取它。