Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Я предполагаю, что все Ваши дети вышли перед отъездом теста? Поскольку иначе, это может держаться за 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
содержит метасимволы оболочки (пробелы), Perl на самом деле использует оболочку, когда Вы звоните exec()
. В то время как Ваш монитор работает, существует (1) Perl, (2) ребенок sh -c
и (3) Perl внука, работающий monitor_real.pl
. Что это означает, в особенности, когда Вы звоните KillMonitor
, Вы только уничтожаете оболочку (потому что это - PID, который Вы имеете), а не монитор.
Вы могли бы также интересоваться , Как я разветвляю процесс демона? от Perl FAQ.