You're still trying to do way too much in your signal handler. This easiest (and safest) thing to do is to boil down your signal handler to one line:
> g_time_to_die = 1;
Where 'g_time_to_die' is of type "volatile sig_atomic_t". Then dispatcher() just needs to poll it ever so often.

Another option is to use a different IPC mechanism for communicating "time to die" to your children. If dispatcher() spends most of its time in a poll() or select(), then an additional socket or a pipe could be added to the fd_set/pollfd so that when the parent writes to it, the children know to die. This approach could be expanded to send other "commands" to all or individual children.

gg