diff options
author | C. McEnroe | 2020-02-08 17:22:51 -0500 |
---|---|---|
committer | C. McEnroe | 2020-02-08 17:22:51 -0500 |
commit | 8128edc7eb1e7a86e82d5936ec1100e1f9912f54 (patch) | |
tree | 71092d53dfeba8ed6e4330705b4f0b9abee68180 | |
parent | 72d8749454820cf025f05a8ab9cc1cff4c8c5b6e (diff) |
Handle SIGCHLD
-rw-r--r-- | chat.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/chat.c b/chat.c index b3e6825..372cbbd 100644 --- a/chat.c +++ b/chat.c @@ -22,6 +22,8 @@ #include <stdbool.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> +#include <sys/wait.h> #include <sysexits.h> #include <unistd.h> @@ -141,6 +143,7 @@ int main(int argc, char *argv[]) { signal(SIGHUP, signalHandler); signal(SIGINT, signalHandler); signal(SIGTERM, signalHandler); + signal(SIGCHLD, signalHandler); sig_t cursesWinch = signal(SIGWINCH, signalHandler); struct pollfd fds[2] = { @@ -155,6 +158,25 @@ int main(int argc, char *argv[]) { if (signals[SIGHUP]) self.quit = "zzz"; if (signals[SIGINT] || signals[SIGTERM]) break; + + if (signals[SIGCHLD]) { + int status; + while (0 < waitpid(-1, &status, WNOHANG)) { + if (WIFEXITED(status) && WEXITSTATUS(status)) { + uiFormat( + Network, Warm, NULL, + "Process exits with status %d", WEXITSTATUS(status) + ); + } else if (WIFSIGNALED(status)) { + uiFormat( + Network, Warm, NULL, + "Process terminates from %s", + strsignal(WTERMSIG(status)) + ); + } + } + } + if (signals[SIGWINCH]) { signals[SIGWINCH] = 0; cursesWinch(SIGWINCH); |