Procfs

**procfs**は、Process Filesystem の略で、Unix系システムにある擬似ファイルシステム。主にプロセスに関するカーネル情報にアクセスする手段を提供する。procfs は実際のファイルシステムではないので、ディスクスペースを消費しないし、メモリもごくわずかしか消費しない。

通常、procfs は立ち上げ時に `/proc` ディレクトリにマウントされる。Solaris、BSD、Linux、AIX、QNXなどでサポートされ、特にLinuxではプロセス関連以外のデータにも拡張されている（AIXのprocfsはLinuxベース）。procfs は機能をカーネルモードからユーザーモードに移すことに重要な役割を果たしている。例えば GNUプロジェクト版の `ps`コマンドは全てのデータを procfs から得ており、特別なシステムコールを使用しない。

## 歴史
Tom J. Killian は Version 8 Unix 上に `/proc` を実装し、1984年6月、USENIXで *Processes as Files* という題の論文を発表した。これは、プロセスのトレースを行う *[[ptrace]]* システムコールを置き換える目的で設計された。

Roger Faulkner と Ron Gomes は V8 `/proc` を SVR4 に移植し、1991年1月、USENIX で *The Process File System and Process Model in UNIX System V* という論文を発表した。この procfs は `ps`コマンドの実装に使える程度の機能を有するようになったが、procfs内のファイルには `read()`、`write()`、`ioctl()` といったシステムコールしか使えなかった。

Plan 9で実装された procfs は V8 のものよりずっと進化していた。V8 の procfs では、あるプロセスに関する機能はひとつのファイルへの操作で実現されていた。Plan 9 は、それを複数のファイルに機能毎に分割し、procfs をよりファイルシステムらしくした。

4.4BSDで実装された procfs はプロセス毎のサブディレクトリがあり、プロセスのメモリ、レジスタ、現在ステータスにアクセスすることができた。Solaris 2.6 の procfs もプロセス毎のディレクトリがあり、制御用の *ctl* ファイルが用意され、トレースやプロセス毎の操作ができるようになっていた。

## Linux
Linux では、procfs は動作中プロセスに関する情報を `/proc/''[[プロセス識別子|PID]]''` というディレクトリで提供し、以下のような情報を提供する。

* `/proc/''PID''/cmdline` - そのプロセスを起動した際のコマンド行文字列
* `/proc/''PID''/cwd` - そのプロセスのカレントディレクトリへのシンボリックリンク
* `/proc/''PID''/environ` - そのプロセスの設定している環境変数とその中身
* `/proc/''PID''/exe` - 元々の実行ファイルへのシンボリックリンク（もしあれば。プロセスは元々の実行ファイルが削除/移動された後も動作し続けることがある）
* `/proc/''PID''/fd` - オープンしているファイル記述子に対応したシンボリックリンク群のあるディレクトリ
* `/proc/''PID''/fdinfo` - オープンしているファイル記述子に対応したファイルの位置やフラグを記したファイル群があるディレクトリ
* `/proc/''PID''/root` - そのプロセスにとってのルートディレクトリへのシンボリックリンク。通常は / だが、chrootしている場合は異なる。
* `/proc/''PID''/stat` - プロセスの状態についての情報（40個以上の値を含む。psコマンドはこのファイルから情報を得ている）
* `/proc/''PID''/status` - プロセスの動作状態やメモリ使用状況についての基本情報
* `/proc/''PID''/task` - そのプロセスを親プロセスとしている全プロセスへのハードリンクを格納したディレクトリ
* `/proc/''PID''/maps` - そのプロセスの仮想アドレス空間のマッピング状況（アドレス範囲とマッピングされているリソース）

特定のプロセスのPIDは、`[[pgrep]]`、`[[pidof]]`、`[[Ps (UNIX)|ps]]` といったユーティリティで得られる。


```bash
$ ls -l /proc/$(pgrep -n python)/fd        # 最近起動された `python' というプロセスの全ファイル識別子を一覧表示
samtala 0
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 0 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 1 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 2 -> /dev/pts/3
$ readlink /proc/$(pgrep -n python)/exe    # 最近起動された `python' というプロセスの実行ファイルのパス名を表示
/usr/bin/python3.1
```


procfs では個々のプロセスとは直接関係しないシステム情報も提供するが、Linuxカーネル 2.6 では大部分が別の擬似ファイルシステム *[[sysfs]]* に分離移動されている（`/sys` にマウントされる）。

* `/proc/acpi` または `/proc/apm` - パワーマネジメント関連情報
* `/proc/buddyinfo` - バディブロック・アルゴリズムに関する情報
* `/proc/bus` - PCI/USBなどの情報。`/sys/bus` の方が情報が豊富。
* `/proc/fb` - 利用可能なフレームバッファの一覧
* `/proc/cmdline` - カーネルに渡されたブートオプション文字列
* `/proc/cpuinfo` - CPUに関する情報（ベンダー、CPUファミリ、機種、クロック周波数、キャッシュサイズ、コア数など）。BogoMipsの値もあるが、実際の性能を反映しているとは言えない。
* `/proc/devices` - メジャーデバイス番号とデバイスグループの一覧
* `/proc/diskstats` - 各論理ディスクデバイスの統計情報
* `/proc/filesystems` - カーネルがサポートしているファイルシステムの一覧
* `/proc/interrupts`, `/proc/iomem`, `/proc/ioports`, `/proc/irq` - 各種システム資源についての詳細情報
* `/proc/meminfo` - メモリ使用状況の概要情報
* `/proc/modules` - 現在ロードされているカーネルモジュールに関する情報
* `/proc/mounts` - 現在マウントされているデバイスとマウントポイントの一覧（/proc/self/mounts へのシンボリックリンク）
* `/proc/net` - ネットワークのプロトコルスタックに関する情報
* `/proc/partitions` - 存在するパーティションについての各種情報
* `/proc/scsi` - SCSIまたはRAIDコントローラで接続されているデバイスに関する情報
* `/proc/self` - 現在動作中のプロセス（/procを見ているプロセス）の `/proc/''PID''/` へのシンボリックリンク
* `/proc/swaps` - 使用中のスワップ領域の一覧
* `/proc/sys` - 動的に変更可能なカーネルオプションへのアクセスを提供。
* `/proc/sysvipc` - 共有メモリなどIPCに関する情報
* `/proc/tty` - （擬似）端末に関する情報
* `/proc/uptime` - システム起動からの時間とアイドル状態だった時間（秒）
* `/proc/version` - カーネルのバージョン番号、（カーネルビルドに使われた）gccのバージョン番号など

procfs を使用する Linux 上のユーティリティは procps パッケージに収められており、利用するには procfs が /proc にマウントされていなければならない。

## *BSD
* FreeBSD 及び OpenBSD ではデフォルトで procfs はマウントされない。
* NetBSD 及び DragonFlyBSD ではマウントされるが、ファイル構造が異なる。

## 脚注

## 参考文献
* Unix 8th Edition proc(2) manual page - 最初のprocfs
* Plan 9 procfs manual page - Plan 9 で拡張されたprocfs
* Linux Manual Pages Proc(5) Linux のprocfsのマニュアル
* Documentation/filesystems/proc.txt procfs についてのLinuxカーネル文書

## 外部リンク
* A brief history of /proc Eric Schrock's Weblog
* Access the Linux kernel using the Procfs An IBM developerWorks article by M. Tim Jones
* Linux-Filesystem-Hierarchy Linux Documentation Project
* Creating and using proc files - an article from the Real-Time Embedded blog
* Using the proc filesystem An article by Pétur I. Egilsson