First checkin of the procctl program.

This commit is contained in:
Sean Eric Fagan 1997-12-06 04:19:09 +00:00
parent 2a024a2b05
commit c430992a81
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=31565
6 changed files with 178 additions and 0 deletions

5
bin/procctl/Makefile Normal file
View File

@ -0,0 +1,5 @@
PROG= procctl
LDFLAGS += -static
.include <bsd.prog.mk>

29
bin/procctl/procctl.1 Normal file
View File

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

55
bin/procctl/procctl.c Normal file
View File

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

View File

@ -0,0 +1,5 @@
PROG= procctl
LDFLAGS += -static
.include <bsd.prog.mk>

View File

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

View File

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