diff options
author | Karel Zak | 2011-02-28 17:15:40 +0100 |
---|---|---|
committer | Karel Zak | 2011-02-28 17:15:40 +0100 |
commit | a1504d8bf5239c451c3f4e8ab95e312bb60be4e8 (patch) | |
tree | d56ee267d29109628a5826f03299b87c52999ee7 | |
parent | kill: translate "-l <num>" to RT<n> (diff) | |
download | kernel-qcow2-util-linux-a1504d8bf5239c451c3f4e8ab95e312bb60be4e8.tar.gz kernel-qcow2-util-linux-a1504d8bf5239c451c3f4e8ab95e312bb60be4e8.tar.xz kernel-qcow2-util-linux-a1504d8bf5239c451c3f4e8ab95e312bb60be4e8.zip |
kill: add -q sigval to use sigqueue(2)
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | misc-utils/Makefile.am | 2 | ||||
-rw-r--r-- | misc-utils/kill.1 | 13 | ||||
-rw-r--r-- | misc-utils/kill.c | 28 |
4 files changed, 42 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac index 7b5ffff18..93ff0699e 100644 --- a/configure.ac +++ b/configure.ac @@ -195,6 +195,7 @@ AC_CHECK_FUNCS( getdtablesize \ getexecname \ getrlimit \ + sigqueue \ srandom \ setresgid \ setresuid \ diff --git a/misc-utils/Makefile.am b/misc-utils/Makefile.am index 3bae64860..f58831765 100644 --- a/misc-utils/Makefile.am +++ b/misc-utils/Makefile.am @@ -120,7 +120,7 @@ endif if BUILD_KILL bin_PROGRAMS += kill -kill_SOURCES = kill.c procs.c kill.h +kill_SOURCES = kill.c procs.c kill.h $(top_srcdir)/lib/strutils.c dist_man_MANS += kill.1 endif diff --git a/misc-utils/kill.1 b/misc-utils/kill.1 index 4591f4408..fad706ab5 100644 --- a/misc-utils/kill.1 +++ b/misc-utils/kill.1 @@ -8,6 +8,8 @@ kill \- terminate a process .B kill .RB [ \-s .IR signal | \fB\-p\fP ] +.RB [ \-q +.IR sigval ] .RN [ \-a ] .RB [ \-\- ] .IR pid ... @@ -84,6 +86,17 @@ Specify that .B kill should only print the process id (pid) of the named processes, and not send any signals. +.TP +.BI \-q " sigval" +Use +.BR sigqueue (2) +rather than +.BR kill (2) +and the sigval argument is used to specify an integer to be sent with the +signal. If the receiving process has installed a handler for this signal using +the SA_SIGINFO flag to +.BR sigaction (2), +then it can obtain this data via the si_value field of the siginfo_t structure. .SH "SEE ALSO" .BR bash (1), .BR tcsh (1), diff --git a/misc-utils/kill.c b/misc-utils/kill.c index f2f4e3737..ab0fb6a98 100644 --- a/misc-utils/kill.c +++ b/misc-utils/kill.c @@ -53,6 +53,7 @@ #include "c.h" #include "kill.h" #include "nls.h" +#include "strutils.h" struct signv { char *name; @@ -152,6 +153,11 @@ extern int *get_pids (char *, int); static char *progname; +#ifdef HAVE_SIGQUEUE +static int use_sigval; +static union sigval sigdata; +#endif + int main (int argc, char *argv[]) { int errors, numsig, pid; @@ -231,6 +237,17 @@ int main (int argc, char *argv[]) } continue; } + if (! strcmp (arg, "-q")) { + if (argc < 2) + return usage (1); + argc--, argv++; + arg = *argv; +#ifdef HAVE_SIGQUEUE + sigdata.sival_int = strtol_or_err(arg, _("failed to parse sigval")); + use_sigval = 1; +#endif + continue; + } /* `arg' begins with a dash but is not a known option. so it's probably something like -HUP, or -1/-n try to deal with it. @@ -403,11 +420,20 @@ int usage (int status) int kill_verbose (char *procname, int pid, int sig) { + int rc; + if (sig < 0) { printf ("%d\n", pid); return 0; } - if (kill (pid, sig) < 0) { +#ifdef HAVE_SIGQUEUE + if (use_sigval) + rc = sigqueue(pid, sig, sigdata); + else +#endif + rc = kill (pid, sig); + + if (rc < 0) { fprintf (stderr, "%s ", progname); perror (procname); return 1; |