On Sunday 05 September 2010 17:58:54 Shlomi Fish wrote: > On Sunday 05 September 2010 08:13:02 Jesse Vincent wrote: > > On Sun, Sep 05, 2010 at 08:03:41AM +0300, Shlomi Fish wrote: > > > Hi all, > > > > > > Inspired by a message ot the perl documentation proejct, I started > > > working on revamping perlipc.pod here: > > > > > > http://github.com/shlomif/perl/tree/perlipc-revamp > > > > > > What I did so far is convert all tabs to spaces (as the indentation was > > > very erratic) and started modernising the code > > > > Shlomi, > > > > Thanks for starting to look at perlipc. Is there a chance you could send > > your patch as a series that splits out the whitespace changes from the > > code/prose changes? Heavy whitespace changes tend to make it much > > harder to review "contentful" changes in a patch, since there are > > so many lines of diff that aren't actually semantically meaningful. > > > > Thanks, > > Jesse > > Thanks to the git history, I can. Here is the tabs->spaces patch and the > next reply will contain the code/prose changes. I've marked the transition > in the repository using the «perlipc_pod_after_changing_tabs_to_spaces» > tag. > > Regards, > > Shlomi Fish >
And here's the code/prose changes patch which works againt the version after the tabs->spaces conversion: Regards, Shlomi Fish diff --git a/pod/perlipc.pod b/pod/perlipc.pod index 9c556d0..4bc119b 100644 --- a/pod/perlipc.pod +++ b/pod/perlipc.pod @@ -48,11 +48,21 @@ system, or you can retrieve them from the Config module. Set up an indexed by name to get the number: use Config; - defined $Config{sig_name} || die "No sigs?"; - foreach $name (split(' ', $Config{sig_name})) { - $signo{$name} = $i; - $signame[$i] = $name; - $i++; + + if (!defined $Config{sig_name}) + { + die "No sigs?"; + } + + my (%signo, @signame); + + my $index = 0; + + foreach my $name (split(' ', $Config{sig_name})) { + $signo{$name} = $index; + $signame[$index] = $name; + + $index++; } So to check whether signal 17 and SIGALRM were the same, do just this: @@ -82,8 +92,9 @@ values are "inherited" by functions called from within that block.) sub precious { local $SIG{INT} = 'IGNORE'; - &more_functions; + more_functions(); } + sub more_functions { # interrupts still ignored, for now... } @@ -119,7 +130,7 @@ You may be able to determine the cause of failure using C<%!>. You might also want to employ anonymous functions for simple signal handlers: - $SIG{INT} = sub { die "\nOutta here!\n" }; + $SIG{INT} = sub { die "\nOutta here!\n"; }; But that will be problematic for the more complicated handlers that need to reinstall themselves. Because Perl's signal mechanism is currently @@ -169,25 +180,38 @@ example: my %children; $SIG{CHLD} = sub { + # don't change $! and $? outside handler local ($!,$?); + my $pid = waitpid(-1, WNOHANG); + return if $pid == -1; + return unless defined $children{$pid}; + delete $children{$pid}; + cleanup_child($pid, $?); }; while (1) { + my $pid = fork(); + if ($pid == 0) { - # ... + + # I'm the child - do something. exit 0; - } else { - $children{$pid}=1; + + } + else { + + $children{$pid}=1; # ... system($command); # ... + } } @@ -202,12 +226,16 @@ using longjmp() or throw() in other languages. Here's an example: eval { - local $SIG{ALRM} = sub { die "alarm clock restart" }; + + local $SIG{ALRM} = sub { die "alarm clock restart"; }; + alarm 10; flock(FH, 2); # blocking write lock alarm 0; + }; - if ($@ and $@ !~ /alarm clock restart/) { die } + + if ($@ and $@ !~ /alarm clock restart/) { die; } If the operation being timed out is system() or qx(), this technique is liable to generate zombies. If this matters to you, you'll @@ -249,16 +277,18 @@ info to show that it works and should be replaced with the real code. $|=1; - # make the daemon cross-platform, so exec always calls the script + # Make the daemon cross-platform, so exec always calls the script # itself with the right path, no matter how the script was invoked. my $script = File::Basename::basename($0); my $SELF = catfile $FindBin::Bin, $script; # POSIX unmasks the sigprocmask properly my $sigset = POSIX::SigSet->new(); + my $action = POSIX::SigAction->new('sigHUP_handler', $sigset, &POSIX::SA_NODEFER); + POSIX::sigaction(&POSIX::SIGHUP, $action); sub sigHUP_handler { @@ -269,9 +299,12 @@ info to show that it works and should be replaced with the real code. code(); sub code { + print "PID: $$\n"; print "ARGV: @ARGV\n"; + my $c = 0; + while (++$c) { sleep 2; print "$c\n"; -- ----------------------------------------------------------------- Shlomi Fish http://www.shlomifish.org/ Understand what Open Source is - http://shlom.in/oss-fs God considered inflicting XSLT as the tenth plague of Egypt, but then decided against it because he thought it would be too evil. Please reply to list if it's a mailing list post - http://shlom.in/reply .