From 7072ced8274274cd1b0fa085dd4118462e03884e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 8 Apr 2010 03:22:25 +0200 Subject: manager: print process name for all SIGCHLD received --- manager.c | 11 ++++++++--- util.c | 27 +++++++++++++++++++++++++++ util.h | 4 ++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/manager.c b/manager.c index 7adaa4ed0b..9e4fbbbaed 100644 --- a/manager.c +++ b/manager.c @@ -1414,8 +1414,6 @@ unsigned manager_dispatch_dbus_queue(Manager *m) { static int manager_dispatch_sigchld(Manager *m) { assert(m); - log_debug("dispatching SIGCHLD"); - for (;;) { siginfo_t si; Unit *u; @@ -1469,9 +1467,16 @@ static int manager_process_signal_fd(Manager *m, bool *quit) { switch (sfsi.ssi_signo) { - case SIGCHLD: + case SIGCHLD: { + char *name = NULL; + + get_process_name(sfsi.ssi_pid, &name); + log_debug("Got SIGCHLD for process %llu (%s)", (unsigned long long) sfsi.ssi_pid, strna(name)); + free(name); + sigchld = true; break; + } case SIGINT: case SIGTERM: diff --git a/util.c b/util.c index 69a26a2d08..b4d6eefbd2 100644 --- a/util.c +++ b/util.c @@ -438,6 +438,33 @@ finish: return r; } +char *truncate_nl(char *s) { + assert(s); + + s[strcspn(s, NEWLINE)] = 0; + return s; +} + +int get_process_name(pid_t pid, char **name) { + char *p; + int r; + + assert(pid >= 1); + assert(name); + + if (asprintf(&p, "/proc/%llu/comm", (unsigned long long) pid) < 0) + return -ENOMEM; + + r = read_one_line_file(p, name); + free(p); + + if (r < 0) + return r; + + truncate_nl(*name); + return 0; +} + char *strappend(const char *s, const char *suffix) { size_t a, b; char *r; diff --git a/util.h b/util.h index 14f1a7a177..30a0616d54 100644 --- a/util.h +++ b/util.h @@ -39,6 +39,7 @@ typedef uint64_t usec_t; /* What is interpreted as whitespace? */ #define WHITESPACE " \t\n\r" +#define NEWLINE "\n\r" usec_t now(clockid_t clock); @@ -130,10 +131,13 @@ int reset_all_signal_handlers(void); char *strstrip(char *s); char *delete_chars(char *s, const char *bad); +char *truncate_nl(char *s); char *file_in_same_dir(const char *path, const char *filename); int mkdir_parents(const char *path, mode_t mode); +int get_process_name(pid_t pid, char **name); + char hexchar(int x); int unhexchar(char c); char octchar(int x); -- cgit v1.2.3-54-g00ecf