diff --git a/examples/first.c b/examples/first.c index dceca97e..fb4226bc 100644 --- a/examples/first.c +++ b/examples/first.c @@ -309,12 +309,16 @@ main (int argc, char *argv []) glibtop_get_proc_signal (&data.proc_signal, pid); printf ("Proc_Signal PID %5d (0x%08lx): " - "%lu %lu %lu %lu\n", (int) pid, + "%lx %lx %lx %lx %lx %lx %lx %lx\n", (int) pid, (unsigned long) data.proc_signal.flags, - (unsigned long) data.proc_signal.signal, - (unsigned long) data.proc_signal.blocked, - (unsigned long) data.proc_signal.sigignore, - (unsigned long) data.proc_signal.sigcatch); + (unsigned long) data.proc_signal.signal [0], + (unsigned long) data.proc_signal.signal [1], + (unsigned long) data.proc_signal.blocked [0], + (unsigned long) data.proc_signal.blocked [1], + (unsigned long) data.proc_signal.sigignore [0], + (unsigned long) data.proc_signal.sigignore [1], + (unsigned long) data.proc_signal.sigcatch [0], + (unsigned long) data.proc_signal.sigcatch [1]); for (c = 0; c < PROFILE_COUNT; c++) glibtop_get_proc_kernel (&data.proc_kernel, pid); @@ -419,12 +423,17 @@ main (int argc, char *argv []) for (c = 0; c < PROFILE_COUNT; c++) glibtop_get_proc_signal (&data.proc_signal, ppid); - printf ("Proc_Signal PPID %5d (0x%08lx): %lu %lu %lu %lu\n", + printf ("Proc_Signal PPID %5d (0x%08lx): " + "%lx %lx %lx %lx %lx %lx %lx %lx\n", (int) ppid, (unsigned long) data.proc_signal.flags, - (unsigned long) data.proc_signal.signal, - (unsigned long) data.proc_signal.blocked, - (unsigned long) data.proc_signal.sigignore, - (unsigned long) data.proc_signal.sigcatch); + (unsigned long) data.proc_signal.signal [0], + (unsigned long) data.proc_signal.signal [1], + (unsigned long) data.proc_signal.blocked [0], + (unsigned long) data.proc_signal.blocked [1], + (unsigned long) data.proc_signal.sigignore [0], + (unsigned long) data.proc_signal.sigignore [1], + (unsigned long) data.proc_signal.sigcatch [0], + (unsigned long) data.proc_signal.sigcatch [1]); for (c = 0; c < PROFILE_COUNT; c++) glibtop_get_proc_kernel (&data.proc_kernel, ppid); @@ -530,12 +539,16 @@ main (int argc, char *argv []) glibtop_get_proc_signal (&data.proc_signal, 1); printf ("Proc_Signal INIT %5d (0x%08lx): " - "%lu %lu %lu %lu\n", 1, + "%lx %lx %lx %lx %lx %lx %lx %lx\n", 1, (unsigned long) data.proc_signal.flags, - (unsigned long) data.proc_signal.signal, - (unsigned long) data.proc_signal.blocked, - (unsigned long) data.proc_signal.sigignore, - (unsigned long) data.proc_signal.sigcatch); + (unsigned long) data.proc_signal.signal [0], + (unsigned long) data.proc_signal.signal [1], + (unsigned long) data.proc_signal.blocked [0], + (unsigned long) data.proc_signal.blocked [1], + (unsigned long) data.proc_signal.sigignore [0], + (unsigned long) data.proc_signal.sigignore [1], + (unsigned long) data.proc_signal.sigcatch [0], + (unsigned long) data.proc_signal.sigcatch [1]); for (c = 0; c < PROFILE_COUNT; c++) glibtop_get_proc_kernel (&data.proc_kernel, 1); diff --git a/examples/second.c b/examples/second.c index d081929e..d34ed563 100644 --- a/examples/second.c +++ b/examples/second.c @@ -116,12 +116,16 @@ output (pid_t pid) glibtop_get_proc_signal (&data.proc_signal, pid); printf ("Proc_Signal PID %5d (0x%08lx): " - "%lu %lu %lu %lu\n", (int) pid, + "%lx %lx %lx %lx %lx %lx %lx %lx\n", (int) pid, (unsigned long) data.proc_signal.flags, - (unsigned long) data.proc_signal.signal, - (unsigned long) data.proc_signal.blocked, - (unsigned long) data.proc_signal.sigignore, - (unsigned long) data.proc_signal.sigcatch); + (unsigned long) data.proc_signal.signal [0], + (unsigned long) data.proc_signal.signal [1], + (unsigned long) data.proc_signal.blocked [0], + (unsigned long) data.proc_signal.blocked [1], + (unsigned long) data.proc_signal.sigignore [0], + (unsigned long) data.proc_signal.sigignore [1], + (unsigned long) data.proc_signal.sigcatch [0], + (unsigned long) data.proc_signal.sigcatch [1]); glibtop_get_proc_kernel (&data.proc_kernel, pid); diff --git a/kernel/sysctl/libgtop.c b/kernel/sysctl/libgtop.c index 401fd883..d770f8a3 100644 --- a/kernel/sysctl/libgtop.c +++ b/kernel/sysctl/libgtop.c @@ -58,6 +58,7 @@ static libgtop_proc_state_t libgtop_proc_state; static libgtop_proc_kernel_t libgtop_proc_kernel; static libgtop_proc_segment_t libgtop_proc_segment; static libgtop_proc_mem_t libgtop_proc_mem; +static libgtop_proc_signal_t libgtop_proc_signal; static ctl_table libgtop_table[]; static ctl_table libgtop_root_table[] = { @@ -89,6 +90,8 @@ ctl_table libgtop_table[] = { sizeof (libgtop_proc_segment), 0444, NULL, NULL, &proc_ctl_handler}, {LIBGTOP_PROC_MEM, NULL, &libgtop_proc_mem, sizeof (libgtop_proc_mem), 0444, NULL, NULL, &proc_ctl_handler}, + {LIBGTOP_PROC_SIGNAL, NULL, &libgtop_proc_signal, + sizeof (libgtop_proc_signal), 0444, NULL, NULL, &proc_ctl_handler}, {0} }; @@ -467,6 +470,48 @@ get_statm (struct task_struct *tsk, libgtop_proc_mem_t *proc_mem) proc_mem->dt = dt; } +static void +collect_sigign_sigcatch (struct task_struct *p, sigset_t *ign, + sigset_t *catch) +{ + struct k_sigaction *k; + int i; + + sigemptyset(ign); + sigemptyset(catch); + + if (p->sig) { + k = p->sig->action; + for (i = 1; i <= _NSIG; ++i, ++k) { + if (k->sa.sa_handler == SIG_IGN) + sigaddset(ign, i); + else if (k->sa.sa_handler != SIG_DFL) + sigaddset(catch, i); + } + } +} + +static void +task_sig (struct task_struct *p, libgtop_proc_signal_t *proc_signal) +{ + sigset_t ignore, catch; + int i, nsig; + + if (_NSIG_WORDS > LIBGTOP_NSIG) + nsig = LIBGTOP_NSIG; + else + nsig = _NSIG_WORDS; + + collect_sigign_sigcatch (p, &ignore, &catch); + + for (i = 0; i < nsig; i++) { + proc_signal->signal [i] = p->signal.sig [i]; + proc_signal->blocked [i] = p->blocked.sig [i]; + proc_signal->ignore [i] = ignore.sig [i]; + proc_signal->catch [i] = catch.sig [i]; + } +} + static int libgtop_sysctl (ctl_table *table, int nlen, int *name) { @@ -618,8 +663,11 @@ libgtop_sysctl_proc (ctl_table *table, int nlen, int *name, libgtop_proc_state_t *proc_state; libgtop_proc_kernel_t *proc_kernel; libgtop_proc_segment_t *proc_segment; + libgtop_proc_signal_t *proc_signal; libgtop_proc_mem_t *proc_mem; +#ifdef __SMP__ int i; +#endif switch (table->ctl_name) { case LIBGTOP_PROC_STATE: @@ -736,6 +784,12 @@ libgtop_sysctl_proc (ctl_table *table, int nlen, int *name, proc_mem->rss = tsk->mm->rss << PAGE_SHIFT; proc_mem->rlim = tsk->rlim ? tsk->rlim[RLIMIT_RSS].rlim_cur : 0; break; + case LIBGTOP_PROC_SIGNAL: + proc_signal = table->data; + memset (proc_signal, 0, sizeof (libgtop_proc_signal_t)); + + task_sig (tsk, proc_signal); + break; default: return -EINVAL; } diff --git a/kernel/sysctl/libgtop.h b/kernel/sysctl/libgtop.h index 2f7db28e..01867c96 100644 --- a/kernel/sysctl/libgtop.h +++ b/kernel/sysctl/libgtop.h @@ -14,7 +14,8 @@ enum { LIBGTOP_PROC_STATE, LIBGTOP_PROC_KERNEL, LIBGTOP_PROC_SEGMENT, - LIBGTOP_PROC_MEM + LIBGTOP_PROC_MEM, + LIBGTOP_PROC_SIGNAL }; enum { @@ -27,6 +28,8 @@ enum { LIBGTOP_PROCLIST_RUID }; +#define LIBGTOP_NSIG 4 + #define LIBGTOP_PROCLIST_MASK 15 #define LIBGTOP_EXCLUDE_IDLE 0x1000 @@ -44,6 +47,7 @@ typedef struct libgtop_proc_state libgtop_proc_state_t; typedef struct libgtop_proc_kernel libgtop_proc_kernel_t; typedef struct libgtop_proc_segment libgtop_proc_segment_t; typedef struct libgtop_proc_mem libgtop_proc_mem_t; +typedef struct libgtop_proc_signal libgtop_proc_signal_t; struct libgtop_cpu { @@ -138,4 +142,12 @@ struct libgtop_proc_mem unsigned long rss, rlim; }; +struct libgtop_proc_signal +{ + unsigned long signal [LIBGTOP_NSIG]; + unsigned long blocked [LIBGTOP_NSIG]; + unsigned long ignore [LIBGTOP_NSIG]; + unsigned long catch [LIBGTOP_NSIG]; +}; + #endif diff --git a/sysdeps/kernel/glibtop_private.h b/sysdeps/kernel/glibtop_private.h index b2f291ad..72a89413 100644 --- a/sysdeps/kernel/glibtop_private.h +++ b/sysdeps/kernel/glibtop_private.h @@ -35,22 +35,39 @@ BEGIN_LIBGTOP_DECLS -int glibtop_get_proc_data_stat_s (glibtop *server, libgtop_stat_t *stat); -int glibtop_get_proc_data_mem_s (glibtop *server, libgtop_mem_t *mem); -int glibtop_get_proc_data_swap_s (glibtop *server, libgtop_swap_t *swap); -int glibtop_get_proc_data_proclist_s (glibtop *server, - libgtop_proclist_t *proclist, - u_int64_t which, u_int64_t arg); -int glibtop_get_proc_data_proc_state_s (glibtop *server, - libgtop_proc_state_t *proc_state, - pid_t pid); -int glibtop_get_proc_data_proc_mem_s (glibtop *server, - libgtop_proc_mem_t *proc_mem, - pid_t pid); -int glibtop_get_proc_data_proc_kernel_s (glibtop *server, - libgtop_proc_kernel_t *proc_kernel, - pid_t pid); +int +glibtop_get_proc_data_stat_s (glibtop *server, libgtop_stat_t *stat); +int +glibtop_get_proc_data_mem_s (glibtop *server, libgtop_mem_t *mem); + +int +glibtop_get_proc_data_swap_s (glibtop *server, libgtop_swap_t *swap); + +int +glibtop_get_proc_data_proclist_s (glibtop *server, + libgtop_proclist_t *proclist, + u_int64_t which, u_int64_t arg); + +int +glibtop_get_proc_data_proc_state_s (glibtop *server, + libgtop_proc_state_t *proc_state, + pid_t pid); + +int +glibtop_get_proc_data_proc_mem_s (glibtop *server, + libgtop_proc_mem_t *proc_mem, + pid_t pid); + +int +glibtop_get_proc_data_proc_signal_s (glibtop *server, + libgtop_proc_signal_t *proc_signal, + pid_t pid); + +int +glibtop_get_proc_data_proc_kernel_s (glibtop *server, + libgtop_proc_kernel_t *proc_kernel, + pid_t pid); END_LIBGTOP_DECLS diff --git a/sysdeps/kernel/procdata.c b/sysdeps/kernel/procdata.c index 4307f23e..5eec0f98 100644 --- a/sysdeps/kernel/procdata.c +++ b/sysdeps/kernel/procdata.c @@ -115,6 +115,22 @@ glibtop_get_proc_data_proc_mem_s (glibtop *server, return 0; } +int +glibtop_get_proc_data_proc_signal_s (glibtop *server, + libgtop_proc_signal_t *proc_signal, + pid_t pid) +{ + int name [3] = { CTL_LIBGTOP, LIBGTOP_PROC_SIGNAL, pid }; + size_t size = sizeof (libgtop_proc_signal_t); + + if (sysctl (name, 3, proc_signal, &size, NULL, 0)) { + glibtop_warn_io_r (server, "sysctl (libgtop/proc_signal)"); + return -1; + } + + return 0; +} + int glibtop_get_proc_data_proc_kernel_s (glibtop *server, libgtop_proc_kernel_t *proc_kernel, diff --git a/sysdeps/kernel/procsignal.c b/sysdeps/kernel/procsignal.c index 540960f5..7c0f06b5 100644 --- a/sysdeps/kernel/procsignal.c +++ b/sysdeps/kernel/procsignal.c @@ -24,14 +24,20 @@ #include #include -static const unsigned long _glibtop_sysdeps_proc_signal = 0; +#include + +static const unsigned long _glibtop_sysdeps_proc_signal = +(1 << GLIBTOP_PROC_SIGNAL_SIGNAL) + +(1 << GLIBTOP_PROC_SIGNAL_BLOCKED) + +(1 << GLIBTOP_PROC_SIGNAL_SIGIGNORE) + +(1 << GLIBTOP_PROC_SIGNAL_SIGCATCH); /* Init function. */ void glibtop_init_proc_signal_s (glibtop *server) { - server->sysdeps.proc_signal = _glibtop_sysdeps_proc_signal; + server->sysdeps.proc_signal = _glibtop_sysdeps_proc_signal; } /* Provides detailed information about a process. */ @@ -40,5 +46,20 @@ void glibtop_get_proc_signal_s (glibtop *server, glibtop_proc_signal *buf, pid_t pid) { - memset (buf, 0, sizeof (glibtop_proc_signal)); + libgtop_proc_signal_t proc_signal; + int i; + + memset (buf, 0, sizeof (glibtop_proc_signal)); + + if (glibtop_get_proc_data_proc_signal_s (server, &proc_signal, pid)) + return; + + for (i = 0; i < 1; i++) { + buf->signal [i] = proc_signal.signal [i]; + buf->blocked [i] = proc_signal.blocked [i]; + buf->sigignore [i] = proc_signal.ignore [i]; + buf->sigcatch [i] = proc_signal.catch [i]; + } + + buf->flags = _glibtop_sysdeps_proc_signal; }