К примеру есть массив состоящий из 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); }
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Так в чем у тебя проблема? Я бы считал сначала данные в массив. Потом форки и каждый child начинается с определенного элемента обработку. Может я не совсем въехал в perl-specific, дома сам попробую такое, интересно.
$array[$i + $child] вот и всё…
metal & myst непонял вас.
скрипт же сам запускает себя, я никак не могу пользоваться массивам или еще чем. Может я не прав, то прошу развеять мои сомнения.
man perlfork
fork не запускает, а клонирует процесс.
ни кто не поможет? ((
Ты напиши все-таки что у тебя не получается.
Получилось с массивом. Вот :
#!/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); }
Теперь решил тож самое зделать через пайпы — проста в голову не приходит как.
http://www.opennet.ru/docs/RUS/perl_ipc/