【问题标题】:Sharing Variable between C and Python在 C 和 Python 之间共享变量
【发布时间】: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

【问题讨论】:

  • Integrate Python And C++的可能重复
  • 问题在于,在 fifo 的两端,您正在使用 缓冲 IO。你应该在 C 端使用open/write,在 python 端使用os.open/os.read
  • 我可以知道你在 C 端使用 open/write 和在 python 端使用 os.open/os.read 是什么意思吗?您能否告诉我应该如何更改代码以解决您的 cmets?
  • 关于 C 代码:man 2 open man 2 write 也可以看看:man 3 fflush 使用 C 时,Linux 中的手册页非常棒,而且资源丰富
  • 我认为@AnttiHaapala 在说什么;不要将 FIFO 视为 STREAM,而是使用文件描述符。就像write 函数所做的或 dprintf 一样。我应该补充一点,我以前从未使用过 dprintf,只是在推测其行为

标签: python c pipe fifo named


【解决方案1】:

这是一个小的工作示例

Python 方面:

with open('./test_out.fifo', 'r') as fo:
    message = fo.readline()
    print(message)

在“服务器”C端

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    int fifo_fd;
    fifo_fd = open("./test_out.fifo", O_WRONLY);
    dprintf(fifo_fd, "testing123\n");

    while(1)
    {
        sleep(1);
    }
    return 0;
}

C程序末尾的无限循环只是为了证明在python程序中数据可读之前我们不需要关闭文件

我也应该说我有一段时间没有做 C 代码了。

【讨论】:

  • 你知道是否有一种方法可以在 python 端检查 fifo,如果数据准备好了,可以捕获它,否则可以做其他的想法?看来现在我处于时钟模式,将等待新数据的到来。我问是因为我需要在python中获取数据后对其进行处理,我不想失去系统被读取FIFO阻塞的处理能力。
  • 让我考虑一下。我会在这里回复你。
  • 让我解释一下我的情况,我在 C 中的传感器每 50 毫秒获取一次数据并放入 FIFO,在 python 端,当 FIFO 有数据时,我读取它并在分析完成后对其进行分析我应该返回并检查FIFO中是否有任何新数据并读取并再次执行。我唯一担心的是,如果我分析数据的时间超过 50 毫秒,我不会丢失 FIFO 中的任何数据。而且我不知道fifo的长度是多少。
  • 回答大小。试试这个命令sysctl fs.pipe-max-size关于其他问题,有解决办法,我确定。想了一会儿这个问题。提出一个问题,我会尽力帮你解决。我为什么不在 cmets 里帮你呢?很简单,也许其他人也有同样的问题,他/她不会在这里找到答案,如果你想了一会儿这个问题,也许你会发现其他人已经有了这个确切的问题。随时在此评论中提供您未来问题的网址
  • 当然,我会考虑一下,让你知道我的发现。
猜你喜欢
  • 2012-10-27
  • 2013-07-26
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 2015-03-28
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多