التفرع فرعية في وحدة بيرل اختبارات توقف تثبت. اختبار :: تسخير الخروج

StackOverflow https://stackoverflow.com/questions/183560

سؤال

ولقد سعيت لاستخدام بيرل فائدة / وحدة "إثبات" كما تسخير اختبار لبعض الاختبارات وحدة. وحدة الاختبارات هي أكثر من ذلك بقليل "النظام" من "وحدة" وأنا في حاجة الى مفترق من بعض العمليات الخلفية كجزء من الاختبار، عن طريق ما يلي ...

sub SpinupMonitor{
   my $base_dir = shift;
   my $config = shift;

   my $pid = fork();
   if($pid){
      return $pid;
   }else{
      my $cmd = "$base_dir\/..\/bin\/monitor_real.pl -config $config -test";
      close STDOUT;

      exec ($cmd) or die "cannot exec test code [$cmd]\n";
   }
}

sub KillMonitor{

   my $pid = shift;

   print "Killing monitor [$pid]\n";
   kill(1,$pid);
}

ولكن لسبب ما عندما لدي ملف .T تدور بعض العمليات الزائدة فإنه يتسبب في تسخير اختبار لشنق في نهاية الملف .T الأول بعد كل الاختبارات الانتهاء، بدلا من الذهاب إلى الملف التالي ، أو الخروج إذا كان هناك واحد فقط.

في البداية كنت أتساءل إذا أنه قد يكون لأنني كنت قتل بلدي العمليات الفرعية وتركهم البائد. حتى أضفت ..

$SIG{CHLD} = \&REAPER;
sub REAPER {
   my $pid = wait;
   $SIG{CHLD} = \&REAPER;
}

لرمز. ولكن هذا لا يساعد. في الواقع على الفحص مغلقة اتضح أن بلدي ملف اختبار بيرل قد خرجت والآن عملية البائد وهذا هو السيناريو المجمع إثبات أن لم يجن التابعة له. في الواقع عندما أضفت مكالمة يموت () في نهاية بلدي النصي اختبار حصلت ...

# Looks like your test died just after 7.

وهكذا مخطوطتي خرجت ولكن لسبب تسخير لا يتفكك.

وأنا لم تؤكد أنه هو بالتأكيد بلدي العمليات الفرعية التي يتم الإخلال أنها عندما تعطيل لهم في حين فشلت الاختبارات تسخير خرجت بشكل صحيح.

هل هناك أي شيء أقوم به خطأ في الطريق وانا بدء العمليات بلدي قد يخل تسخير بطريقة ما؟

والشكر

وبيتر

هل كانت مفيدة؟

المحلول

وأفترض أن كل ما تبذلونه من الاطفال قد خرجت قبل أن تغادر الاختبار الخاصة بك؟ لأن خلاف ذلك، قد تكون معلقة على لSTDERR، والذي قد يربك إثبات. إذا كنت قد تغلق STDERR، أو على الأقل إعادة توجيه إلى الأنابيب في عملية الديك، التي قد تكون قضية واحدة كنت تواجه.

وبالاضافة الى ذلك، فما استقاموا لكم فاستقيموا نشير أيضا إلى أن لا تحتاج للهروب مائلة إلى الأمام، وإذا كنت لا تستخدم الأحرف الخاصة قذيفة (المساحات ليست الأحرف الخاصة لبيرل - التفكير "*?{}()")، يجب أن تكون واضحة وإنشاء قائمة:

use File::Spec;
my @cmd = File::Spec->catfile($basedir,
                              File::Spec->updir(),
                              qw(bin monitor_real.pl)
                             ),
          -config => $config,
          -test   =>;

close STDOUT;
close STDERR;

exec (@cmd) or die "cannot exec test code [@cmd]\n";

نصائح أخرى

لاحظ أنك لا اختبار ما إذا كان fork() الفاشلة. كنت بحاجة للتأكد من $pid هو تعريف قبل افتراض أن "كاذبة" تعني "الأطفال. "

ولأن $cmd الخاص بك يحتوي على قذيفة الأحرف الخاصة (المسافات)، وبيرل هو في الواقع باستخدام قذيفة عند استدعاء exec(). أثناء تشغيل جهاز العرض، وهناك (1) بيرل، (2) sh -c طفل، و (3) حفيد بيرل تشغيل monitor_real.pl. ماذا يعني ذلك على وجه الخصوص هو عند استدعاء KillMonitor، كنت فقط بقتل قذيفة (لأن هذا هو PID لديك) وليس الشاشة.

أنت قد تكون مهتمة ايضا في <لأ href = "http://perldoc.perl.org/perlfaq8.html#How-do-I-fork-a-daemon-process٪3f" يختلط = "نوفولو noreferrer"> كيف مفترق عملية الخفي؟ من بيرل التعليمات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top