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;
Function TProcess.Terminate(AExitCode : Integer) : Boolean; begin Result:=False; If ExitStatus=Still_active then Result:=TerminateProcess(Handle,AexitCode); end;
Вопрос был собственно к чему. При вызове данной функции то приложение, которое запустил не завершается, значится как зомби... ОС - Linux. Собственно код: Старт приложения...
dionic писал(а):А это для каких, если не секрет =).
Windows - одна из них
dionic писал(а):Вопрос был собственно к чему. При вызове данной функции то приложение, которое запустил не завершается, значится как зомби...ОС - Linux.
Ну так понятно, процессу нужно какое-то время, даже чтобы умереть. Проблема в том, что реализация TProcess слишком обобщенная и потому кривоватая. Обычно waitpid() вызывают без аргумента WNOHANG, и она блокируется до завершения процесса. Но в случае TProcess так нельзя, потому что он из соображений гуманизма сначала пытается послать SIGTERM, и если исполняемый процесс игнорирует этот сигнал, waitpid без WNOHANG будет висеть, пока процесс не сдохнет от старости... А с WNOHANG, похоже, получается, что процесс всегда прибивается c SIGKILL, а TProcess.Terminate всегда возвращает false, потому что с ее точки зрения процесс продолжает выполняться... Хотя это утверждение нуждается в проверке. Sleep() в общем случае тоже не вставишь, потому что непонятно, сколько ждать...