LINUX.ORG.RU

[perl] fork, чтение потомками одного файла


0

0

доброго времени суток, у меня вопрос,
нужно чтобы потомки могли читать файл сохраняя смещение, примерно так:

open(FILE, '<fortest') || die $!;

for (1..2) {
    my $pid = fork;
    die $! unless defined $pid;
    unless ($pid) {
        open(TMP, '>/tmp/'.$$);
        until (eof FILE) {
            my $string = <FILE>;
            print TMP $string;
        }
        exit(0)
    }
}

проблема в том что строки разрываются и общий размер файлов '>/tmp/'.$$
получается большим чем исходный размер файла fortest.

вопрос - как такое грамотно осуществить?
anonymous

Re: [perl] fork, чтение потомками одного файла

Интересно... я бы решал через IPC::ShareLite

Алгоритм примерно такой: родитель инициализирует share-память; все процессы независимо открывают файл (open FILE , "<..." внутри fork'а). Потом лочат разделяемую память. Первый дорвавшийся до памяти процесс:
- читает из shared смещение
- прыгает в файле по смещению
- читает строку
- запоминает получившееся смещение в share-память.
- разлочивает share-память.

Авось поможет?...

Slavaz ★★★★★ ()

Re: [perl] fork, чтение потомками одного файла

man perlipc на предмет файловых блокировок и семафоров, например.

anonymous ()

Re: [perl] fork, чтение потомками одного файла

Вопрос решился? Если да - краткий пример решения сюда кинь, плиз.

Slavaz ★★★★★ ()

Re: [perl] fork, чтение потомками одного файла

я решил обойтись без ipc sysv
сделал раздачу строк через пайпы родительским процессом,
правда потомоки продолжают висеть в ожидании чтения из пайпа,
но это не критично, поскольку задача чисто теоретическая

#!/usr/bin/perl -w
use strict;
use IO::Handle;

open(FILE, '<test') || die $!;

my @childs;

for my $i (0..6) {
    pipe(my $parent, $childs[$i]) || die $!;
    $parent->autoflush(1);
    $childs[$i]->autoflush(1);
    my $pid = fork;
    die $! unless defined $pid;
    unless ($pid) {
        open(TMP, '>'.$$) || die $!;
        TMP->autoflush(1);
        while (<$parent>) {
            print TMP $_;
        }
        close TMP;
        exit(0)
    }
}

my $i = 0;
while (my $str = <FILE>)
{
    $i = 0 unless $childs[$i];
    my $hd = $childs[$i];
    print $hd $str;
    $i++
}

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