我正在通过在Unix上使用命名管道并尝试使用python在FIFO文件中写入字符串并通过C ++程序将其反转来练习IPC。但是,Python中的程序被挂起并且不返回任何结果。
用于写入文件的Python代码:
import os
path= "/home/myProgram"
os.mkfifo(path)
fifo=open(path,'w')
string=input("Enter String to be reversed:\t ")
fifo.write(string)
fifo.close()
程序挂起,在此处不要求任何输入。 爆发时出现以下错误:
Traceback (most recent call last):
File "writer.py", line 4, in <module>
fifo=open(path,'w')
KeyboardInterrupt
用于从文件读取的C ++代码:
#include <fcntl.h>
#include <iostream>
#include <sys/stat.h>
#include <unistd.h>
#include <string>
#include <string.h>
#define MAX_BUF 1024
using namespace std;
char* strrev(char *str){
int i = strlen(str)-1,j=0;
char ch;
while(i>j)
{
ch = str[i];
str[i]= str[j];
str[j] = ch;
i--;
j++;
}
return str;
}
int main()
{
int fd;
char *myfifo = "/home/myProgram";
char buf[MAX_BUF];
/* open, read, and display the message from the FIFO */
fd = open(myfifo, O_RDONLY);
read(fd, buf, MAX_BUF);
cout<<"Received:"<< buf<<endl;
cout<<"The reversed string is \n"<<strrev(buf)<<endl;
close(fd);
return 0;
}
由于编写器程序无法执行,无法测试读取器代码,因此无法在此处提及结果。
请帮助。
答案 0 :(得分:1)
open()
中的python代码块。它正在等待读者。
通常可以切换为非阻塞并使用os.open()
。使用FIFO,您将得到一个错误,ENXIO。这基本上等于没有读者在场。
因此,FIFO的“所有者”应该是读取器。此规则可能只是样式问题。我不知道此限制的具体原因。
以下是一些python代码,展示了交错的多个读取器和写入器。
import os
r1 = os.open('myfifo', os.OS_RDONLY | os.OS_NONBLOCK)
r2 = os.open('myfifo', os.OS_RDONLY | os.OS_NONBLOCK)
w1 = os.open('myfifo', os.OS_WRONLY | os.OS_NONBLOCK)
w2 = os.open('myfifo', os.OS_WRONLY | os.OS_NONBLOCK)
os.write(w1, b'hello')
msg = os.read(r1, 100)
print(msg.decode())
os.write(w2, b'hello')
msg = os.read(r2, 100)