/proc/*

[戻る]

概要

任意のプロセスのプロセス情報を得たかったので、/proc/にあるファイルに目を付けた。
/proc/にはプロセス番号と同じファイル名のファイルがある。ここは普通のファイルシステムじゃなくてprocというファイルシステム。

プロセスの生成時刻

プロセスが生成された時刻が欲しかったので、/proc/にあるファイルが生成された時刻をその代わりにしようと思う。これは以下の関数で実現できる。

#include <string.h>
#include <sys/stat.h>

time_t proc_time(pid_t pid)
{
  char  proc[16];
  struct stat	statbuf;

  strcpy(proc, "/proc/");
  sprintf(&proc[strlen(proc)], "%05d", (short)pid);
  stat(proc, &statbuf);

  return statbuf.st_ctime;
}
statbufのst_ctimeは正確には最後にステータスが変更された時刻。statbufには他に、st_atime(最後にアクセスされた時刻)、st_mtime(最後に更新された時刻)がある。

プロセスの名前

/proc/*を読むとプロセスの情報がいろいろわかる。
例えば、以下の関数でプロセスの名前が取り出せる。

#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/procfs.h>

char *proc_name(pid_t pid)
{
  int   fd;
  char  proc[16], *name;
  prpsinfo_t    procinfo;

  strcpy(proc, "/proc/");
  sprintf(&proc[strlen(proc)], "%05d", (short)pid);
  fd = open(proc, O_RDONLY);
  ioctl(fd, PIOCPSINFO, &procinfo);
  close(fd);

  name = malloc(strlen(procinfo.pr_fname)+1);
  strcpy(name, procinfo.pr_fname);

  return name;
}
prpsinfo_tについてはsys/procfs.hに構造が記述されている。


Copyright © 1998 by Jun Takahashi