2012-07-06 3 views
1

다른 분기 된 프로세스간에 데이터를 공유하려면 DBM::Deep을 사용하고 있습니다. 나는이처럼 내 DBM :: 깊은 객체를 설정 :DBM :: Deep 설명 할 수없는 오류

my $todo = DBM::Deep->new(
    file  => "urls.db", 
    locking => 1, 
    autoflush => 1, 
    type  => DBM::Deep->TYPE_HASH 
); 

을하지만 내 스크립트를 실행할 때 나는이 오류를 얻을 것 : 그래서 모든하지만 마지막 오류가 줄을해야 할

DBM::Deep: Cannot read sector at 673 in get_bucket_list() at new_forked_crawl.pl line 116 
DBM::Deep: '30': Don't know what to do with type '' at new_forked_crawl.pl line 116 
DBM::Deep: Cannot read sector at 1188 in get_bucket_list() at new_forked_crawl.pl line 116 
DBM::Deep: '65536': Don't know what to do with type '' at new_forked_crawl.pl line 116 
Can't locate object method "data" via package "DBM::Deep::Sector::File::BucketList" at /usr/lib/perl5/site_perl/5.8.8/DBM/Deep/Engine/File.pm line 160. 

을 (116)는,하지만 그렇게 이상한 것은 그 라인 (116)입니다 실제로 DBM과는 아무 :: 깊은 없습니다 :

my $pid = fork(); 
    if($pid) { #line 116 
     push(@forked_children,$pid); 
    } 
    #child process, do the work, son! 
    elsif($pid == 0) { 
     process_url($todo->{1}->{'urls_hash'}->{$url_id}{'url'},$url_id); 
    } #end $pid else 

그래서 나는이에 갈 많은 아니라는 것을 알고,하지만 누군가는 이러한 오류 또는 일부에 실행 된 이것과 비슷한가? DBM :: Deep을 사용하는 방법에 관해 빠진 것이 있습니까? 감사!

답변

4

문제는 DBM :: Deep 개체의 복사본을 사용하는 것으로 의심됩니다. 자식에 새로운 DBM :: Deep 객체를 생성 해보십시오. 자식이 생성 될 때 그러한 개체가 부모 개체에 존재하지 않는 경우가 일반적입니다.

+0

와우, 훌륭한 호. 어떻게 추론 했습니까? – srchulo

+1

파일 핸들이있는 개체를 복제하는 것은 일반적인 문제입니다. – ikegami

관련 문제