in reply to Parent process dies unexpected

I don't know why, but commenting out the exit fixes it for FreeBSD (v5.8.0 built for i386-freebsd). Why would calling exit in the child exit the parent?

Update: The parent doesn't exit. $SIG{'CHLD'} is being called, but accept is returning false due to "Interrupted system call" ($! == 4). Maybe the CHLD signal interrupts accept?? no, that can't be it, cause it works fine without the call to exit. In any case, the following fix seems to work:

use POSIX; ... REDO_ACCEPT: { while ($client = $sock->accept()) { ... } redo if $! == EINTR; }

There might be a better way. I'm not familiar with this stuff. I just deduced this from debugging.

Replies are listed 'Best First'.
Re^2: Parent process dies unexpected
by gnork (Scribe) on Sep 29, 2004 at 07:23 UTC
    Hi, ikegami!

    Thx for the hint. How did you debug the forked child? Or were you using strace/truss?
    Anyway, I'm going to try your suggestion and report back.
    Another question: Would you consider this a bug?

    Best regards,
    gnork

    cat /dev/world | perl -e "(/(^.*? \?) 42\!/) && (print $1))"
    errors->(c)

      First, I commented out the exit. It "fixed" the problem, but I deemed the solution unacceptable. Behold my fancy debugger!

      #!/usr/bin/perl use strict; use IO::Socket; use constant MYPORT => 2000; $|=1; <------- my $sock = ''; my $client = ''; $sock = IO::Socket::INET->new(LocalPort => MYPORT, Type => SOCK_STREAM, Proto => 'tcp', Reuse => 1, Listen => 10) or die "trouble creating socket: $@\n"; $SIG{'CHLD'} = sub { print('!'); <------- wait(); print('@'); <------- $client->close(); print('#'); <------- }; print "Accepting connections on Port ", MYPORT, "...\n"; while ($client = $sock->accept()) { print "Accepted connection from ", $client->peerhost(), ":", $client->peerport(), "\n"; if (fork() == 0) { while (<$client>) { chomp; print $client scalar(reverse($_)), "\n"; } exit 1; } } print('$'); <------- print(0+$!, "$!"); <-------

      When I noticed '!@#' was being printed, I added '$'. Then I checked why accept was returning by adding a print of $!.

      Since I'm not sure what the cause is, I'm not sure if I consider it a bug. In any case, the behavious should be documented.

        Hi, ikegami!

        Thx for your effort, we are digging in a bit deeper now.
        Maybe the weekend brings some new results which i will promptly let you know.

        Have a nice weekend,
        Gnork

        cat /dev/world | perl -e "(/(^.*? \?) 42\!/) && (print $1))"
        errors->(c)