in reply to open(KID, "-|") and wait()?

Improv++ - for reading the open() docs more carefully than me (sheesh, it's even got its own paragraph there, and silly old me didn't see it!?)

robartes++ - for zombie humor, even though I think Improv's answer is better in this case - your answer is great for the general fork() case, though!

My next question: how do I prevent the close() from blocking until the child exits?

--
3dan

Replies are listed 'Best First'.
Re: Re: open(KID, "-|") and wait()?
by robartes (Priest) on Apr 10, 2003 at 14:00 UTC
    how do I prevent the close() from blocking until the child exits?
    You could delay the close until you know for sure the child process has finished. Use the non blocking version of waitpid for this. From the docs:
    use POSIX ":sys_wait_h"; $kid = waitpid(-1, WNOHANG);
    This will see if any child has died (without blocking) and return the PID of said child (and the return value in $?, as normal). You can also wait for a specific child by using the pid of that child as first argument to waitpid.

    Using this, you can make sure you only close the filehandle when the child has already exited. Just periodically check whether the child is dead, and close its filehandle if it is (you'll get a -1 return from the close, but that should be no problem).

    Unfortunately, this is not portable to all OS. See waitpid for more information.

    Update: 'now' ne 'know'

    CU
    Robartes-

Re: Re: open(KID, "-|") and wait()?
by virtualsue (Vicar) on Apr 10, 2003 at 15:40 UTC
    I'd suggest SIG{CHLD} = 'IGNORE'; unless you care what the child processes get up to after they spring into life.