Front page | perl.macosx |
Postings from August 2006
Re: How to get a pid
Thread Previous
|
Thread Next
From:
wren ng thornton
Date:
August 2, 2006 01:18
Subject:
Re: How to get a pid
Message ID:
20060802081805.5812.qmail@web34307.mail.mud.yahoo.com
--- quoth Ted Zeng <zeng@adobe.com>:
> Originally, my perl script launches Eggplant as a
> child process (use ``, not an independent process.)
Actually ``, aka qx(), does spawn an independant
process. Try running:
perl -e'`sleep 6000`;' &
and then doing a `ps` to see. But the semantics of
qx() mean that the forking, execing, and capturing of
output are hidden from the programmer. Same goes for
using system().
Because of the semantics of qx() and system(), there's
no way to capture the pid of the spawned process--
that's all handled behind the scenes. If you don't
trust the children to return properly, then you need
to use fork() and exec() explicitly with something
like the following:
#!/usr/bin/env perl
print "$$: noone in here but us chickens\n";
$pid = fork();
print "$$: I got $pid\n";
if ($pid == 0) {
print "$$: child is execing\n";
exec 'sleep', 10;
} else {
print "$$: parent is waiting\n";
sleep 5;
print "$$: kids these days! (killing $pid)\n";
kill 9, $pid;
}
__END__
You can watch this in another shell with a ps. You can
also use elements of %SIG for the first argument to
kill() but `sleep` so happens to ignore everything. Do
note that the interleaving of the process scheduling
after calling fork() is unpredictable, even if it
appears reliable over a few runs. Even the order in
which processes return from a call to fork() is
unpredictable.
Unfortunately with this approach, capturing the output
of the child is harder. And of course you'll want to
verify that the child is running too long before
killing it in your version.
Live well,
~wren
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
Thread Previous
|
Thread Next