【问题标题】:Writing to a file in C while reading from it in python用 C 语言写入文件,同时在 python 中读取文件
【发布时间】:2019-11-01 06:28:40
【问题描述】:

我正在使用 Altera DE1-SoC 板,我正在使用 C 程序从传感器读取数据。在 while 循环中不断读取数据并将其写入文本文件。我想使用 python 程序读取这些数据并显示数据。

问题是我不确定如何在文件读/写期间避免冲突,因为这些需要同时发生。我正在考虑创建一个互斥锁,但我不确定如何实现它,以便两种不同的程序语言可以使用它。

有没有简单的方法来做到这一点?谢谢。

【问题讨论】:

  • 为什么要写入文件?将数据写入管道似乎更干净。
  • @WilliamPursell 这对我来说似乎更简单。你能解释一下我将如何读写fifo或管道吗?它仍然让我感到困惑,因为我使用了两种不同的程序语言。
  • linux.die.net/man/1/mkfifo 可能会给你一个很好的起点
  • 如果您在托管系统上,您可能只使用命名管道:mkfifo /tmp/fifo; cmd1 > /tmp/fifo & cmd2 < /tmp/fifo。 cmd1 是 C、python、java 还是 ada 都没关系。语言无关紧要。
  • @william:你甚至不需要外壳。 man7.org/linux/man-pages/man3/mkfifo.3.html

标签: python c io mutex


【解决方案1】:

您可以使用 cdll.LoadLibrary 将 C 库加载到 Python 中并调用函数来获取 C 互斥锁的状态。然后在 Python 中,如果 C 互斥锁被锁定则不读取,如果已解锁则可以读取。

【讨论】:

  • 它可以在嵌入式 linux 上工作吗?因为这些程序是在运行 linux 内核的板上使用的。
  • 只要 Python 版本支持cdll.LoadLibrary 就可以了。
【解决方案2】:

只要您可以打开该文件两次(一次用于读取,一次用于写入),操作系统就会处理此问题。只需记住从 C 代码中刷新,以确保您的数据实际写入磁盘,而不是保存在内存中的缓存中。

【讨论】:

    【解决方案3】:

    我不确定你所说的冲突是什么意思。我假设它是一条断成两半的线,因为一个进程开始写入,而另一个进程中断它并开始读取。

    您可以使用pyinotify (0.9.6) 包来查看您感兴趣的日志文件中的修改事件。假设唯一的修改是附加操作,您可以使用如下代码:

    import pyinotify
    import functools
    
    wm = pyinotify.WatchManager()
    notifier = pyinotify.Notifier(wm, default_proc_fun=lambda _e: _e)
    wm.add_watch('/home/user/somefile', pyinotify.IN_MODIFY)
    
    def my_read_routine(notifier, fd):
        while True:
            content = fd.readline()
            if not content:
                break
            print(content, end = '')
    
    read_callback = functools.partial(my_read_routine, fd=open('somefile', 'r'))
    
    notifier.loop(callback=read_callback)
    

    default_proc_fun 中的这个神秘的 lambda 只是一个虚拟替换,用于删除默认处理例程,它将事件打印到标准输出。从参数列表中删除它以了解我的意思。

    【讨论】:

      猜你喜欢
      • 2022-07-20
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 2010-10-10
      相关资源
      最近更新 更多