Montag, 10. Februar 2014

Using BSD process accounting to list the memory usage

Sometimes the memory usage of a program is of interest. The following program can be used to list the memory usage reported by the BSD process accounting.
#include <stdio.h>
#include <string.h>
#include <sys/acct.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

#define STR(I) #I

int main(int argc, char **argv)
{
  char debian_default[] = "/var/log/account/pacct";
  char usage[] = "Usage: acctmem accounting-file\n";
  char *file;

  if (argc == 2) {
    if (argv[1][0] == '-' && argv[1][1] == 'h') {
      fprintf (stderr, "%s", usage);
      return 0;
    } else {
      file = argv[1];
    }
  }
  else {
    file = debian_default;
  }
  printf ("Using %s\n", file);

  int fd = open (file, O_RDONLY);
  if (fd < 0) {
    perror ("Can not open file");
    return 1;
  }

  struct acct_v3 entry;
  for (;;) {
    ssize_t bytes = read (fd, &entry, sizeof entry);
    if (bytes < 0) {
      perror("Can not read file");
      return 1;
    }
    if (bytes == sizeof entry)
      printf ("%6u: %-" STR(ACCT_COMM) "s(%3u): %uk\n",
       entry.ac_uid,
       (char*)&(entry.ac_comm),
       entry.ac_exitcode,
       entry.ac_mem);
    else
      break;
  }
  return 0;
}
// Local Variables:
// compile-command: "gcc -o acctmem acctmem.c"
// End:

Keine Kommentare: