Вiтаю!
Скажiть будьласка як отримати pid процеса, який я стартую з перловського скрипта, тобто:
exec "wget http://example.com/foo.rar"
менi потiбен pid wget'a. Дивився в гуглi, але так и не змiг знайти щось корисне.
дякую за допомогу!
exec() у Perl'і виконує системний виклик exec (або execvp), який запускає вказану йому аргументом програму у контексті поточного процесу, тобто, у нашому випадку, wget отримає той же pid, що і сам Perl-овий скрипт. Фактично, wget як-би "продовжить" потік виконання скрипта.
Щоб отримати wget з іншим pid'ом, потрібно використовувати system() або fork'ати вручну, приблизно так:
$child_program = "/path/to/wget";
if ($pid = fork){
#батьківський процес - сам скрипт продовжує виконання тут, асинхронно до породженого процесу
#wget буде мати pid == $pid
#тут треба ставити хандлер для SIGCHLD, виконувати waitpid, тощо, див. мануал
}else{
#породжений процес
die "fork() failed: $!\n" unless defined $pid; # на всякий випадок; тут $pid == 0 якщо все ок
exec($child_program) or die "exec($child_program) failed: $!\n";
}
Різниця між способом з system() і способом з fork() у тому, що з system() - синхронний варіант, скрипт автоматично чекає на завершення породженого нащадка, а з fork()-ом - асинхронний, можна далі щось робити у скрипті, поки виконується wget. Крім того, з system() ми не отримуємо значення pid'у system()-нутого :-) процесу.