Krolyxon
Commit 09b04d7

Branches

Refs →

nsxiv09b04d7

Revise waiting for child processes

Author
Bert Münnich
Date
2018-02-18 14:32 +0100
Committer
Bert Münnich · 2018-02-18 14:51 +0100
Parent
762420c
Commit
09b04d7aefc55112b3994c30236010750fbec369

+20 −6

1 file changed

  1. M main.c +20 −6
M main.c View
@@ -219,7 +219,6 @@ void close_info(void)
219219 kill(info.pid, SIGTERM);
220220 close(info.fd);
221221 info.fd = -1;
222− waitpid(info.pid, NULL, WNOHANG);
223222 }
224223 }
225224
@@ -468,7 +467,7 @@ void run_key_handler(const char *key, unsigned int mask)
468467 FILE *pfs;
469468 bool marked = mode == MODE_THUMB && markcnt > 0;
470469 bool changed = false;
471− int f, i, pfd[2], status;
470+ int f, i, pfd[2];
472471 int fcnt = marked ? markcnt : 1;
473472 char kstr[32];
474473 struct stat *oldst, st;
@@ -526,9 +525,7 @@ void run_key_handler(const char *key, unsigned int mask)
526525 }
527526 }
528527 fclose(pfs);
529− waitpid(pid, &status, 0);
530− if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
531− error(0, 0, "%s: Exited abnormally", keyhandler.f.cmd);
528+ while (waitpid(pid, NULL, 0) == -1 && errno == EINTR);
532529
533530 for (f = i = 0; f < fcnt; i++) {
534531 if ((marked && (files[i].flags & FF_MARK)) || (!marked && i == fileidx)) {
@@ -788,6 +785,22 @@ int fncmp(const void *a, const void *b)
788785 return strcoll(((fileinfo_t*) a)->name, ((fileinfo_t*) b)->name);
789786 }
790787
788+void sigchld(int sig)
789+{
790+ while (waitpid(-1, NULL, WNOHANG) > 0);
791+}
792+
793+void setup_signal(int sig, void (*handler)(int sig))
794+{
795+ struct sigaction sa;
796+
797+ sa.sa_handler = handler;
798+ sigemptyset(&sa.sa_mask);
799+ sa.sa_flags = SA_RESTART | SA_NOCLDSTOP;
800+ if (sigaction(sig, &sa, 0) == -1)
801+ error(EXIT_FAILURE, errno, "signal %d", sig);
802+}
803+
791804 int main(int argc, char **argv)
792805 {
793806 int i, start;
@@ -798,7 +811,8 @@ int main(int argc, char **argv)
798811 struct stat fstats;
799812 r_dir_t dir;
800813
801− signal(SIGPIPE, SIG_IGN);
814+ setup_signal(SIGCHLD, sigchld);
815+ setup_signal(SIGPIPE, SIG_IGN);
802816
803817 setlocale(LC_COLLATE, "");
804818