diff options
author | sef <sef@FreeBSD.org> | 1997-12-06 04:19:09 +0000 |
---|---|---|
committer | sef <sef@FreeBSD.org> | 1997-12-06 04:19:09 +0000 |
commit | 54294bb9abc37dd4230c358d71249ed8cd8e20de (patch) | |
tree | aa47cc68bb9c593cb1979d766ffab21595c0db4d /usr.sbin/procctl | |
parent | c7d273eccbdbad69eed3ca880a3956ca804a83c8 (diff) | |
download | FreeBSD-src-54294bb9abc37dd4230c358d71249ed8cd8e20de.zip FreeBSD-src-54294bb9abc37dd4230c358d71249ed8cd8e20de.tar.gz |
First checkin of the procctl program.
Diffstat (limited to 'usr.sbin/procctl')
-rw-r--r-- | usr.sbin/procctl/Makefile | 5 | ||||
-rw-r--r-- | usr.sbin/procctl/procctl.8 | 29 | ||||
-rw-r--r-- | usr.sbin/procctl/procctl.c | 55 |
3 files changed, 89 insertions, 0 deletions
diff --git a/usr.sbin/procctl/Makefile b/usr.sbin/procctl/Makefile new file mode 100644 index 0000000..ceb3df3 --- /dev/null +++ b/usr.sbin/procctl/Makefile @@ -0,0 +1,5 @@ +PROG= procctl +LDFLAGS += -static + +.include <bsd.prog.mk> + diff --git a/usr.sbin/procctl/procctl.8 b/usr.sbin/procctl/procctl.8 new file mode 100644 index 0000000..8af32da --- /dev/null +++ b/usr.sbin/procctl/procctl.8 @@ -0,0 +1,29 @@ +.Dd Nov 23, 1997 +.Dt PROCCTL 1 +.Os FreeBSD +.Sh NAME +.Nm \&procctl +.Nd clear procfs event flags +.Sh Synopsis +.Nm \&procctl +.Ar command +.Ar [...] +.Sh DESCRIPTION +.Nm \&procctl +clears the +.Xr procfs 5 +event mask used by +.Xr truss 1 . +This can be used in the event that a process is left stranded, since +the +.Xr procfs 5 +events result in a non-killable process. +The options are a list of process ID's; +.Nm \&procctl +goes through the list and clears the event masks for each specified process. +.Xr truss 1 , +.Xr procfs 5 +.Sh HISTORY +The +.Nm procctl +command was written by Sean Eric Fagan for FreeBSD. diff --git a/usr.sbin/procctl/procctl.c b/usr.sbin/procctl/procctl.c new file mode 100644 index 0000000..2578c47 --- /dev/null +++ b/usr.sbin/procctl/procctl.c @@ -0,0 +1,55 @@ +/* + * procctl -- clear the event mask, and continue, any specified processes. + * This is largely an example of how to use the procfs interface; however, + * for now, it is also sometimes necessary, as a stopped process will not + * otherwise continue. (This will be fixed in a later version of the + * procfs code, almost certainly; however, this program will still be useful + * for some annoying circumstances.) + */ +/* + * $Id$ + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <err.h> +#include <signal.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <sys/pioctl.h> + +main(int ac, char **av) { + int fd; + int i; + unsigned int mask; + char **command; + struct procfs_status pfs; + + for (i = 1; i < ac; i++) { + char buf[32]; + + sprintf(buf, "/proc/%s/mem", av[i]); + fd = open(buf, O_RDWR); + if (fd == -1) { + if (errno == ENOENT) + continue; + fprintf(stderr, "%s: cannot open pid %s: %s\n", + av[0], av[i], strerror(errno)); + continue; + } + mask = ~0; + if (ioctl(fd, PIOCBIC, &mask) == -1) { + fprintf(stderr, "%s: cannot clear process %s's event mask: %s\n", + av[0], av[i], strerror(errno)); + } + mask = 0; + if (ioctl(fd, PIOCCONT, &mask) == -1 && errno != EINVAL) { + fprintf(stderr, "%s: cannot continue process %s: %s\n", + av[0], av[i], strerror(errno)); + } + close(fd); + } + return 0; +} |