/* Copyright 2004 (C) George Peter Staplin */
#include <stdio.h>
#include <stdlib.h>

/* kvm_openfiles */
#include <fcntl.h>
#include <kvm.h>

/* kvm_getproc2 */
#include <sys/param.h>
#include <sys/sysctl.h>

int main () {
 kvm_t *kd;
 char *errstr;
 int nprocs;
 struct kinfo_proc2 *procs;
 int i;

 kd = kvm_openfiles (NULL, NULL, NULL, KVM_NO_FILES, errstr);

 if (NULL == kd) {
  perror (errstr);
  return EXIT_FAILURE;
 }

 procs = kvm_getproc2 (kd, KERN_PROC_ALL, 0, sizeof (struct kinfo_proc2), &nprocs);

 /*
 See <sys/sysctl.h> for the kinfo_proc2 struct.
 */

 {
  struct kinfo_proc2 *proc;

  for (i = 0; i < nprocs; ++i) {
   proc = &(procs[i]);
   fprintf (stderr, "proc = %p. pid = %d.\n", proc, proc->p_pid);
  }
 }

 return EXIT_SUCCESS;
}
