任意のプロセスのプロセス情報を得たかったので、/proc/にあるファイルに目を付けた。
/proc/にはプロセス番号と同じファイル名のファイルがある。ここは普通のファイルシステムじゃなくてprocというファイルシステム。
プロセスが生成された時刻が欲しかったので、/proc/にあるファイルが生成された時刻をその代わりにしようと思う。これは以下の関数で実現できる。
statbufのst_ctimeは正確には最後にステータスが変更された時刻。statbufには他に、st_atime(最後にアクセスされた時刻)、st_mtime(最後に更新された時刻)がある。#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; }
/proc/*を読むとプロセスの情報がいろいろわかる。
例えば、以下の関数でプロセスの名前が取り出せる。
prpsinfo_tについてはsys/procfs.hに構造が記述されている。#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; }