diff options
Diffstat (limited to 'bin/kill')
| -rw-r--r-- | bin/kill/Makefile | 5 | ||||
| -rw-r--r-- | bin/kill/kill.1 | 132 | ||||
| -rw-r--r-- | bin/kill/kill.c | 224 |
3 files changed, 361 insertions, 0 deletions
diff --git a/bin/kill/Makefile b/bin/kill/Makefile new file mode 100644 index 000000000000..a42e4caebcdd --- /dev/null +++ b/bin/kill/Makefile @@ -0,0 +1,5 @@ +# @(#)Makefile 5.2 (Berkeley) 5/11/90 + +PROG= kill + +.include <bsd.prog.mk> diff --git a/bin/kill/kill.1 b/bin/kill/kill.1 new file mode 100644 index 000000000000..e61eb2f1bb93 --- /dev/null +++ b/bin/kill/kill.1 @@ -0,0 +1,132 @@ +.\" Copyright (c) 1980, 1990 The Regents of the University of California. +.\" All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" the Institute of Electrical and Electronics Engineers, Inc. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)kill.1 6.8 (Berkeley) 7/27/91 +.\" +.Dd July 27, 1991 +.Dt KILL 1 +.Os +.Sh NAME +.Nm kill +.Nd terminate or signal a process +.Sh SYNOPSIS +.Nm kill +.Op Fl s Ar signal_name +.Ar pid +\&... +.Nm kill +.Fl l +.Op Ar exit_status +.Nm kill +.Op Fl signal_name +.Ar pid +\&... +.Nm kill +.Op Fl signal_number +.Ar pid +\&... +.Sh DESCRIPTION +The kill utility sends the +.Dv TERM +signal to the processes specified +by the pid operand(s). +.Pp +Only the super-user may send signals to other users' processes. +.Pp +The options are as follows: +.Pp +.Bl -tag -width Ds +.It Fl l Op Ar exit_status +If no operand is given, list the signal names; otherwise, write +the signal name corresponding to +.Ar exit_status . +.It Fl s Ar signal_name +A symbolic signal name specifying the signal to be sent instead of the +default +.Dv TERM . +.It Fl signal_name +A symbolic signal name specifying the signal to be sent instead of the +default +.Dv TERM . +.It Fl signal_number +A non-negative decimal integer, specifying the signal to be sent instead +of the default +.Dv TERM . +.El +.Pp +Some of the more commonly used signals: +.Bd -ragged -offset indent -compact +.Bl -column XXX TERM +.It 1 HUP (hang up) +.It 2 INT (interupt) +.It 3 QUIT (quit) +.It 6 ABRT (abort) +.It 9 KILL (non-catchable, non-ignorable kill) +.It 14 ALRM (alarm clock) +.It 15 TERM (software termination signal) +.El +.Ed +.Pp +.Nm Kill +is a built-in to +.Xr csh 1 ; +it allows job specifiers of the form ``%...'' as arguments +so process id's are not as often used as +.Nm kill +arguments. +See +.Xr csh 1 +for details. +.Sh SEE ALSO +.Xr csh 1 , +.Xr ps 1 , +.Xr kill 2 , +.Xr sigvec 2 +.Sh STANDARDS +The +.Nm kill +function is expected to be +.St -p1003.2 +compatible. +.Sh HISTORY +A +.Nm kill +command appeared in +.At v6 . +.Sh BUGS +A replacement for the command +.Dq Li kill 0 +for +.Xr csh 1 +users should be provided. diff --git a/bin/kill/kill.c b/bin/kill/kill.c new file mode 100644 index 000000000000..705b5fce8d48 --- /dev/null +++ b/bin/kill/kill.c @@ -0,0 +1,224 @@ +/* + * Copyright (c) 1988 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +char copyright[] = +"@(#) Copyright (c) 1988 Regents of the University of California.\n\ + All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +static char sccsid[] = "@(#)kill.c 5.3 (Berkeley) 7/1/91"; +#endif /* not lint */ + +#include <signal.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + +static char *signals[] = { + "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", /* 1 - 6 */ + "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", /* 7 - 12 */ + "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP", /* 13 - 18 */ + "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", /* 19 - 24 */ + "XFSZ", "VTALRM", "PROF", "WINCH", "INFO", "USR1", /* 25 - 30 */ + "USR2", NULL, /* 31 - 32 */ +}; + +main(argc, argv) + int argc; + char **argv; +{ + register int errors, numsig, pid; + register char **p; + char *ep; + + if (argc < 2) + usage(); + + numsig = SIGTERM; + argc--, argv++; + if (strcmp(*argv, "-l") == 0) { + if (argc > 2) { + usage (); + /* NOTREACHED */ + } + if (argc == 2) { + argv++; + if (isdigit(**argv)) { + numsig = strtol(*argv, &ep, 10); + if (*argv && !*ep) { + if (numsig > 0 && numsig < NSIG) { + printsig (numsig); + exit (0); + } + + numsig -= 128; + if (numsig > 0 && numsig < NSIG) { + printsig (numsig); + exit (0); + } + } + (void)fprintf(stderr, + "kill: illegal signal number %s\n", *argv); + exit(1); + } + usage (); + /* NOTREACHED */ + } + printsignals(stdout); + exit(0); + } else if (strcmp(*argv, "-s") == 0) { + if (argc < 2) { + (void)fprintf(stderr, + "kill: option requires an argument -- s\n"); + usage(); + } + argc--,argv++; + if (strcmp (*argv, "0") == 0) { + numsig = 0; + } else { + if ((numsig = signame_to_signum (*argv)) < 0) { + nosig(*argv); + /* NOTREACHED */ + } + } + argc--,argv++; + } else if (**argv == '-') { + ++*argv; + if (isalpha(**argv)) { + if ((numsig = signame_to_signum (*argv)) < 0) { + nosig(*argv); + /* NOTREACHED */ + } + } else if (isdigit(**argv)) { + numsig = strtol(*argv, &ep, 10); + if (!*argv || *ep) { + (void)fprintf(stderr, + "kill: illegal signal number %s\n", *argv); + exit(1); + } + if (numsig <= 0 || numsig >= NSIG) { + nosig(*argv); + /* NOTREACHED */ + } + } else + nosig(*argv); + argc--,argv++; + } + + if (!*argv) + usage(); + + for (errors = 0; *argv; ++argv) { + pid = strtol(*argv, &ep, 10); + if (!*argv || *ep) { + (void)fprintf(stderr, + "kill: illegal process id %s\n", *argv); + continue; + } + if (kill(pid, numsig) == -1) { + (void)fprintf(stderr, + "kill: %s: %s\n", *argv, strerror(errno)); + errors = 1; + } + } + exit(errors); +} + +int +signame_to_signum (sig) + char *sig; +{ + char **p; + + if (!strncasecmp(sig, "sig", 3)) + sig += 3; + for (p = signals; *p; ++p) { + if (!strcasecmp(*p, sig)) { + return p - signals + 1; + } + } + return -1; +} + +nosig(name) + char *name; +{ + (void)fprintf(stderr, + "kill: unknown signal %s; valid signals:\n", name); + printsignals(stderr); + exit(1); +} + +printsig(sig) + int sig; +{ + printf ("%s\n", signals[sig - 1]); +} + +printsignals(fp) + FILE *fp; +{ + register char **p = signals;; + + /* From POSIX 1003.2, Draft 11.2: + When the -l option is specified, the symbolic name of each + signal shall be written in the following format: + "%s%c", <signal_name>, <separator> + where the <signal_name> is in uppercase, without the SIG prefix, + and the <separator> shall either be a <newline> or a <space>. + For the last signal written, <separator> shall be a <newline> */ + + /* This looses if the signals array is empty; But, since it + will "never happen", there is no need to add wrap this + in a conditional that will always succeed. */ + (void)fprintf(fp, "%s", *p); + + for (++p ; *p; ++p) { + (void)fprintf(fp, " %s", *p); + } + (void)fprintf(fp, "\n"); +} + +usage() +{ + (void)fprintf(stderr, "usage: kill [-s signal_name] pid ...\n"); + (void)fprintf(stderr, " kill -l [exit_status]\n"); + (void)fprintf(stderr, "obsolete usage:\n"); + (void)fprintf(stderr, " kill -signal_name pid ...\n"); + (void)fprintf(stderr, " kill -signal_number pid ...\n"); + exit(1); +} |
