Класс TProcess

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Класс TProcess

Сообщение dionic » 11.05.2010 13:17:09

Привет всем народ!

Подскажите плиз , зачем параметр AExitCode в функции terminate класса TProcess?

Код: Выделить всё
Function TProcess.Terminate(AExitCode : Integer) : Boolean;
begin
  Result:=False;
  Result:=fpkill(Handle,SIGTERM)=0;
  If Result then
    begin
    If Running then
      Result:=fpkill(Handle,SIGKILL)=0;
    end;
  GetExitStatus;
end;
dionic
новенький
 
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Re: Класс TProcess

Сообщение Sergei I. Gorelkin » 11.05.2010 13:28:35

Для тех ОС, которые поддерживают понятие кода завершения потока.
Код: Выделить всё
Function TProcess.Terminate(AExitCode : Integer) : Boolean;
begin
  Result:=False;
  If ExitStatus=Still_active then
    Result:=TerminateProcess(Handle,AexitCode);
end;
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Класс TProcess

Сообщение dionic » 11.05.2010 13:46:14

А это для каких, если не секрет =).

Вопрос был собственно к чему. При вызове данной функции то приложение, которое запустил не завершается, значится как зомби...
ОС - Linux.
Собственно код:
Старт приложения...
Код: Выделить всё
  FProc := TProcess.create(nil);
  with FProc do begin
   CommandLine:= '/home/prg03/server /home/prg03/config/server.ini';
   Options:= Options + [poNoConsole];
   Priority:= ppIdle;
   Execute;
  end;


Завершение приложения...
Код: Выделить всё
FProc.Terminate(0);


Приложение, которое запускается крутится в цикле...
dionic
новенький
 
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Re: Класс TProcess

Сообщение Sergei I. Gorelkin » 11.05.2010 14:52:04

dionic писал(а):А это для каких, если не секрет =).

Windows - одна из них :)

dionic писал(а):Вопрос был собственно к чему. При вызове данной функции то приложение, которое запустил не завершается, значится как зомби...ОС - Linux.

А сам объект FProc уничтожается где-нибудь?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Класс TProcess

Сообщение dionic » 11.05.2010 15:07:10

Да уничтожается , после FProc.Terminate(0).

Только это не помогает, зомби изчезают только когда приложение закрываешь...

Ну или вот так например деалю тоже помогает... =)
Код: Выделить всё
  Fproc.Terminate(0);
  sleep(20);
  FpWaitpid(FProc.Handle, status_,WNOHANG);


Инетресно, что без sleep не работает, т.е. зомби остается =)))
dionic
новенький
 
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Re: Класс TProcess

Сообщение Sergei I. Gorelkin » 11.05.2010 15:47:50

Ну так понятно, процессу нужно какое-то время, даже чтобы умереть.
Проблема в том, что реализация TProcess слишком обобщенная и потому кривоватая. Обычно waitpid() вызывают без аргумента WNOHANG, и она блокируется до завершения процесса. Но в случае TProcess так нельзя, потому что он из соображений гуманизма сначала пытается послать SIGTERM, и если исполняемый процесс игнорирует этот сигнал, waitpid без WNOHANG будет висеть, пока процесс не сдохнет от старости... А с WNOHANG, похоже, получается, что процесс всегда прибивается c SIGKILL, а TProcess.Terminate всегда возвращает false, потому что с ее точки зрения процесс продолжает выполняться... Хотя это утверждение нуждается в проверке.
Sleep() в общем случае тоже не вставишь, потому что непонятно, сколько ждать...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36

Рейтинг@Mail.ru