diff options
Diffstat (limited to 'tools/regression/filemon/timed-forkb.c')
-rw-r--r-- | tools/regression/filemon/timed-forkb.c | 177 |
1 files changed, 0 insertions, 177 deletions
diff --git a/tools/regression/filemon/timed-forkb.c b/tools/regression/filemon/timed-forkb.c deleted file mode 100644 index b7a0221..0000000 --- a/tools/regression/filemon/timed-forkb.c +++ /dev/null @@ -1,177 +0,0 @@ -/*- - * Copyright (c) 2012 David O'Brien - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - * - * $FreeBSD$ - */ - -#include <sys/types.h> -#include <sys/resource.h> -#include <sys/sysctl.h> -#include <sys/wait.h> - -#include <unistd.h> -#include <stdlib.h> -#include <signal.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <time.h> -#include <err.h> -#include <assert.h> - -#ifndef SLEEP -#define SLEEP 20 /* seconds */ -#endif - -static int verbose; - -static void -usage(void) -{ - fprintf(stderr, "usage: %s\n", getprogname()); - fprintf(stderr, "\t\t-n : length of fork(2) chain\n"); - fprintf(stderr, "\t\t-t : limit run-time seconds\n"); - exit(1); - /* NOTREACHED */ -} - -void term(int); -void -term(int signum) -{ - - if (getpid() == getpgrp() || verbose) { - fprintf(stderr, - "pid %d pgroup %d (ppid %d): Received SIGTERM(%d), exiting...\n", - getpid(), getpgrp(), getppid(), signum); - } - exit(1); -} - -void angel_of_mercy(int); -void -angel_of_mercy(int sig __unused) -{ - - signal(SIGALRM, SIG_IGN); /* ignore this signal */ - printf("Master process: alarmed waking up\n"); - killpg(0, SIGTERM); - return; -} - -int bombing_run(unsigned, int); -int -bombing_run(unsigned chainlen, int stime) -{ - struct rusage ru; - pid_t pid, cpid; - int status; - - if (chainlen) { - switch (pid = fork()) { - case -1: - errx(1, "%s: can't fork", __func__); - - case 0: - /* This is the code the child runs. */ - bombing_run(--chainlen, stime); - break; - - default: - /* This is the code the parent runs. */ - if (getpid() == getpgrp()) { - signal(SIGALRM, angel_of_mercy); - alarm(stime); // time for bombing run... - cpid = wait4(pid, &status, 0, &ru); - alarm(0); - printf( - "Cleanly shutting down - pid %d pgroup %d (ppid %d)\n", - getpid(), getpgrp(), getppid()); - } else { - cpid = wait4(pid, &status, 0, &ru); - } - } - } - - return 0; -} - -int -main(int argc, char *argv[]) -{ - time_t start /*,tvec*/; - char *endptr, *ctm; - size_t len; - int nflag, tflag; - int ch, k, maxprocperuid; - - (void)signal(SIGTERM, term); - - nflag = 0; - tflag = SLEEP; - - start = time(NULL); - ctm = ctime(&start); - ctm[24] = '\0'; // see: man 3 ctime - fprintf(stderr, "*** fork() generation started on \"%s\" ***\n", ctm); - - while ((ch = getopt(argc, argv, "n:t:v")) != -1) - switch (ch) { - case 'n': - nflag = strtol(optarg, &endptr, 10); - if (nflag <= 0 || *endptr != '\0') - errx(1, "illegal number, -n argument -- %s", - optarg); - break; - case 't': - tflag = strtol(optarg, &endptr, 10); - if (tflag <= 0 || *endptr != '\0') - errx(1, "illegal number, -t argument -- %s", - optarg); - break; - case 'v': - ++verbose; - break; - default: - usage(); - } - argv += optind; - - if (!nflag) { - len = sizeof(maxprocperuid); - k = sysctlbyname("kern.maxprocperuid", &maxprocperuid, &len, - NULL, 0); - assert(k != ENOMEM); - /* Try to allow a shell to still be started. */ - nflag = maxprocperuid - 10; - } - - // Ensure a unique process group to make killing all children easier. - setpgrp(0,0); - printf(" pid %d pgroup %d (ppid %d), %d fork chain over %d sec\n", - getpid(), getpgrp(), getppid(), nflag - 1, tflag); - - return bombing_run(nflag, tflag); -} |