nixp.ru v3.0

27 мая 2017,
суббота,
14:54:16 MSK

DevOps с компанией «Флант»
anonymous написал 4 декабря 2006 года в 16:06 (629 просмотров) Ведет себя неопределенно; открыл 1814 темы в форуме, оставил 5575 комментариев на сайте.

К примеру есть массив состоящий из 100 эл-в.

В цикле пораждается 4 процесса, мне нужна распределить между 4мя процессами эл-ты массива, каждому процессу по 25 и вывести их на STDOUT.

Думаю можна это зделать через файл, пайпы и разделяемую память ( без модуля IPC::Shareable ) но не знаю как, эксперементировал по разному, впринцыпе сама работа мне понятно но а вот реализовать perl-языком не могу, помогите пожалуйсто.

ps: использую fork()

вот скрипт на базе которога я думал делать:

#!/usr/bin/perl

use strict;

use warnings;

my $num = 4;

my @child;

for(1..$num) {

my $pid = fork();

if($pid) { push @child,$pid; }

elsif($pid == 0) { print «$$\n»; exit(0); }

else{ print «fork() failed : $!\n»; }

}

for(@child) { waitpid($_,0); }

metal

Так в чем у тебя проблема? Я бы считал сначала данные в массив. Потом форки и каждый child начинается с определенного элемента обработку. Может я не совсем въехал в perl-specific, дома сам попробую такое, интересно.

myst

$array[$i + $child] вот и всё…

anonymous

metal & myst непонял вас.

скрипт же сам запускает себя, я никак не могу пользоваться массивам или еще чем. Может я не прав, то прошу развеять мои сомнения.

myst

man perlfork

fork не запускает, а клонирует процесс.

anonymous

ни кто не поможет? ((

metal

Ты напиши все-таки что у тебя не получается.

anonymous

Получилось с массивом. Вот :

#!/usr/bin/perl

use warnings;

use strict;

my @array = qw(1 2 3 4 5 6 7 8 9 0 a s d f g);

my $s = 0;

my $n = 5;

my @child = ();

for(1..3) {

my $pid = fork();

if($pid) {

push @child, $pid;

$s = $s+$n;

print «parent_S=$s parent_N=$n\n»;

}

elsif($pid == 0) {

my $c = $s+($n-1);

print «children_C=$c children_S=$s children_N=$n\n»;

sleep(2);

print «PID=$$ MSG=@array[$s..$c]\n»;

exit(0);

} else { die «fork() failed : $!\n»; }

}

for(@child) { waitpid($_,0); }

Теперь решил тож самое зделать через пайпы — проста в голову не приходит как.

metal

http://www.opennet.ru/docs/RUS/perl_ipc/