【发布时间】:2018-04-25 08:04:33
【问题描述】:
我正在使用命名管道 FIFO 在 C(生成数字的循环是 C)和 python(监听 C 生成的数字并读取它们并处理它们)之间进行通信。 除了 C 中生成的每个数字之外,代码运行良好,我需要关闭 fifo 才能在 Python 中看到它,否则在调用关闭命令之前它不会在 python 中显示。我不知道打开和关闭 FIFO 是否是一个好主意,以便能够在 python 代码中正确读取它们。我需要注意的是,C 代码每 50 毫秒生成一次数字。这就是为什么我怀疑打开和关闭是否是一个好主意。 这是我的 C 和 Python 代码:
C 作为服务器:
while (1){
t=time_in_ms();
if (t-t0>=50){
t0=t;
flag=1;
}
else{
flag=0;
}
if (flag==1){
flag=0;
printf("%lld %lld\n",count,t);
count+=1;
fprintf(f,"%lld\r",t);
fflush(f);
fclose(f);
f=fopen("fifo","w");
}
}
用 Python 编写代码作为客户端:
with open(FIFO) as fifo:
print("FIFO opened")
while True:
data = fifo.read()
if len(data) == 0:
count=count+1
else:
count=0
if count>2000:
print("Writer closed")
break
print data
x=x+1
【问题讨论】:
-
问题在于,在 fifo 的两端,您正在使用 缓冲 IO。你应该在 C 端使用
open/write,在 python 端使用os.open/os.read! -
我可以知道你在 C 端使用 open/write 和在 python 端使用 os.open/os.read 是什么意思吗?您能否告诉我应该如何更改代码以解决您的 cmets?
-
关于 C 代码:
man 2 openman 2 write也可以看看:man 3 fflush使用 C 时,Linux 中的手册页非常棒,而且资源丰富 -
我认为@AnttiHaapala 在说什么;不要将 FIFO 视为 STREAM,而是使用文件描述符。就像
write函数所做的或 dprintf 一样。我应该补充一点,我以前从未使用过 dprintf,只是在推测其行为