Запись в файл на C во время чтения из него в Python - PullRequest
1 голос
/ 18 июня 2019

Я работаю с платой Altera DE1-SoC, где я читаю данные с датчика с помощью программы на языке C.Данные читаются непрерывно, в цикле while и записываются в текстовый файл.Я хочу прочитать эти данные с помощью программы на Python и отобразить данные.

Проблема в том, что я не уверен, как избежать столкновения во время чтения / записи из файла, поскольку это должно происходить одновременно.Я думал о создании мьютекса, но я не уверен, как его реализовать, чтобы с ним могли работать два разных языка программ.

Есть ли простой способ сделать это?Спасибо.

Ответы [ 3 ]

1 голос
/ 18 июня 2019

Операционная система позаботится об этом, пока вы сможете открыть этот файл дважды (один для чтения и один для записи). Просто не забудьте очистить код C, чтобы убедиться, что ваши данные действительно записываются на диск, а не хранятся в кеше в памяти.

1 голос
/ 18 июня 2019

Я не уверен, что вы подразумеваете под конфликтом. Я предполагаю, что это строка, разбитая пополам, потому что один процесс начал писать, а другой прервал ее и начал читать.

Вы можете использовать пакет 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 является просто фиктивной заменой, используемой для удаления процедуры обработки по умолчанию, которая печатает события в стандартный вывод. Удалите его из списка аргументов, чтобы понять, что я имею в виду.

1 голос
/ 18 июня 2019

Вы можете загрузить библиотеку C в Python, используя cdll.LoadLibrary, и вызвать функцию для получения статуса мьютекса C.Затем в Python, если мьютекс C блокируется, не читайте, а если он разблокирован, он может читать.

...