Welcome aboard! Remember, there is
no "dumb question" other than the one you are too timid to ask.
Every single one of us started where you are now, and we remember it well.
One of the key ideas in Unix/Linux is that you can launch another program to do some useful part of whatever-it-is that you happen to be doing. (Which happens to be a very useful idea.) But the problem is, if we now have all these programs executing
independently of one another, yet nonetheless needing to find out whether some-other program (that they had launched...) succeeded or failed, we need to have a way for the programs to
rendezvous with one another. In other words, if "program-A" launches "program-B" and then needs to do one-thing versus another-thing based on whether "program-B" succeeded or failed ... then we need to have a reliable way for "program-A" to determine the
outcome of "program-B" ... no matter which one of the two programs happens to "finish first."
- If "program-B" is a slowpoke, then "program-A" will just wait.
- But what if "program-B" is a speed-demon? What if "program-B" comes-and-goes before "program-A" gets a chance to find out what it did?
So here's what happens: when "program-B" finishes, instead of going-away
completely, it becomes a "zombie." It's waiting for "program-A" (its "parent") to investigate it. Only when its parent ("program-A") actually
does so will "program-B"
completely disappear.
(Yes, it is waiting-around in zombie-land
specifically so that its parent has an opportunity to find out what happened, no matter which one may have finished first. This
is "why" the notion of 'zombies'
exists...)
And in case you are wondering, "what if 'program-A' dies, and never inquires about 'program-B'?" Well, in that case, Linux itself (technically: "the
init process") plays The Grim Reaper and cleans-up the mess...