This is sample.c in view mode; [Download] [Up]
#include <stdio.h> #include <nlist.h> #include <mach/machine/vm_types.h> #include <sys/types.h> #include <sys/socket.h> #include <net/if.h> #include <sys/file.h> #include <sys/param.h> #include <sys/dk.h> #define KERNEL #include <sys/time.h> #undef KERNEL #include <sys/kernel.h> #include <sys/vmmeter.h> #include <sys/vmsystm.h> #include <mach/vm_statistics.h> #define peek(index,value) \ do {if (lseek(kmem, (index), L_SET) != (off_t) (index)) {fprintf(stderr, "vmstat: cannot seek in /dev/kmem\n"); exit(1);} \ if (read(kmem, &(value), sizeof(value)) != sizeof(value)) {fprintf(stderr, "vmstat: cannot read from /dev/kmem\n"); exit(1);}} while (0) struct nlist nl[] = { {{"_avenrun"}, 0, 0, 0, 0}, #define X_AVENRUN 0 {{"_boottime"}, 0, 0, 0, 0}, #define X_BOOTTIME 1 {{"_cnt"}, 0, 0, 0, 0}, #define X_CNT 2 {{"_cp_time"}, 0, 0, 0, 0}, #define X_CP_TIME 3 {{"_deficit"}, 0, 0, 0, 0}, #define X_DEFICIT 4 {{"_dk_ndrive"}, 0, 0, 0, 0}, #define X_DK_NDRIVE 5 {{"_dk_time"}, 0, 0, 0, 0}, #define X_DK_TIME 6 {{"_dk_seek"}, 0, 0, 0, 0}, #define X_DK_SEEK 7 {{"_dk_xfer"}, 0, 0, 0, 0}, #define X_DK_XFER 8 {{"_dk_wds"}, 0, 0, 0, 0}, #define X_DK_WDS 9 {{"_dk_bps"}, 0, 0, 0, 0}, #define X_DK_BPS 10 {{"_domainname"}, 0, 0, 0, 0}, #define X_DOMAINNAME 11 {{"_domainnamelen"}, 0, 0, 0, 0}, #define X_DOMAINNAMELEN 12 {{"_forkstat"}, 0, 0, 0, 0}, #define X_FORKSTAT 13 {{"_freemem"}, 0, 0, 0, 0}, #define X_FREEMEM 14 {{"_hostname"}, 0, 0, 0, 0}, #define X_HOSTNAME 15 {{"_hostnamelen"}, 0, 0, 0, 0}, #define X_HOSTNAMELEN 16 {{"_hz"}, 0, 0, 0, 0}, #define X_HZ 17 {{"_ifnet"}, 0, 0, 0, 0}, #define X_IFNET 18 {{"_mach_factor"}, 0, 0, 0, 0}, #define X_MACH_FACTOR 19 {{"_mem_size"}, 0, 0, 0, 0}, #define X_MEM_SIZE 20 {{"_nproc"}, 0, 0, 0, 0}, #define X_NPROC 21 {{"_rate"}, 0, 0, 0, 0}, #define X_RATE 22 {{"_sum"}, 0, 0, 0, 0}, #define X_SUM 23 {{"_total"}, 0, 0, 0, 0}, #define X_TOTAL 24 {{"_vm_stat"}, 0, 0, 0, 0}, #define X_VM_STAT 25 {{""}, 0, 0, 0, 0} }; main() { int kmem; int i; char line[128]; struct ifnet ifnet; char hostname[MAXHOSTNAMELEN]; int hostnamelen; char domainname[32]; int domainnamelen; struct timeval boottime; int hz; long avenrun[3]; int nproc; long mach_factor[3]; long cp_time[CPUSTATES]; struct vmmeter cnt; struct vmmeter rate; struct vmmeter sum; struct vmtotal total; struct forkstat forkstat; vm_size_t mem_size; int freemem; int deficit; struct vm_statistics vm_stat; int dk_ndrive; long dk_time[DK_NDRIVE]; long dk_seek[DK_NDRIVE]; long dk_xfer[DK_NDRIVE]; long dk_wds[DK_NDRIVE]; long dk_bps[DK_NDRIVE]; struct ifnet *ifnetp; if (nlist("/mach", nl)< 0) { fprintf(stderr, "vmstat: cannot nlist /vmunix\n"); exit(1); } for (i = 0; *nl[i].n_un.n_name; i++) printf("nlist entry {%s, 0x%x, 0x%x, %d, 0x%x}\n", nl[i].n_un.n_name, nl[i].n_type, nl[i].n_sect, nl[i].n_desc, nl[i].n_value); printf("\n"); if ((kmem = open("/dev/kmem", O_RDONLY)) < 0) { fprintf(stderr, "vmstat: cannot open /dev/kmem\n"); exit(1); } peek(nl[X_HOSTNAME].n_value, hostname); peek(nl[X_HOSTNAMELEN].n_value, hostnamelen); peek(nl[X_DOMAINNAME].n_value, domainname); peek(nl[X_DOMAINNAMELEN].n_value, domainnamelen); peek(nl[X_BOOTTIME].n_value, boottime); peek(nl[X_HZ].n_value, hz); peek(nl[X_AVENRUN].n_value, avenrun); peek(nl[X_NPROC].n_value, nproc); peek(nl[X_MACH_FACTOR].n_value, mach_factor); peek(nl[X_CP_TIME].n_value, cp_time); peek(nl[X_CNT].n_value, cnt); peek(nl[X_RATE].n_value, rate); peek(nl[X_SUM].n_value, sum); peek(nl[X_TOTAL].n_value, total); peek(nl[X_FORKSTAT].n_value, forkstat); peek(nl[X_MEM_SIZE].n_value, mem_size); peek(nl[X_FREEMEM].n_value, freemem); peek(nl[X_DEFICIT].n_value, deficit); peek(nl[X_VM_STAT].n_value, vm_stat); peek(nl[X_DK_NDRIVE].n_value, dk_ndrive); peek(nl[X_DK_TIME].n_value, dk_time); peek(nl[X_DK_SEEK].n_value, dk_seek); peek(nl[X_DK_XFER].n_value, dk_xfer); peek(nl[X_DK_WDS].n_value, dk_wds); peek(nl[X_DK_BPS].n_value, dk_bps); peek(nl[X_IFNET].n_value, ifnetp); printf("hostname \"%.*s\", domainname \"%.*s\"\n", hostnamelen, hostname, domainnamelen, domainname); printf("values returned by struct timeval boottime\n"); printf(" %ld %ld %s", boottime.tv_sec, boottime.tv_usec, ctime(&boottime.tv_sec)); printf("value returned by int hz\n"); printf(" %d\n", hz); printf("values returned by long avenrun[3]\n"); printf(" %ld %ld %ld\n", avenrun[0], avenrun[1], avenrun[2]); printf("value returned by int nproc\n"); printf(" %d\n", nproc); printf("values returned by long mach_factor[3]\n"); printf(" %ld %ld %ld\n", mach_factor[0], mach_factor[1], mach_factor[2]); printf("values returned by long cp_time[%d]\n", CPUSTATES); for (i = 0; i < CPUSTATES; i++) printf(" %ld", cp_time[i]); printf("\n"); printf("values returned by struct vmmeter cnt\n"); printf(" context switches %u\n", cnt.v_swtch); printf(" calls to trap %u\n", cnt.v_trap); printf(" calls to syscall() %u\n", cnt.v_syscall); printf(" device interrupts %u\n", cnt.v_intr); printf(" software interrupts %u\n", cnt.v_soft); printf(" pseudo-dma interrupts %u\n", cnt.v_pdma); printf(" pages swapped in %u\n", cnt.v_pswpin); printf(" pages swapped out %u\n", cnt.v_pswpout); printf(" pageins %u\n", cnt.v_pgin); printf(" pageouts %u\n", cnt.v_pgout); printf(" pages paged in %u\n", cnt.v_pgpgin); printf(" pages paged out %u\n", cnt.v_pgpgout); printf(" intransit blocking page faults %u\n", cnt.v_intrans); printf(" total page reclaims %u\n", cnt.v_pgrec); printf(" found in free list rather than on swapdev %u\n", cnt.v_xsfrec); printf(" found in free list rather than in filsys %u\n", cnt.v_xifrec); printf(" pages filled on demand from executables %u\n", cnt.v_exfod); printf(" pages zero filled on demand %u\n", cnt.v_zfod); printf(" fills of pages mapped by vread() %u\n", cnt.v_vrfod); printf(" number of exfod's created %u\n", cnt.v_nexfod); printf(" number of zfod's created %u\n", cnt.v_nzfod); printf(" number of vrfod's created %u\n", cnt.v_nvrfod); printf(" page reclaims from free list %u\n", cnt.v_pgfrec); printf(" total faults taken %u\n", cnt.v_faults); printf(" scans in page out daemon %u\n", cnt.v_scan); printf(" revolutions of the hand %u\n", cnt.v_rev); printf(" pages taken from sequential programs %u\n", cnt.v_seqfree); printf(" pages freed by daemon %u\n", cnt.v_dfree); printf(" fast reclaims in locore %u\n", cnt.v_fastpgrec); printf(" swapins %u\n", cnt.v_swpin); printf(" swapouts %u\n", cnt.v_swpout); printf("values returned by struct vmmeter rate\n"); printf(" context switches %u\n", rate.v_swtch); printf(" calls to trap %u\n", rate.v_trap); printf(" calls to syscall() %u\n", rate.v_syscall); printf(" device interrupts %u\n", rate.v_intr); printf(" software interrupts %u\n", rate.v_soft); printf(" pseudo-dma interrupts %u\n", rate.v_pdma); printf(" pages swapped in %u\n", rate.v_pswpin); printf(" pages swapped out %u\n", rate.v_pswpout); printf(" pageins %u\n", rate.v_pgin); printf(" pageouts %u\n", rate.v_pgout); printf(" pages paged in %u\n", rate.v_pgpgin); printf(" pages paged out %u\n", rate.v_pgpgout); printf(" intransit blocking page faults %u\n", rate.v_intrans); printf(" total page reclaims %u\n", rate.v_pgrec); printf(" found in free list rather than on swapdev %u\n", rate.v_xsfrec); printf(" found in free list rather than in filsys %u\n", rate.v_xifrec); printf(" pages filled on demand from executables %u\n", rate.v_exfod); printf(" pages zero filled on demand %u\n", rate.v_zfod); printf(" fills of pages mapped by vread() %u\n", rate.v_vrfod); printf(" number of exfod's created %u\n", rate.v_nexfod); printf(" number of zfod's created %u\n", rate.v_nzfod); printf(" number of vrfod's created %u\n", rate.v_nvrfod); printf(" page reclaims from free list %u\n", rate.v_pgfrec); printf(" total faults taken %u\n", rate.v_faults); printf(" scans in page out daemon %u\n", rate.v_scan); printf(" revolutions of the hand %u\n", rate.v_rev); printf(" pages taken from sequential programs %u\n", rate.v_seqfree); printf(" pages freed by daemon %u\n", rate.v_dfree); printf(" fast reclaims in locore %u\n", rate.v_fastpgrec); printf(" swapins %u\n", rate.v_swpin); printf(" swapouts %u\n", rate.v_swpout); printf("values returned by struct vmmeter sum\n"); printf(" context switches %u\n", sum.v_swtch); printf(" calls to trap %u\n", sum.v_trap); printf(" calls to syscall() %u\n", sum.v_syscall); printf(" device interrupts %u\n", sum.v_intr); printf(" software interrupts %u\n", sum.v_soft); printf(" pseudo-dma interrupts %u\n", sum.v_pdma); printf(" pages swapped in %u\n", sum.v_pswpin); printf(" pages swapped out %u\n", sum.v_pswpout); printf(" pageins %u\n", sum.v_pgin); printf(" pageouts %u\n", sum.v_pgout); printf(" pages paged in %u\n", sum.v_pgpgin); printf(" pages paged out %u\n", sum.v_pgpgout); printf(" intransit blocking page faults %u\n", sum.v_intrans); printf(" total page reclaims %u\n", sum.v_pgrec); printf(" found in free list rather than on swapdev %u\n", sum.v_xsfrec); printf(" found in free list rather than in filsys %u\n", sum.v_xifrec); printf(" pages filled on demand from executables %u\n", sum.v_exfod); printf(" pages zero filled on demand %u\n", sum.v_zfod); printf(" fills of pages mapped by vread() %u\n", sum.v_vrfod); printf(" number of exfod's created %u\n", sum.v_nexfod); printf(" number of zfod's created %u\n", sum.v_nzfod); printf(" number of vrfod's created %u\n", sum.v_nvrfod); printf(" page reclaims from free list %u\n", sum.v_pgfrec); printf(" total faults taken %u\n", sum.v_faults); printf(" scans in page out daemon %u\n", sum.v_scan); printf(" revolutions of the hand %u\n", sum.v_rev); printf(" pages taken from sequential programs %u\n", sum.v_seqfree); printf(" pages freed by daemon %u\n", sum.v_dfree); printf(" fast reclaims in locore %u\n", sum.v_fastpgrec); printf(" swapins %u\n", sum.v_swpin); printf(" swapouts %u\n", sum.v_swpout); printf("values returned by struct vmtotal total\n"); printf(" length of the run queue %d\n", total.t_rq); printf(" jobs in ``disk wait'' (neg priority) %d\n", total.t_dw); printf(" jobs in page wait %d\n", total.t_pw); printf(" jobs sleeping in core %d\n", total.t_sl); printf(" swapped out runnable/short block jobs %d\n", total.t_sw); printf(" total virtual memory %ld\n", total.t_vm); printf(" active virtual memory %ld\n", total.t_avm); printf(" total real memory in use %ld\n", total.t_rm); printf(" active real memory %ld\n", total.t_arm); printf(" virtual memory used by text %ld\n", total.t_vmtxt); printf(" active virtual memory used by text %ld\n", total.t_avmtxt); printf(" real memory used by text %ld\n", total.t_rmtxt); printf(" active real memory used by text %ld\n", total.t_armtxt); printf(" free memory pages %ld\n", total.t_free); printf("values returned by struct forkstat forkstat\n"); printf(" number of forks %d\n", forkstat.cntfork); printf(" number of vforks %d\n", forkstat.cntvfork); printf(" size of forks %d\n", forkstat.sizfork); printf(" size of vforks %d\n", forkstat.sizvfork); printf("value returned by vm_size_t mem_size\n"); printf(" %u\n", mem_size); printf("value returned by int freemem\n"); printf(" %d\n", freemem); printf("value returned by int deficit\n"); printf(" %d\n", deficit); printf("values returned by struct vm_statistics vm_stat\n"); printf(" page size in bytes %ld\n", vm_stat.pagesize); printf(" number of pages free %ld\n", vm_stat.free_count); printf(" number of pages active %ld\n", vm_stat.active_count); printf(" number of pages inactive %ld\n", vm_stat.inactive_count); printf(" number of pages wired down %ld\n", vm_stat.wire_count); printf(" number of zero fill pages %ld\n", vm_stat.zero_fill_count); printf(" number of pages reactivated %ld\n", vm_stat.reactivations); printf(" number of pageins %ld\n", vm_stat.pageins); printf(" number of pageouts %ld\n", vm_stat.pageouts); printf(" number of page faults %ld\n", vm_stat.faults); printf(" number of copy-on-write faults %ld\n", vm_stat.cow_faults); printf(" number of object cache lookups %ld\n", vm_stat.lookups); printf(" number of object cache hits %ld\n", vm_stat.hits); printf("values returned by long dk_time[%d]\n", dk_ndrive); for (i = 0; i < dk_ndrive; i++) printf(" %ld", dk_time[i]); printf("\n"); printf("values returned by long dk_seek[%d]\n", dk_ndrive); for (i = 0; i < dk_ndrive; i++) printf(" %ld", dk_seek[i]); printf("\n"); printf("values returned by long dk_xfer[%d]\n", dk_ndrive); for (i = 0; i < dk_ndrive; i++) printf(" %ld", dk_xfer[i]); printf("\n"); printf("values returned by long dk_wds[%d]\n", dk_ndrive); for (i = 0; i < dk_ndrive; i++) printf(" %ld", dk_wds[i]); printf("\n"); printf("values returned by long dk_bps[%d]\n", dk_ndrive); for (i = 0; i < dk_ndrive; i++) printf(" %ld", dk_bps[i]); printf("\n"); printf("values returned by struct ifnet *ifnet\n"); for (i = 1; ifnetp; ifnetp = ifnet.if_next, i++) { peek(ifnetp, ifnet); peek(ifnet.if_name, line); printf(" name \"%s\"\n", line); printf(" sub-unit for lower level driver %d\n", ifnet.if_unit); printf(" maximum transmission unit %d\n", ifnet.if_mtu); printf(" flags 0x%x\n", ifnet.if_flags); /* printf(" time until watchdog called %d\n", ifnet.if_timer); */ printf(" routing metric %d\n", ifnet.if_metric); printf(" packets received on interface %d\n", ifnet.if_ipackets); printf(" input errors on interface %d\n", ifnet.if_ierrors); printf(" packets sent on interface %d\n", ifnet.if_opackets); printf(" output errors on interface %d\n", ifnet.if_oerrors); printf(" collisions on interface %d\n", ifnet.if_collisions); } close(kmem); exit(0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.