kill: add -q sigval to use sigqueue(2)

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2011-02-28 17:15:40 +01:00
parent 2713fc3ea7
commit a1504d8bf5
4 changed files with 42 additions and 2 deletions

View File

@ -195,6 +195,7 @@ AC_CHECK_FUNCS(
getdtablesize \
getexecname \
getrlimit \
sigqueue \
srandom \
setresgid \
setresuid \

View File

@ -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

View File

@ -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),

View File

@ -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;