как выгрузить динамическую библиотеку в lua

Я использую luajit2.0.4 в качестве интерпретатора lua. вот ситуация:

после того, как я загружу динамическую библиотеку, например cjson.so, с помощью

cjson = require('cjson')
a=cjson.new() -- blahblah... do things i want

затем мне нужно перезаписать файл lib (ситуация горячего обновления, и здесь cjson.so_1 и cjson.so могут быть одинаковыми)

[root@localhost lib]# cp cjson.so_1 cjson.so
cp: overwrite `cjson.so'? y

это заставит ядро ​​обрезать физическую память pmap cjson.so и приведет к отсутствию страницы, когда я вызову

a=cjson.new()

ядро снова скопирует библиотеку cjson.so в память, на этот раз не анализируя глобальные символы. поэтому, когда я вызываю new(), который должен вызывать внешние функции, такие как malloc(), возникает ошибка сегмента.

Я уже нашел способ перезагрузки, написав функцию выгрузки на C,

и мой вопрос: могу ли я сделать это с помощью самого кода lua?


person Knova Chan    schedule 15.11.2017    source источник
comment
Из эта беседа похоже, что повторная загрузка библиотеки на lua требует использования C. Ссылка содержит пример кода, показывающего, как решалась проблема, но для этого требовалось использование C.   -  person ryyker    schedule 15.11.2017
comment
@ryyker да, это временное решение, о котором я упоминал   -  person Knova Chan    schedule 15.11.2017
comment
Ответ на ваш вопрос могу ли я сделать это с помощью самого кода lua? - нет. очевидно, это мы, потому что lua является интерпретируемым языком. U,e, его библиотека используется, поэтому попытка выгрузить библиотеку вызовом lua синтаксиса, который интерпретируется и выполняется библиотекой в ​​это время, невозможна.   -  person ryyker    schedule 15.11.2017


Ответы (1)


К сожалению, это невозможно.

Вам придется подойти к ситуации, используя C/C++, но не используя Lua, из-за того, как работает Lua, и я бы хотел, чтобы был другой ответ, но у Lua есть свои ограничения.

person SleepyMode    schedule 15.11.2017
comment
да, и, возможно, мы должны зафиксировать патч для lua, чтобы решить эту проблему - person Knova Chan; 17.11.2017
comment
@KnovaChan - Ваше предложение предполагает, что вы все еще не понимаете, почему это невозможно сделать. Можете ли вы сесть на стул, оторвав ноги от земли, а затем убрать стул? или вы можете снять обувь, когда стоите на ней? Замена любого исполняемого файла вызовом одной из его библиотек или функций во время его использования - это то же самое. - person ryyker; 17.11.2017
comment
@ryyker еще раз спасибо, но я все еще думаю, что, пока это можно сделать на C, мы всегда можем обернуть его и создать API для вызова lua, верно? На самом деле, когда мы хотим выгрузить библиотеку, мы, конечно же, больше не будем ее использовать. Вы можете взглянуть на ссылку, которую вы даете в своем первом комментарии, если этот код находится в исходном ядре lua, то unloadlib можно выполнить на чистом lua. - person Knova Chan; 18.11.2017