> -----Original Message----- > From: JupiterHost.Net [mailto:[EMAIL PROTECTED] > Sent: Friday, November 05, 2004 3:08 PM > To: [EMAIL PROTECTED] > Cc: Jose Nyimi > Subject: Re: RE : start http request and move on > > > > > Nice approach, I have learned today an easy to do it :) Though care > > should be taken to not fork many *uncontrolled* childs. > > Could you elaborate what uncontrolled children are > specifically and what > should be avoided? > (In context of this thread of course not the little humans running > around like crazy ;p) > > > Rgds, > > José. > > --
Hi, I've been lurking on this thread for a bit, and now that you've jumped to children and fork and related topics I'll chime in! I found a lot of useful information about this sort of thing in "perldoc perlipc". Check out the stuff about Daemons and the REAPER subroutine in that doc. Also, in the cookbook (I think! I don't have it with me to check) there is some good stuff about daemons and children. More specifically to the questions above, two things to be careful of: First, always, ALWAYS check (then, check again!) that you are not going to fork-bomb your system. If your script, forks (now you have 2), then both of those fork again, 'cause you have a bug in a loop somewhere (now you have 4) and so on (now there are 8) and so on (16 ... Can you see where this is goin?!), you will quickly bring your box to a screaching halt! Second, (I'm assuming this is a UNIX-ey OS) make sure you read up on setsid and sys_wait_h in the POSIX (perldoc POSIX) module, as well as the builtin 'waitpid' (perldoc -f waitpid). You might have to 'man' the equivelant to get meaningful documentation (like, 'man setsid'). When I fork a process, I like to make sure the child at least does the following: - chdir / (it's rude for a random process to sit on a filesystem that might need to be unmounted) - change the stdin, stdout and stderr (also rude to spurt random nonsense from a random process onto the terminal or somesuch) - setsid (So the child can own it's own session) Like this: sub daemonize { chdir '/' or die "Can't chdir to /: $!"; open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; open STDOUT, '/dev/null' or die "Can't write to /dev/null: $!"; defined( my $pid = fork ) or die "Can't fork the child: $!"; #The exit below can be replaced with an if-else construct if you want the original to keep going. #I believe this has been handled in this thread already! exit if $pid; # original process dies here setsid or die "Can't start a new session: $!"; open STDERR, '>&STDOUT' or die "Can't duplicate STDOUT: $!"; } I hope this helps a bit. Let me know if ya got more questions, --Errin -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>