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