читать стандартный вывод процесса Linux, порожденного винным приложением - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть приложение CLI, которое выполняется через Wine в Linux, так как ему нужны некоторые библиотеки DLL с закрытым исходным кодом, которые доступны только для Windows.Однако у меня также есть другой инструмент, который гораздо проще компилировать / запускать в Linux.Это приложение Linux связывается через STDIN / STDOUT.

Поэтому я хочу порождать нативный процесс Linux из Wine, передать некоторые данные (в идеале через stdin), дождаться завершения процесса и прочитать его результат (в идеале через stdout).).Это тривиально, если оба процесса будут выполняться в одной и той же среде ОС (чистый Linux / Posix / Windows), но в моем случае это будет сложнее.

Я могу порождать процесс Linux с помощью popen, но не могу получить егоstdout (всегда получая пустую строку).

Я понимаю, что сам Wine не может / не может обеспечить создание процесса блокировки (вероятно, это создает множество крайних случаев при попытке сохранить семантику Windows), как подробно описано в Ошибка Wine 18335 , ответ stackoverflow " Выполнение команд оболочки из программы, запущенной в WINE ".

Однако процесс Wine все еще выполняется в Linux, поэтому я думаю, что это должно бытьМожно ли каким-то образом подключиться к функциональности Linux (= kernel) и выполнить блокировку чтения.

  • У кого-нибудь есть советы, как запустить процесс Linux и получить его стандартный вывод из Wine?
  • Любые другие идеи о том, как сделать IPC без сложных установок сервера?

Теоретически я мог бы использовать файловую систему и ждать появления файла результатов или запустить TCP / HTTP-сервер для связи.В идеале вход доступен только для запущенного приложения без порта сервера, к которому может получить доступ каждое приложение на одном хосте.

Я читал о "winelib" как о способе доступа к встроенным функциям Unix из программ "Windows", но я не уверен, что полностью понимаю, как его использовать и помогает ли он мне (я могу адаптировать программу Wineно, как я упоминал ранее, мне нужно получить доступ к некоторым закрытым исходным библиотекам DLL, которые я не могу изменить).

Редактировать: я только что заметил библиотеку zugbruecke , которая позволяет взаимодействовать с DLL-библиотекой Windows из (Unix) Python (через пользовательское соединение wine + TCP из многопроцессорной обработки Python).Я не могу использовать это как есть (моя библиотека DLL использует много указателей, поэтому я обернул ее через pybind11), и это будет означать, что мне придется немного переделать приложение.Однако это может привести к изящному решению, где биты Windows более изолированы, и я могу получить больше удовольствия от Linux.: -)

...