Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked

Re: confusing fork/readline behaviour

by (anonymized user) (Curate)
on Aug 14, 2015 at 11:39 UTC ( #1138568=note: print w/replies, xml ) Need Help??

in reply to confusing fork/readline behaviour

(Updated:) In addition, parents should wait for children before exiting, otherwise children either get killed or usually stop running and become zombie processes.
perl -e ' my $pid = fork(); open X, "</etc/passwd"; while (readline(X)){ print "$$: $_"; sleep 1 } print "$$: all done\n"; waitpid $pid, 0 if $pid; '

One world, one people

Replies are listed 'Best First'.
Re^2: confusing fork/readline behaviour (wait)
by tye (Sage) on Aug 14, 2015 at 14:18 UTC
    In addition, parents should wait for children before exiting

    Yes, that is a good general practice. The most common problem of not doing that is that the shell that launched the command waits for the parent to exit, then displays the next prompt, then the child outputs a bit more, making a confusing display. Things get worse if a child might be reading from the same STDIN. And even if the parent process wasn't launched as a command from an interactive shell, it is often good to not have the parent exit before the children; for example, you often don't want to restart some service or daemon when some children from the last instance are still hanging around.

    otherwise children either get killed or stop running and become zombie processes

    But neither of those are valid justifications for that practice.

    The parent exiting doesn't kill the child. The closest thing to that is that the login process exiting will send SIGHUP to all processes that share that controlling tty. (And your Perl script is pretty darn unlikely to be a login process.)

    When a child process exits, it becomes a zombie process until its parent waits for it, or until the parent process exits (because then the child gets inherited by process 1 which scrupulously wait()s for any expired children). So preventing zombies is a good reason to wait() for children, but the one time that it doesn't matter is right before the parent process exits.

    - tye        

      Yes I agree - the kill case is rather exceptional, so for clarity I'll strike through it. The case where the child doesn't zombify because the parent exits immediately is also exceptional, as you say.

      One world, one people

Re^2: confusing fork/readline behaviour
by roboticus (Chancellor) on Aug 14, 2015 at 14:29 UTC

    Not completely true. Using fork is a natural way to perform processes in the background.

    $ cat #!/usr/bin/env perl use strict; use warnings; my $pid = fork(); if ($pid) { print "Parent is exiting now!\n"; } else { print "Child is waiting a bit\n"; sleep 15; print "Child is done!\n"; } $ perl Parent is exiting now! Child is waiting a bit $ date Fri Aug 14 10:22:06 EDT 2015 $ date Fri Aug 14 10:22:15 EDT 2015 $ Child is done!

    There are differences on different operating systems, to be sure. Some processes could be killed on some operating systems (though I've not experienced it myself). You can accumulate zombie processes if you don't take steps to avoid it. If you're going to use fork, you need to educate yourself on what it does and doesn't do on your platform.


    When your only tool is a hammer, all problems look like your thumb.

      Yes that's true. Although it is more common that the parent has more work to do, it is also a well-known way to create a daemon by having a main program fork and exit immediately, leaving the child running detached.

      One world, one people

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1138568]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (3)
As of 2020-02-29 01:51 GMT
Find Nodes?
    Voting Booth?
    What numbers are you going to focus on primarily in 2020?

    Results (128 votes). Check out past polls.