summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak2011-02-28 17:15:40 +0100
committerKarel Zak2011-02-28 17:15:40 +0100
commita1504d8bf5239c451c3f4e8ab95e312bb60be4e8 (patch)
treed56ee267d29109628a5826f03299b87c52999ee7
parentkill: translate "-l <num>" to RT<n> (diff)
downloadkernel-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.ac1
-rw-r--r--misc-utils/Makefile.am2
-rw-r--r--misc-utils/kill.113
-rw-r--r--misc-utils/kill.c28
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;