一般情况下,我正在创建两个由我的.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)
第二个文件的目的是编写从第一个文件读取的修改信息。
答案 0 :(得分:1)
你无法从这里到达那里。来自mkfifo
手册页......
以这种方式创建FIFO特殊文件后,任何进程 可以打开它进行阅读或书写,就像普通人一样 文件。但是,它必须在两端同时打开 您可以继续对其进行任何输入或输出操作。打开一个 用于读取的FIFO通常会阻塞,直到某个其他进程打开 用于写入的FIFO相同,反之亦然。
双方需要先打开文件才能继续。但由于PyRun_SimpleFile
以同步方式运行python脚本,因此永远不会到达后面打开文件的C代码。如果您尝试首先在C代码中打开它,它将在运行python代码之前挂起。你有一个经典的僵局。
我在您的示例中添加了几个打印件,并且能够在单独的控制台中看到程序前进cat pythonFifo
和echo foo > pythonFifo
。它当然会返回垃圾,但证明了问题。
实际上,你可以从这里(再次,手册页)到达那里
有关FIFO特殊文件的非阻塞处理,请参见fifo(7)。
但如果你的python代码在管道中写的不仅仅是适合的话,那么你就会让自己陷入更多的死锁状态。你可能最好让你的python程序写入某个变量并让你的C代码从那里读取它。