如何解决使用 C 和 python 之间的管道进行进程间通信 - 仅打印换行符
我正在制作一个项目,我想使用 C 代码从中检索硬件信息,然后将其绘制在 python 的库 matplotlib.pylot 上。我想实时执行此操作,因此基本上 C 代码将继续向 python 脚本发送数据,脚本将继续在图形上绘制它。我正在尝试使用命名管道来实现我的目标,但是当我打印 python 文件从管道中读取的数据时,它只打印新行字符。当我使用 C 代码从管道读取数据时,它会打印我在该管道上写入的实际数据。以下是C文件的代码
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
int main()
{
int fd;
if(mkfifo("pipe1",0777)==-1)
{
if(errno != EEXIST)
{
printf("Could not create FIFO file.\n");
return -1;
}
}
printf("Opening...\n");
fd = open("pipe1",O_WRONLY);
int x=10;
if(write(fd,&x,sizeof(int)) == -1)
{
printf("Write error\n");
return 1;
}
x=2;
write(fd,sizeof(int));
close(fd);
printf("Closed\n");
return 0;
}
以下是python文件的代码
import os
import errno
FIFO = 'pipe1'
try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
print("Error occured")
with open(FIFO) as fifo:
print("FIFO opened")
while True:
data = fifo.read()
print(len(data))
print(type(data))
for e in data:
print(e+ "a")
if len(data) == 0:
print("Writer closed")
break
#print(data)
解决方法
通信没有问题,问题在于您解析 Python 代码中读取的数据的方式。
您写入 FIFO 的数据是二进制格式 - 这是两个整数,每个整数(可能)在内存中占 4 个字节。您的 Python 代码将它读取的数据解释为字符串。为了正确解析它们,您可以使用 struct
模块。
例如:
...
import struct
...
# Note that we open in "rb" mode since struct expects bytes
with open(FIFO,"rb") as fifo:
print("FIFO opened")
while True:
data = fifo.read(4)
print(len(data))
print(type(data))
if len(data) == 0:
print("Writer closed")
break
# Unpack a single integer in host byte order
print(struct.unpack("=i",data)[0])
您可以阅读有关 struct
模块和 the official documentation 中的格式字符的更多信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。