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
(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...