1#!/bin/sh 2 3# 4# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org> 5# All rights reserved. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26# SUCH DAMAGE. 27# 28# $FreeBSD$ 29# 30 31# Test scenario by marcus@freebsd.org 32 33[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 34 35. ../default.cfg 36 37odir=`pwd` 38cd /tmp 39sed '1,/^EOF/d' < $odir/$0 > kinfo.c 40cc -o kinfo -Wall kinfo.c -lutil 41rm -f kinfo.c 42 43mount | grep -q procfs || mount -t procfs procfs /procfs 44for i in `jot 30`; do 45 for j in `jot 5`; do 46 /tmp/kinfo & 47 done 48 49 for j in `jot 5`; do 50 wait 51 done 52done 53 54rm -f /tmp/kinfo 55exit 56EOF 57 58#include <sys/types.h> 59#include <stdio.h> 60#include <stdlib.h> 61#include <unistd.h> 62#include <sys/sysctl.h> 63#include <sys/param.h> 64#include <sys/user.h> 65#include <sys/signal.h> 66#include <fcntl.h> 67#include <err.h> 68#include <strings.h> 69#include <sys/wait.h> 70#include <libutil.h> 71 72char buf[8096]; 73 74void 75handler(int i) { 76 exit(0); 77} 78 79/* Stir /dev/proc */ 80int 81churning(void) { 82 pid_t r; 83 int fd, status; 84 85 for (;;) { 86 r = fork(); 87 if (r == 0) { 88 if ((fd = open("/proc/curproc/mem", O_RDONLY)) == -1) 89 err(1, "open(/proc/curproc/mem)"); 90 bzero(buf, sizeof(buf)); 91 exit(0); 92 } 93 if (r < 0) { 94 perror("fork"); 95 exit(2); 96 } 97 wait(&status); 98 } 99} 100 101/* Get files for each proc */ 102void 103list(void) 104{ 105 struct kinfo_file *freep; 106 struct kinfo_vmentry *freep_vm; 107 long i; 108 int cnt, name[4]; 109 struct kinfo_proc *kipp; 110 size_t len; 111 112 name[0] = CTL_KERN; 113 name[1] = KERN_PROC; 114 name[2] = KERN_PROC_PROC; 115 116 len = 0; 117 if (sysctl(name, 3, NULL, &len, NULL, 0) < 0) 118 err(-1, "sysctl: kern.proc.all"); 119 120 kipp = malloc(len); 121 if (kipp == NULL) 122 err(1, "malloc"); 123 124 if (sysctl(name, 3, kipp, &len, NULL, 0) < 0) { 125 free(kipp); 126// warn("sysctl: kern.proc.all"); 127 return; 128 } 129 130 for (i = 0; i < len / sizeof(*kipp); i++) { 131 132 /* The test starts here */ 133 freep = kinfo_getfile(kipp[i].ki_pid, &cnt); 134 free(freep); 135 136 freep_vm = kinfo_getvmmap(kipp[i].ki_pid, &cnt); 137 free(freep_vm); 138 /* End test */ 139 } 140 free(kipp); 141} 142 143int 144main(int argc, char **argv) 145{ 146 pid_t r; 147 signal(SIGALRM, handler); 148 alarm(60); 149 150 if ((r = fork()) == 0) { 151 alarm(60); 152 for (;;) 153 churning(); 154 } 155 if (r < 0) { 156 perror("fork"); 157 exit(2); 158 } 159 160 for (;;) 161 list(); 162 163 return (0); 164} 165