Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проблема многократного запуска одной программы из другой в Delphi и Pascal

Delphi , Программа и Интерфейс , Приложения чужие

 

Вопрос, поднятый пользователем iso4free, касается запуска одной программы из другой с использованием различных привилегий и повторного использования программы, запускаемой через графический интерфейс. Работа происходит в среде Raspberry Pi с использованием Linux, но для упрощения тестирования программист применяет обычный компьютер.

Описание проблемы

Разработчик создал два приложения на Lazarus с графическим интерфейсом: "runner" и "sdu". Приложение "runner" запускается при старте системы и без отображения своего окна запускает "sdu" с правами суперпользователя. После завершения работы "sdu", "runner" перезапускается с правами обычного пользователя. Запуск происходит с помощью функций TProcess и FpExecv(), но после первого запуска "sdu" из "runner" через графический интерфейс, последующие попытки запуска не удаются.

Пробное решение

Пользователь iso4free обнаружил, что для корректной работы требуется экспорт дополнительной переменной окружения Xauthority. После внесения этого изменения запуск между двумя программами стал успешным и повторяемым.

Пример кода запуска приложения из "runner"

procedure TForm1.RunApp(anApp: string; asRoot: boolean);
var
  AProcess: TProcess;
  I: integer;
  DisplayVar, XauthorityVar: string;
begin
  AProcess := TProcess.Create(nil);
  try
    AProcess.InheritHandles := False;
    AProcess.Options := [poNoConsole, poWaitOnExit];
    AProcess.ShowWindow := swoShow;
    DisplayVar := GetEnvironmentVariable('DISPLAY');
    if DisplayVar = '' then
      DisplayVar := ':0';
    XauthorityVar := GetEnvironmentVariable('XAUTHORITY');
    AProcess.Environment.Add('DISPLAY=' + DisplayVar);
    AProcess.Environment.Add('XAUTHORITY=' + XauthorityVar);
    for I := 1 to GetEnvironmentVariableCount do
      AProcess.Environment.Add(GetEnvironmentString(I));
    if asRoot then
    begin
      AProcess.Executable := '/bin/bash';
      AProcess.Parameters.Add('-c');
      AProcess.Parameters.Add('sudo setsid ' + anApp + ' &');
    end
    else
    begin
      AProcess.Executable := '/bin/bash';
      AProcess.Parameters.Add('-c');
      AProcess.Parameters.Add('setsid ' + anApp + ' &');
    end;
    AProcess.Execute;
  finally
    AProcess.Free;
  end;
end;

Альтернативные способы решения

Несмотря на то, что проблема была решена, рассмотрим альтернативные способы запуска программы для обеспечения более широкого понимания вопроса:

  1. Использование механизма деamon-процессов для управления запущенными приложениями.
  2. Разработка протокола общения между приложениями через сокеты или файловую систему для передачи команд на запуск и завершение работы.
  3. Применение межпроцессного взаимодействия с использованием пайпов или сокетов в рамках одного пользователя для обеспечения безопасности.

Выводы

Данная проблема является типичной для систем, где требуется запуск программ с разными уровнями привилегий. Разработчикам важно учитывать особенности окружения и корректно настраивать переменные окружения для успешного выполнения задач. В данном случае, экспорт переменной Xauthority позволил устранить проблему многократного запуска программы "sdu" из "runner".

Создано по материалам из источника по ссылке.

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


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Приложения чужие ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 07:07:40/0.0034089088439941/0