3

У меня проблема с библиотечным конфликтом при вызове внешней программы из интерпретируемой среды программирования (IDL). Похоже, проблема в том, что программа, которую я вызываю, становится дочерней по отношению к IDL, библиотеки не перезагружаются.

Из IDL я могу запускать подпроцессы напрямую или с помощью оболочки. Есть ли хороший способ, с помощью которого я могу запустить мою программу, не будучи дочерним процессом?

Единственное решение, которое я нашел, - это использование ssh localhost my_program . Это прекрасно работает, но я хотел бы более прямого решения.

1 ответ1

3

В IDE может быть загружен другой набор динамических библиотек, поскольку ваше приложение наследует другую среду, которая затем используется динамическим компоновщиком для поиска библиотек. Смотрите на странице руководства dyld переменные среды, которые могут повлиять на поведение динамического компоновщика. Ваша IDE должна иметь опции для управления этим.

Если вы все еще хотите убедиться, что ваше приложение запускается из процесса, в котором ваша IDE не является предком, вы можете настроить IDE для запуска такой команды:

bash -c 'your_app &'

это заставит bash запустить your_app в фоновом режиме и выйти. Когда родительский процесс (здесь: bash) завершается, дочерний процесс (здесь: your_app) принимается процессом init, что означает, что init (PID = 1) становится его родителем. Однако, опять же, это не повлияет на загруженные библиотеки.

Вы также можете запустить серверный скрипт, который ожидает сигнала (используя команду trap) и запускает ваше приложение, когда оно его получает. Ваша IDE должна быть настроена на запуск команды kill для отправки сигнала на сервер. Таким образом, вы будете запускать ваше приложение в той же среде, что и ваш терминал. Это, вероятно, излишнее решение.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .