プロセスID
読み:プロセス-アイディー
外語:PID: process ID
プロセスを識別するために使われる、一意の番号のこと。PID、プロセス識別子とも。以下、PIDとする。
概要
PIDは、waitpid()やkill()、あるいはsigsend()といったシステムコールの引数であり、ある特定のプロセスに対して何らかの処理を要求する場合、そのプロセスの特定のために使われる。
但し、あるプロセスから特定の他のプロセスのPIDを得る方法はなく、このためプロセスは、必要に応じてプロセスIDを書いたファイルを用意する。例えば、syslogdなら「/var/run/syslogd.pid」、httpdなら「/var/run/httpd.pid」、といった具合である。なお、このパス名は環境依存であり、OSによっては異なる場所に置かれる場合がある。
特徴
取得方法
UNIXでfork(2)システムコールを呼び出しすと、新たに生成された子プロセスのPIDが、fork(2)をした親プロセスに返される。
またUNIXの場合、自分のPIDはgetpid()で、親プロセスのPIDはgetppid()で、それぞれ随時取得できる。
C/C++では、PIDはpid_t型である。その大きさは実装依存だが、あるシステムでは、pid_t型はlong型のtypedefである。
番号範囲
UNIXでは、initプロセスがPID 1で、以降PIDはプロセスが生成されるたびに大きな値を作り、附番される。上限まで使われると、再び小さい番号に戻り、その中で空いている番号を順次つまみ食いしてゆくことになる。
上限はシステムによって異なるが、符号付きshortなら0〜32767までである。符号付きlongならより多くを扱えるが、例えばFreeBSDなら5桁の制限があり、つまり0〜99999までしか利用できない。
procfs
UNIXでは、procfsをマウントすると、プロセスの情報がファイルの形式で得られるようになる。
通常は、/procディレクトリ以下にマウントする。
PIDから名前を得る方法
pidを与えてプロセスの名前(psコマンドで出てくるname相当)を簡単に得る方法はない。
UNIXはそのようなAPIを用意していないため、汎用性の高い方法はない。
Linuxならばアプリケーションからprocfsにアクセスする方法が最も現実的で、PIDから名前を得る幾つかの方法は、次のとおりである。
- /proc/<PID>/status から、Name: フィールドを抽出する。
- /proc/<PID>/cmdline から抽出する (\0 区切りでargv[]相当の情報がある)
- /proc/<PID>/exe のシンボリックリンク先から判断する (要パーミッション)
この中で最も現実的なのはcmdlineから得る方法かと思われ、Linuxのpsコマンドや、Ubuntuなどの「システム・モニタ」といったソフトウェアは、この情報を表示しているようである。
実際の取得方法は、次の通り。あらかじめ、pid_t型の変数 pid に必要なPIDが入っているものとする。
char buf[32];
int fd;
snprintf(buf, sizeof buf, "/proc/%d/cmdline", pid);
fd = open(buf, O_RDONLY);
*buf = '\0';
if (fd) {
read(fd, buf, (sizeof buf) - 1);
buf[(sizeof buf) - 1] = '\0';
close(fd);
}
確保したbufのサイズに応じて名前が得られる。
再検索