Check signals first in the loop
Signals need to be checked first in the loop to catch any that were delivered between setting up the signals handlers and entering the loop, i.e. in the time it takes to initially start each of the services.
This commit is contained in:
parent
7769a4f6e9
commit
da4ccb18f4
50
daemon.c
50
daemon.c
@ -321,6 +321,31 @@ int main(int argc, char *argv[]) {
|
||||
sigset_t mask;
|
||||
sigemptyset(&mask);
|
||||
for (;;) {
|
||||
if (signals[SIGCHLD]) {
|
||||
int status;
|
||||
pid_t pid;
|
||||
while (0 < (pid = waitpid(-1, &status, WNOHANG))) {
|
||||
serviceReap(pid, status);
|
||||
}
|
||||
if (pid < 0 && errno != ECHILD) syslog(LOG_WARNING, "waitpid: %m");
|
||||
setTitle();
|
||||
signals[SIGCHLD] = 0;
|
||||
}
|
||||
|
||||
if (signals[SIGINT] || signals[SIGTERM]) {
|
||||
break;
|
||||
}
|
||||
if (signals[SIGHUP]) {
|
||||
parseConfig(configPath);
|
||||
setTitle();
|
||||
signals[SIGHUP] = 0;
|
||||
}
|
||||
if (signals[SIGINFO]) {
|
||||
char command[] = "status *";
|
||||
parseControl(command);
|
||||
signals[SIGINFO] = 0;
|
||||
}
|
||||
|
||||
struct pollfd fds[1 + 2 * services.len];
|
||||
fds[0].fd = fifo;
|
||||
fds[0].events = POLLIN;
|
||||
@ -393,31 +418,6 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
setTitle();
|
||||
}
|
||||
|
||||
if (signals[SIGCHLD]) {
|
||||
int status;
|
||||
pid_t pid;
|
||||
while (0 < (pid = waitpid(-1, &status, WNOHANG))) {
|
||||
serviceReap(pid, status);
|
||||
}
|
||||
if (pid < 0 && errno != ECHILD) syslog(LOG_WARNING, "waitpid: %m");
|
||||
setTitle();
|
||||
signals[SIGCHLD] = 0;
|
||||
}
|
||||
|
||||
if (signals[SIGINT] || signals[SIGTERM]) {
|
||||
break;
|
||||
}
|
||||
if (signals[SIGHUP]) {
|
||||
parseConfig(configPath);
|
||||
setTitle();
|
||||
signals[SIGHUP] = 0;
|
||||
}
|
||||
if (signals[SIGINFO]) {
|
||||
char command[] = "status *";
|
||||
parseControl(command);
|
||||
signals[SIGINFO] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
close(fifo);
|
||||
|
Loading…
Reference in New Issue
Block a user