2013-07-18 3 views
3

Можно ли получить доступ к содержимому памяти кучи в Lua, передав ему указатель на адрес памяти, выделенный функцией malloc в C?Доступ к памяти кучи в lua

Я попытался это:

int *j=(int *)malloc(sizeof(int)); 
j[0]=5; 

попутном (j как указатель на Lua), то содержание доступа Lua в ячейке памяти указываемого указателем j.

+0

Зачем вам это нужно или нужно? – lhf

+0

Потому что я хочу написать два модуля 1: «Захватить IP-пакеты на языке« c »в требуемом формате« Структура »и выделить память с помощью malloc и передать указатель на эту структуру в lua через стек, совместно используемый между lua и c и 2: Lua модуль, который считывает этот пакет и обрабатывает его. – user2589882

+0

Вы можете просто использовать для этого строки или таблицы. Строки в Lua a содержат произвольные двоичные данные. – lhf

ответ

3

Для этого нет встроенной поддержки.

Вы можете написать свою собственную поддержку в C, экспортировав версию malloc в Lua, которая создает буферы памяти как пользовательские данные и предоставляет подходящие метаметки для удобства доступа к содержимому. (Но используйте lua_newuserdata вместо malloc.)

Некоторые из них появились в списке рассылки Lua. Смотри, например

+0

Но нельзя ли куча рассматриваться как разделяемая память между двумя процессами, и это невозможно по концепции разделяемой памяти, обмениваться памятью между двумя процессами, таким образом, чтобы одна процесс производит данные, а другой потребляет его. «C» производитель и lua «Потребитель». – user2589882

+0

@ user2589882 Независимо от того, может ли память кучи делиться между двумя процессами, это не имеет никакого отношения к lua ​​per-say.Чтобы обмениваться памятью между двумя * разными процессами, вы должны использовать предоставленный системный API, который явно зависит от ОС и платформы или от какого-либо IPC. Конечно, вы можете создавать привязки для них, чтобы они были доступны для lua. – greatwolf

1

Что вы на самом деле хотите сделать? Ваш вопрос, похоже, спрашивает о переходе данных с C на Lua. Ваши комментарии предполагают, что вы хотите обмениваться памятью между двумя отдельными процессами.

Если вы просто хотите использовать некоторые C с Lua, тогда вы должны написать и добавить (и использовать userdata для перемещения данных). Например, если у вас есть библиотека, написанная на C, и вы хотите использовать ее в Lua, вам нужно будет расширить Lua с помощью модуля, обертывающего библиотеку. Это описано в Part IV of PIL. При использовании расширения существует только один процесс, поэтому память легко распределяется между C и Lua.

Если вам действительно нужно обмениваться данными между двумя процессами, вам нужно найти какой-то IPC, который будет работать для вас. Использование сокета - очевидный выбор, для этого вы можете использовать LuaSocket. Если вы хотите паб/суб, то вы можете попробовать LCM, который поддерживает как C, так и Lua.

Смежные вопросы