Почему происходит сбой Perl при использовании LibXML после разветвления? - PullRequest
2 голосов
/ 04 ноября 2011

Мне трудно справиться с этой проблемой, но я сузил ее до использования XML :: LibXML после того, как сделал форк в Perl. Я использую Strawberry Perl 5.12.0 в Windows XP и XML :: LibXML 1.70.

У меня есть сценарий, в котором мне нужно запустить несколько процессов одновременно, взять вывод XML и обработать результаты. Если я запускаю это на машине Solaris, она работает нормально, и у меня нет проблем. Однако, если я запускаю это в Windows, я получаю окно с сообщением о том, что 'perl.exe столкнулся с проблемой и должен быть закрыт.'

Вот пример программы, которая выдаст ошибку:

use strict;
use warnings;
use XML::LibXML;
use Try::Tiny;

my $cmds = ['cmd1', 'cmd2'];
my @pids = ();
foreach my $cmd (@{$cmds}) {

    my $pid = fork();

    if ($pid) {

        # parent
        push (@pids, $pid);
    } elsif ($pid == 0) {

        XML::LibXML->load_xml(string=>'<root />'); # <-- this will crash it
        exit 0;
    }
}

foreach my $ch_pid (@pids) {

    try {

        waitpid($ch_pid, 0);
    } catch {

        carp("Error on waitpid: $!");
    };
}
exit 0;

Если у меня есть только один процесс или если я не разветвляюсь, он будет работать успешно. Если я удалю вызов load_xml (и у него ничего не будет в дочернем элементе), он будет успешно работать.

Кто-нибудь знает, что может быть причиной и как это исправить?

1 Ответ

4 голосов
/ 04 ноября 2011

Особые соображения необходимо учитывать, когда использует XML :: LibXML с потоками .Некоторые из них (в частности, о начальной загрузке модуля) также относятся к разветвлениям.

Вы можете попробовать удалить загрузку времени компиляции (строка use XML::LibXML;) и вместо этого загрузить модуль после того, как вы разветвились:

} elsif ($pid == 0) {
    require XML::LibXML;
    XML::LibXML->load_xml(string=>'<root />');
    exit 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...