|
|
1.1 root 1: static char _version[]="kill version 2.0";
2: /*
3: * kill -- send a signal to a process
4: */
5: #include <signal.h>
6: #include <ctype.h>
7: #include <errno.h>
8: #include <stdio.h>
9:
10: #define NOTREACHED return
11:
12: int err = 0;
13:
14: main( argc, argv)
15: register char **argv;
16: {
17: register pid;
18: char **getsignal( );
19: extern char *sys_errlist[];
20: extern errno;
21: static int sig = SIGTERM;
22:
23: /*
24: * Fetch the signal we are going to send, from the command line.
25: */
26: argv = getsignal(argv, &sig);
27:
28:
29: if (*argv == NULL) {
30: fprintf(stderr, "Usage: kill [ signal ] pid ...\n");
31: exit(1);
32: }
33:
34: /*
35: * If we are sending this signal to our own process group
36: * leader, we don't want to receive this signal here.
37: */
38: signal(sig, SIG_IGN);
39:
40:
41: do {
42: if (isdigit(**argv)==0 && **argv!='-') {
43: error("\"%s\" is not a process id", *argv);
44: continue;
45: }
46: pid = atoi(*argv);
47: if (kill(pid, sig)) {
48: if (errno == EINVAL)
49: fatal("signal %d is invalid", sig);
50: error("process %d: %s", pid, sys_errlist[errno]);
51: continue;
52: }
53: } while (*++argv);
54: exit(err);
55: }
56:
57:
58: /*
59: * Attempt to extract a signal number from argv[].
60: * Puts any signal number it finds in *sigp, and then returns
61: * the next argument in argv[].
62: */
63: char **
64: getsignal( av, sigp)
65: register char **av;
66: int *sigp;
67: {
68: if ((++av)[0] == NULL)
69: return (av);
70: if (isdigit( av[0][0]))
71: return (av);
72: /*
73: * Do we have an explicit signal number?
74: */
75: if (av[0][0] == '-') {
76: ++av[0]; /* Skip the '-'. */
77: if (isdigit( av[0][0])) {
78: /*
79: * Convert the signal number to an integer and return.
80: */
81: *sigp = atoi( &av[0][0]);
82: return (++av);
83: }
84: }
85:
86: /*
87: * The signal must be symbolic.
88: */
89: uppercase( av[0]);
90: /*
91: * Strip off an optional leading "SIG".
92: */
93: if (strncmp( av[0], "SIG", 3) == 0)
94: *av += 3;
95: /*
96: * Walk through the signal names looking for a match.
97: */
98: for (*sigp = 1; notsame( *sigp, av[0]); ++*sigp) {
99: /* Do nothing. */
100: }
101:
102: /*
103: * Bump argv to next argument.
104: */
105: return (++av);
106: }
107:
108:
109: /*
110: * Returns 0 only if 'sig' has symbolic name 'name'.
111: */
112: notsame(sig, name)
113: char *name;
114: {
115: static char *names[] = {
116: #ifdef _I386
117: 0,
118: "HUP", "INT", "QUIT", "ILL",
119: "TRAP", "IOT", "EMT", "FPE",
120: "KILL", "BUS", "SEGV", "SYS",
121: "PIPE", "ALRM", "TERM", "USR1",
122: "USR2", "CHLD", "PWR", "WINCH",
123: "", "POLL",
124: NULL
125: #else /* _I386 */
126: 0,
127: "HUP", "INT", "QUIT", "ALRM",
128: "TERM", "REST", "SYS", "PIPE",
129: "KILL", "TRAP", "SEGV", "ILL",
130: "IOT", "EMT", "FPE", "BUS",
131: NULL
132: #endif /* _I386 */
133: };
134:
135: if (sig>NSIG || names[sig]==NULL) {
136: fatal( "no such signal SIG%s", name);
137: }
138:
139: #ifdef _I386
140: /*
141: * SIGABRT and SIGCLD share numbers with other signals.
142: */
143: if ( SIGABRT == sig ) {
144: if ( 0 == strcmp( "ABRT", name ) ) {
145: return (0); /* Match! */
146: }
147: }
148: if ( SIGCLD == sig ) {
149: if ( 0 == strcmp( "CLD", name ) ) {
150: return (0); /* Match! */
151: }
152: }
153: #endif /* _I386 */
154:
155: return (strcmp( names[sig], name));
156: }
157:
158:
159: uppercase(s)
160: register char *s;
161: {
162: for (; *s; ++s)
163: if (islower( *s))
164: *s &= ~040;
165: }
166:
167:
168: error(arg0)
169: char *arg0;
170: {
171: fprintf( stderr, "kill: %r\n", &arg0);
172: err = 1;
173: }
174:
175:
176: fatal(arg0)
177: char *arg0;
178: {
179: fprintf( stderr, "kill: %r\n", &arg0);
180: exit(1);
181: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.