プロセスID

読み:プロセス・アイディー
外語:PID: process ID 英語
品詞:名詞

プロセスを識別するために使われる、一意の番号のこと。PID、プロセス識別子とも。以下、PIDとする。

目次

PIDは、waitpid()やkill()、あるいはsigsend()といったシステムコール引数であり、ある特定のプロセスに対して何らかの処理を要求する場合、そのプロセスの特定のために使われる。

但し、あるプロセスから特定の他のプロセスのPIDを得る方法はなく、このためプロセスは、必要に応じてプロセスIDを書いたファイルを用意する。例えば、syslogdなら「/var/run/syslogd.pid」、httpdなら「/var/run/httpd.pid」、といった具合である。なお、このパス名は環境依存であり、OSによっては異なる場所に置かれる場合がある。

取得方法

UNIXfork(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のサイズに応じて名前が得られる。

用語の所属
PID
関連する用語
プロセス
親プロセス
子プロセス
生まれる
生む
寝る
pid_t

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club