PARA_EMERG_LOG("failed to ignore SIGPIPE\n");
exit(EXIT_FAILURE);
}
- if (signal(SIGUSR1, SIG_IGN) == SIG_ERR) {
- PARA_EMERG_LOG("failed to ignore SIGUSR1\n");
- exit(EXIT_FAILURE);
- }
st->fd = para_signal_init();
PARA_INFO_LOG("signal pipe: fd %d\n", st->fd);
para_install_sighandler(SIGINT);
goto err;
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
goto err;
- if (signal(SIGUSR1, SIG_IGN) == SIG_ERR)
- goto err;
add_close_on_fork_list(st->fd);
register_task(&st->task);
return;
daemonize();
PARA_NOTICE_LOG("initializing audio format handlers\n");
afh_init();
+
+ /*
+ * Although afs uses its own signal handling we must ignore SIGUSR1
+ * _before_ the afs child process gets born by init_afs() below. It's
+ * racy to do this in the child because the parent might send SIGUSR1
+ * before the child gets a chance to ignore this signal -- only the
+ * good die young.
+ */
+ if (signal(SIGUSR1, SIG_IGN) == SIG_ERR) {
+ PARA_EMERG_LOG("failed to ignore SIGUSR1\n");
+ exit(EXIT_FAILURE);
+ }
PARA_NOTICE_LOG("initializing the audio file selector\n");
afs_socket = init_afs();
init_signal_task();