103 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* kill - send a signal to a process	Author: Adri Koppes  */
 | 
						|
 | 
						|
#include <sys/types.h>
 | 
						|
#include <errno.h>
 | 
						|
#include <signal.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
_PROTOTYPE(int main, (int argc, char **argv));
 | 
						|
_PROTOTYPE(void usage, (void));
 | 
						|
 | 
						|
/* Table of signal names. */
 | 
						|
struct signames {
 | 
						|
	char *name;
 | 
						|
	int sig;
 | 
						|
} signames[] = {
 | 
						|
	{ "HUP",	SIGHUP		},
 | 
						|
	{ "INT",	SIGINT		},
 | 
						|
	{ "QUIT",	SIGQUIT		},
 | 
						|
	{ "ILL",	SIGILL		},
 | 
						|
	{ "TRAP",	SIGTRAP		},
 | 
						|
	{ "ABRT",	SIGABRT		},
 | 
						|
	{ "IOT",	SIGIOT		},
 | 
						|
	{ "FPE",	SIGFPE		},
 | 
						|
	{ "KILL",	SIGKILL		},
 | 
						|
	{ "USR1",	SIGUSR1		},
 | 
						|
	{ "SEGV",	SIGSEGV		},
 | 
						|
	{ "USR2",	SIGUSR2		},
 | 
						|
	{ "PIPE",	SIGPIPE		},
 | 
						|
	{ "ALRM",	SIGALRM		},
 | 
						|
	{ "TERM",	SIGTERM		},
 | 
						|
	{ "EMT",	SIGEMT		},
 | 
						|
	{ "BUS",	SIGBUS		},
 | 
						|
	{ "CHLD",	SIGCHLD		},
 | 
						|
	{ "CONT",	SIGCONT		},
 | 
						|
	{ "STOP",	SIGSTOP		},
 | 
						|
	{ "TSTP",	SIGTSTP		},
 | 
						|
	{ "TTIN",	SIGTTIN		},
 | 
						|
	{ "TTOU",	SIGTTOU		},
 | 
						|
#ifdef SIGWINCH
 | 
						|
	{ "WINCH",	SIGWINCH	},
 | 
						|
#endif
 | 
						|
	{ "VTALRM",	SIGVTALRM	},
 | 
						|
	{ "PROF",	SIGPROF		},
 | 
						|
	{ NULL,		0		}
 | 
						|
};
 | 
						|
 | 
						|
int main(argc, argv)
 | 
						|
int argc;
 | 
						|
char **argv;
 | 
						|
{
 | 
						|
  pid_t proc;
 | 
						|
  int ex = 0, sig = SIGTERM;
 | 
						|
  char *end;
 | 
						|
  long l;
 | 
						|
  unsigned long ul;
 | 
						|
  struct sigaction sa;
 | 
						|
  int i, doit;
 | 
						|
  struct signames *snp;
 | 
						|
 | 
						|
  if (argc > 1 && argv[1][0] == '-') {
 | 
						|
	sig = -1;
 | 
						|
	for (snp = signames; snp->name != NULL; snp++) {	/* symbolic? */
 | 
						|
		if (strcmp(snp->name, argv[1] + 1) == 0) {
 | 
						|
			sig = snp->sig;
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if (sig < 0) {						/* numeric? */
 | 
						|
		ul = strtoul(argv[1] + 1, &end, 10);
 | 
						|
		if (end == argv[1] + 1 || *end != 0 || ul >= _NSIG) usage();
 | 
						|
		sig = ul;
 | 
						|
	}
 | 
						|
	argv++;
 | 
						|
	argc--;
 | 
						|
  }
 | 
						|
  sa.sa_flags = 0;
 | 
						|
  sigemptyset(&sa.sa_mask);
 | 
						|
  sa.sa_handler = SIG_IGN;		/* try not to kill yourself */
 | 
						|
  (void) sigaction(sig, &sa, (struct sigaction *) NULL);
 | 
						|
 | 
						|
  for (doit = 0; doit <= 1; doit++) {
 | 
						|
	for (i = 1; i < argc; i++) {
 | 
						|
		l = strtoul(argv[i], &end, 10);
 | 
						|
		if (end == argv[i] || *end != 0 || (pid_t) l != l) usage();
 | 
						|
		proc = l;
 | 
						|
		if (doit && kill(proc, sig) < 0) {
 | 
						|
			fprintf(stderr, "kill: %d: %s\n",
 | 
						|
				proc, strerror(errno));
 | 
						|
			ex = 1;
 | 
						|
		}
 | 
						|
	}
 | 
						|
  }
 | 
						|
  return(ex);
 | 
						|
}
 | 
						|
 | 
						|
void usage()
 | 
						|
{
 | 
						|
  fprintf(stderr, "Usage: kill [-sig] pid\n");
 | 
						|
  exit(1);
 | 
						|
}
 |