And line 171 keeps the loop running as long as we have tasks or kids to manage. Lines 175 to 191 fire off a kid, via a fork with pipes set up for each end. Even though a pipe can block if full, our algorithm ensures that when reading or writing the pipe, it's OK if we block, because it'll be for only a very short time. The return value is the process ID of the kid that just got created. If a kid dies before the message is fully delivered, we don't really care, because we'll see the dead kid on the next loop, and requeue his task automatically when we're done with a sweep of the task queue.
Simplicity wins here.
Finally, lines 202 through 218 give the main kid loop. The list is decoded and handed to the KidTask subroutine, and the results are encoded and returned in a similar style. Long pile of code. But useful, and fun, and efficient. Go ahead and play with this for now.