From: David Goulet Date: Mon, 23 Jan 2012 19:12:46 +0000 (-0500) Subject: Change SIGCHLD to SIGUSR1 when lttng waiting on sessiond X-Git-Tag: v2.0-pre18~2 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=8db8d1dc9f11aa7995b2f77bb938f2585005413c;p=lttng-tools.git Change SIGCHLD to SIGUSR1 when lttng waiting on sessiond Using lttng cli, if the session daemon dies after exec(), a SIGCHLD is returned. It was catched but not handled to cleanly quit and inform the user that the session daemon failed. We now use SIGUSR1 to signal the lttng cli that the session daemon is ready to receive command. Signed-off-by: David Goulet --- diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index 886456a0c..7da0b7c68 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -3541,7 +3541,7 @@ static void *thread_manage_clients(void *data) * Notify parent pid that we are ready to accept command for client side. */ if (opt_sig_parent) { - kill(ppid, SIGCHLD); + kill(ppid, SIGUSR1); } while (1) { diff --git a/src/bin/lttng/lttng.c b/src/bin/lttng/lttng.c index 2ee93253f..7058dd529 100644 --- a/src/bin/lttng/lttng.c +++ b/src/bin/lttng/lttng.c @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include #include @@ -37,6 +39,7 @@ int opt_quiet; int opt_verbose; static int opt_no_sessiond; static char *opt_sessiond_path; +static pid_t sessiond_pid; enum { OPT_SESSION_PATH, @@ -168,14 +171,23 @@ static void clean_exit(int code) */ static void sighandler(int sig) { + int status; + switch (sig) { case SIGTERM: DBG("SIGTERM caugth"); clean_exit(EXIT_FAILURE); break; case SIGCHLD: - /* Notify is done */ DBG("SIGCHLD caugth"); + waitpid(sessiond_pid, &status, 0); + /* Indicate that the session daemon died */ + sessiond_pid = 0; + ERR("Session daemon died (exit status %d)", WEXITSTATUS(status)); + break; + case SIGUSR1: + /* Notify is done */ + DBG("SIGUSR1 caugth"); break; default: DBG("Unknown signal %d caugth", sig); @@ -204,7 +216,7 @@ static int set_signal_handler(void) sa.sa_handler = sighandler; sa.sa_mask = sigset; sa.sa_flags = 0; - if ((ret = sigaction(SIGCHLD, &sa, NULL)) < 0) { + if ((ret = sigaction(SIGUSR1, &sa, NULL)) < 0) { perror("sigaction"); goto end; } @@ -214,6 +226,11 @@ static int set_signal_handler(void) goto end; } + if ((ret = sigaction(SIGCHLD, &sa, NULL)) < 0) { + perror("sigaction"); + goto end; + } + end: return ret; } @@ -296,8 +313,12 @@ static int spawn_sessiond(char *pathname) kill(getppid(), SIGTERM); /* unpause parent */ exit(EXIT_FAILURE); } else if (pid > 0) { + sessiond_pid = pid; /* Wait for lttng-sessiond to start */ pause(); + if (!sessiond_pid) { + exit(EXIT_FAILURE); + } goto end; } else { perror("fork");