nsxiv09b04d7
Revise waiting for child processes
+20 −6
1 file changed
- M main.c +20 −6
| @@ -219,7 +219,6 @@ void close_info(void) | |||
| 219 | 219 | kill(info.pid, SIGTERM); | |
| 220 | 220 | close(info.fd); | |
| 221 | 221 | info.fd = -1; | |
| 222 | − | waitpid(info.pid, NULL, WNOHANG); | |
| 223 | 222 | } | |
| 224 | 223 | } | |
| 225 | 224 | ||
| @@ -468,7 +467,7 @@ void run_key_handler(const char *key, unsigned int mask) | |||
| 468 | 467 | FILE *pfs; | |
| 469 | 468 | bool marked = mode == MODE_THUMB && markcnt > 0; | |
| 470 | 469 | bool changed = false; | |
| 471 | − | int f, i, pfd[2], status; | |
| 470 | + | int f, i, pfd[2]; | |
| 472 | 471 | int fcnt = marked ? markcnt : 1; | |
| 473 | 472 | char kstr[32]; | |
| 474 | 473 | struct stat *oldst, st; | |
| @@ -526,9 +525,7 @@ void run_key_handler(const char *key, unsigned int mask) | |||
| 526 | 525 | } | |
| 527 | 526 | } | |
| 528 | 527 | 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); | |
| 532 | 529 | ||
| 533 | 530 | for (f = i = 0; f < fcnt; i++) { | |
| 534 | 531 | if ((marked && (files[i].flags & FF_MARK)) || (!marked && i == fileidx)) { | |
| @@ -788,6 +785,22 @@ int fncmp(const void *a, const void *b) | |||
| 788 | 785 | return strcoll(((fileinfo_t*) a)->name, ((fileinfo_t*) b)->name); | |
| 789 | 786 | } | |
| 790 | 787 | ||
| 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 | + | ||
| 791 | 804 | int main(int argc, char **argv) | |
| 792 | 805 | { | |
| 793 | 806 | int i, start; | |
| @@ -798,7 +811,8 @@ int main(int argc, char **argv) | |||
| 798 | 811 | struct stat fstats; | |
| 799 | 812 | r_dir_t dir; | |
| 800 | 813 | ||
| 801 | − | signal(SIGPIPE, SIG_IGN); | |
| 814 | + | setup_signal(SIGCHLD, sigchld); | |
| 815 | + | setup_signal(SIGPIPE, SIG_IGN); | |
| 802 | 816 | ||
| 803 | 817 | setlocale(LC_COLLATE, ""); | |
| 804 | 818 | ||