/* Function: vUtlSignalsChildHandler() Purpose: To handle child signals. Parameters: iSignal signal number Globals: none Returns: void */ void vUtlSignalsChildHandler ( int iSignal ) { int iStatus = 0; pid_t zPid = 0; /* Give the kid a decent burial */ while ( (zPid = s_waitpid(-1, &iStatus, WNOHANG)) > 0 ) { /* iUtlLogDebug(UTL_LOG_CONTEXT, " caught child: %d.", (int)zPid); */ } return; }
/* Returns 0 = normal exit(), 1 = Died because of a Signal, 2 = Unknown */ int proc_wait(pid_t pid, int *code) { int status; if (debug > 4) fprintf(stderr, "proc_wait(): Before s_waitpid()\n"); Again: s_waitpid(pid, &status, 0); if (debug > 1) fprintf(stderr, "Process %d exited, status = %d\n", (int) pid, status); if (WIFEXITED(status)) { /* Process called exit() */ *code = WEXITSTATUS(status); return PROC_EXIT; } else if (WIFSIGNALED(status)) { /* Process died with a Signal */ *code = WTERMSIG(status); return PROC_SIGNAL; } else if (WIFSTOPPED(status) || WIFCONTINUED(status)) { goto Again; } /* Unknown termination reason */ return PROC_OTHER; }
/* Function: vUtlSignalsPassToChildProcesses() Purpose: To pass the signal to any child processes Parameters: iSignal signal Globals: none Returns: void */ void vUtlSignalsPassToChildProcesses ( int iSignal ) { int iStatus = 0; pid_t zPid = 0; /* Pass on the signal to any kids */ if ( (zPid = s_waitpid(-1, &iStatus, WNOHANG)) == 0 ) { /* iUtlLogDebug(UTL_LOG_CONTEXT, "s_kill(0, %ld) [%ld][%ld][%ld].", iSignal, s_getpid(), s_getpgrp(), zPid); */ s_kill(0, iSignal); } /* else { */ /* iUtlLogDebug(UTL_LOG_CONTEXT, "zPid [%ld].", zPid); */ /* } */ return; }