LINUX.ORG.RU

Perl, пара вопросов


0

0

Вот, сел PERL изучать. Объясните следущее:

Пример из учебника:
my $pid;
unless( $pid = fork ) {
  unless( fork ) {
    # полезный код
    exit 0;
  }
  exit 0;
}
waitpid($pid,0);

Здесь, как я понимаю, создаётся дочерний поток (1) который создаёт в свою очередь свой дочерний 
поток (2). При этом, основной родительский процесс ждёт ожидания своего дочернего потока (1).

У меня есть подозрение, что данная конструкция которая приведена в учебнике предназначена для 
того чтобы дождаться завершения внутреннего fork, создающего поток (2). Зачем? Зачем здесь
второй fork, ведь, waitpid и так дождётся завершения дочернего потока (1), вутри которого 
можно и были бы выполнить полезный код??

И как правильно создать в цикле несколько потоков и дождаться их завершения?

Есть ли в перле способ сразу инициализировать массив одним значинием при создании?

★★★

Re: Perl, пара вопросов

> Зачем? Зачем здесь второй fork, ведь, waitpid и так
> дождётся завершения дочернего потока 

вопрос не про perl. завершения процесса 2 мы как раз
и _не_ дождемся. второй fork видимо для того, чтобы
процесс 2 имел init в качестве parent, тогда нам не
нужно бороться с zombie.

> И как правильно создать в цикле несколько потоков и
> дождаться их завершения?

ну, например...

     for (1 .. 10) {
             next if fork;
             # child works
             exit;
     }

     1 until wait < 0;

> Есть ли в перле способ сразу инициализировать массив одним
> значинием при создании?

my @array = ("value") x 10;

idle ★★★★★ ()

Re: Perl, пара вопросов

Это т.н. magic double fork. А по второму вопросу уже ответили.

Zulu ★★☆☆ ()

Re: Perl, пара вопросов

Спасибо за ответы. Объясните пожалуйста, почему и второго fork родителем будет init?

eRazor ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.