From 8db8d1dc9f11aa7995b2f77bb938f2585005413c Mon Sep 17 00:00:00 2001 From: David Goulet Date: Mon, 23 Jan 2012 14:12:46 -0500 Subject: [PATCH] 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 --- src/bin/lttng-sessiond/main.c | 2 +- src/bin/lttng/lttng.c | 25 +++++++++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) 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"); -- 2.34.1