LINUX.ORG.RU

Межпроцессное взаимодействие С и Lua

 , ,


0

2

Салют, ЛОР!

Как лучше всего считать значение переменной из проги на С и присвоить его переменной в скрипте LUA.

Смысл действа в следующем:
Есть фронтенд, который вызывает функцию из LUA-скрипта (раз в секунду)
Функция LUA должна забрать значение X (в рандомный момент времени)
Значение X вычисляется демон-процессом на C (раз в несколько секунд)

Через файл в тупую передавать не хочется, поэтому хочу спросить знатоков LUA о том, как правильно это сделать.

Сэнкс ин эдванс!

Я делал это через unix socket. Т.е. был демон на С, который ожидал команд на сокете, потом выполнял её, и отдавал ответ назад, а frontend (который на lua) - читал ответ:

local socket = require "socket"
local un = require "socket.unix"

local Radio = { } -- наш объект

function Radio:json()
  return json.encode(...)
end

function Radio:pexec()
  local t = socket.unix()
  if t == nil then return t end

  local c, err = t:connect(self.path)
  if c == nil then
    print("can't connect to " .. self.path .. ": " .. err)
    print("message: " .. self:json())
    t:close()
    return c
  end

  t:send(self:json())
  local a = t:receive("*a")

  t:shutdown("both")
  t:close()

  return a
end

function Radio:send()
  local status, result = pcall(self.pexec, self)
  return result
end

Весь обмен данными был в JSON. В принципе, все работало ОК :))

joy4eg ★★★★★ ()

Через файл в тупую передавать не хочется

Почему бы и нет. Можно положить файл в /tmp если боишься диск насиловать.

Рядом можно еще lock-файл разместить. Фронтенд смотрит, если lock-файл присутствует - значит бэкенд в данный момент пишет переменную, попробуйте прочитать позже

makoven ★★★★★ ()
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от makoven

Рядом можно еще lock-файл разместить

Ну это просто немного некрасиво и медленно.

Я делал это через unix socket

Да, я тоже склоняюсь к этому. Но хотел еще узнать про разделяемую память, например, или posix-каналы. Есть опыт у кого?

vgovseychuk ()

Ну как бы методы IPC все те же самые, что и в C, так что надо отталкиваться от выбранного метода и искать для него модуль.

В данном случае, так как значение вычисляется не по запросу, а обновляется по расписанию, то можно либо тупо в файл в tmpfs положить (но только демон должен обновлять его атомарно, чтобы не надо было его лочить, т.е. пишем в новый файл и переименовываем в старый), либо можно сделать через общую память, но с точки зрения lua это будет существенно геморнее

annulen ★★★★★ ()
Ответ на: комментарий от vgovseychuk

Ну это просто немного некрасиво

.. поэтому я наворочу на ровном месте сокеты и сериализацию. Для одной переменной

и медленно

Медленно читать tmpfs? Большой вопрос. Уверен для твоей задачи хватит скорости

makoven ★★★★★ ()

Есть фронтенд, который вызывает функцию из LUA-скрипта (раз в секунду)

чего-то я не пойму - почему нельзя передать значение переменной при вызове функции Луа (как аргумент функции) ?

sigurd ★★★★★ ()

Тебе для openwrt? Можешь вывесить на ubus обработчик и из lua оттуда данные забирать. Глобально и надёжно.

Dark_SavanT ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.