SIGTERM: we wait until child terminates. This ensures that stop
script can safely assume that when moniotor process is gone, the
listening socket is closed.
SIGHUP: we send a signal to child process. Wait 2 seconds and stop
without waiting for child to terminate. Indeed it may still be running
serving remaining request. We have no way to know if the child has
really closed the listening socket within the two seconds we wait.
+int child_got_signal_from_us = 0;
-static void kill_child_handler(int num)
+static void normal_stop_handler(int num)
+ /* tell child to terminate . ensure keepalive stops running -
+ let wait(2) wait once - so we exit AFTER the child */
+ child_got_signal_from_us = 1;
+ }
+}
+
+static void graceful_stop_handler(int num)
+{
+ if (child_pid)
+ {
+ /* tell our child to stop listening and wait some in time
+ in the hope that it has stopped listening by then. Then
+ we exit - quite possibly the child is still running - serving
+ remaining requests */
+ kill(child_pid, num);
+ sleep(2);
/* keep signals in their original state and make sure that some signals
to parent process also gets sent to the child..
*/
/* keep signals in their original state and make sure that some signals
to parent process also gets sent to the child..
*/
- old_sighup = signal(SIGHUP, kill_child_handler);
- old_sigterm = signal(SIGTERM, kill_child_handler);
- old_sigusr1 = signal(SIGUSR1, kill_child_handler);
- while (cont)
+ old_sighup = signal(SIGHUP, normal_stop_handler);
+ old_sigterm = signal(SIGTERM, normal_stop_handler);
+ old_sigusr1 = signal(SIGUSR1, graceful_stop_handler);
+ while (cont && !child_got_signal_from_us)
{
pid_t p = fork();
pid_t p1;
{
pid_t p = fork();
pid_t p1;