2011-11-03 49 views
2

我很難解決這個問題,但是我已經將它縮小到使用XML :: LibXML完成Perl的分支之後。我在Windows XP上運行Strawberry Perl 5.12.0,以及XML :: LibXML 1.70。爲什麼Perl在fork後使用LibXML時會崩潰?

我有一個腳本,我需要同時運行多個進程,接受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調用(並且沒有任何內容),那麼它將成功運行。

有誰知道可能是什麼原因導致這種情況,以及如何解決它?

+0

我無法在Windows 7的activeperl 5.12.2構建1202複製此行爲 – Zaid

回答

4

using XML::LibXML with threads需要特別注意。其中一些(特別是關於最初加載模塊的)也將涉及叉子。

你可以嘗試刪除編譯時負載(use XML::LibXML;線),一旦你已付出的模塊中,而不是加載:

} elsif ($pid == 0) { 
    require XML::LibXML; 
    XML::LibXML->load_xml(string=>'<root />'); 
    exit 0; 
} 
+2

在Windows上運行時,perl的'fork'實際上是在創建一個新線程,所以這更加相關。 – hobbs

+0

我剛剛嘗試了這兩種建議,並且仍然收到相同的錯誤消息。 – Joel

+0

@Joel,既然你使用線程,爲什麼不完全避免'fork'? – ikegami

相關問題