任意のプロセスのプロセス情報を得たかったので、/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に構造が記述されている。