初心者なりに/proc ディレクトリについて調べてみた

# 概要

[Red Hat Enterprise Linux 4: リファレンスガイド - 5.3. /proc/配下のディレクトリ](http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-ja-4/s1-proc-directories.html) の説明によると
> カーネルに関する情報の共通グループは、/proc/ ディレクトリ内のディレクトリ及びサブディレクトリにグループ化されます。

だそうです、あんまり分かりません。
[通信用語の基礎知識 - /proc](https://www.wdic.org/w/TECH//proc) によると
> UNIXやPOSIX準拠OS(Linux等)で、プロセス関係の情報が置かれるディレクトリ。
概要
具体的には、procfsをマウントするためのディレクトリ(マウントポイント)である。
UNIX System V、BSD、Linuxなどオペレーティングシステム(OS)を問わずこのディレクトリは存在するが、その内容については各OSのカーネルの仕様に依存しており、相互の互換性などはない。
OSによっては、プロセスの情報だけでなく、カーネルの情報を読み出すこともできる。
Linuxでも、どのディストリビューションにも例外なくあるが、FHSには規定されていない。
特徴
ファイル
ここに置かれた情報は、実際にはファイルとしてその実体は存在しない。
procfsがマウントされていると、PIDのディレクトリがあるように見え、ここから各種プロセスの情報を読み出すことができる。情報は一見ディレクトリやファイルに見えるが、仮想化されたものであって、ディスク上にファイル等がある訳ではない。
UNIXだけでなくLinuxでも同様だが、加えてカーネル内部の情報にアクセスするための情報がある。これも一見ファイルに見えるが、同様にファイルではない。

だそうです
こっちの方が分かりやすいですね

`man proc` してみるとめちゃくちゃ長いですが、概要は

> DESCRIPTION
       The  proc  filesystem  is a pseudo-filesystem which provides an interface to kernel data
       structures.  It is commonly mounted at /proc.  Typically, it is mounted automatically by
       the system, but it can also be mounted manually using a command such as:

>           mount -t proc proc /proc

>    Most  of  the  files  in the proc filesystem are read-only, but some files are writable,
       allowing kernel variables to be changed.

DeepL に突っ込むと

> 説明
       proc ファイルシステムはカーネルのデータ構造へのインターフェイスを提供する擬似ファイルシステムです。 一般的には /proc にマウントされます。 通常、システムによって自動的にマウントされますが、以下のようなコマンドを使って手動でマウントすることもできます。

>           mount -t proc proc /proc

>  proc ファイルシステム内のほとんどのファイルは読み込み専用ですが、一部のファイルは書き込み可能で、カーネル変数を変更することができます。

なんとなく分かってきました

# プロセスディレクトリ
まず、`ls` してみると数字のディレクトリが複数あります。
これは実行時大してプロセスが起動していないので少ないですが、
`ps` してみると同じプロセスIDが確認出来ると思います。

```shell-session
$ ls -al /proc | head
total 4
dr-xr-xr-x 144 root      root                    0 Jun 10 00:59 .
drwxr-xr-x  23 root      root                 4096 Jun 10 00:59 ..
dr-xr-xr-x   9 root      root                    0 Jun 10 00:59 1
dr-xr-xr-x   9 mizutoki_ mizutoki_               0 Jun 10 00:59 10
dr-xr-xr-x   9 mizutoki_ mizutoki_               0 Jun 10 01:15 188
dr-xr-xr-x   9 mizutoki_ mizutoki_               0 Jun 10 01:15 189
dr-xr-xr-x   9 root      root                    0 Jun 10 00:59 8
dr-xr-xr-x   9 root      root                    0 Jun 10 00:59 9
dr-xr-xr-x   2 root      root                    0 Jun 10 00:59 acpi
$ ps
  PID TTY          TIME CMD
   10 pts/0    00:00:00 zsh
  218 pts/0    00:00:00 ps
```

それぞれのプロセス固有の情報が置かれているのでこれらをプロセスディレクトリと呼ぶそうです。
そして `/proc/self` は自分のプロセスIDを分かっていなくても、自分自身のプロセスディレクトリにアクセス出来るそうです。

そのプロセスディレクトリの中身を覗いてみます

```shell-session
$ ls -al /proc/10
total 0
dr-xr-xr-x   9 mizutoki_ mizutoki_ 0 Jun 10 00:59 .
dr-xr-xr-x 143 root      root      0 Jun 10 00:59 ..
dr-xr-xr-x   2 mizutoki_ mizutoki_ 0 Jun 10 01:26 attr
-r--------   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 auxv
-r--r--r--   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 cgroup
--w-------   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 clear_refs
-r--r--r--   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 cmdline
-rw-r--r--   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 comm
-rw-r--r--   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 coredump_filter
-r--r--r--   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 cpuset
lrwxrwxrwx   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 cwd -> /mnt/c/Users/mizutoki_
-r--------   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 environ
lrwxrwxrwx   1 mizutoki_ mizutoki_ 0 Jun 10 00:59 exe -> /bin/zsh
dr-x------   2 mizutoki_ mizutoki_ 0 Jun 10 00:59 fd
dr-x------   2 mizutoki_ mizutoki_ 0 Jun 10 01:26 fdinfo
-rw-r--r--   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 gid_map
-r--------   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 io
-r--r--r--   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 limits
dr-x------   2 mizutoki_ mizutoki_ 0 Jun 10 01:26 map_files
-r--r--r--   1 mizutoki_ mizutoki_ 0 Jun 10 01:26 maps
.
.
.
```

# ファイル群

理解が容易だったものをいくつか抜粋して見ますと

* `/proc/[pid]/cmdline`

プロセスの完全なコマンドラインを保持
例えば、

```
$ cat /proc/10/cmdline  
-zsh
$ cat /proc/self/cmdline
cat/proc/self/cmdline
```

* `/proc/[pid]/cwd`

プロセスの現在の作業ディレクトリ

* `/proc/[pid]/environ`

現在実行中のプログラムが起動された時に設定された最初の環境が含まれている。
この説明だとあまり分かりませんが、`cat` して見ると環境変数が入っています

*　`/proc/[pid]/status`

`/proc/[pid]/stat`, `/proc/[pid]/statm` の情報の多くを、人間が解析しやすい形式で表示する

```
$ cat /proc/self/status 
Name:   cat
Umask:  0022
State:  R (running)
Tgid:   1035
Ngid:   0
Pid:    1035
PPid:   10
TracerPid:      0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize: 64
Groups: 4 20 24 25 27 29 30 44 46 108 114 1000 
NStgid: 1035
NSpid:  1035
NSpgid: 1035
NSsid:  10
VmPeak:     6324 kB
VmSize:     6324 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:       836 kB
VmRSS:       836 kB
RssAnon:              68 kB
RssFile:             768 kB
RssShmem:              0 kB
VmData:      312 kB
VmStk:       140 kB
VmExe:        32 kB
VmLib:      2112 kB
VmPTE:        52 kB
VmSwap:        0 kB
HugetlbPages:          0 kB
CoreDumping:    0
Threads:        1
SigQ:   0/102431
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
.
.
.
```

* `/proc/cpuinfo`
CPU と アーキテクチャに依存する項目のコレクション

```
$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 158
model name      : Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz
stepping        : 10
microcode       : 0xffffffff
cpu MHz         : 3695.998
cache size      : 12288 KB
physical id     : 0
siblings        : 12
core id         : 0
cpu cores       : 6
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 21
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall
.
.
.
```

他にもたくさんあるので、詳しく知りたい方は `man proc` を読んでみてください

# 参照
* [Red Hat Enterprise Linux 4: リファレンスガイド - 5.3. /proc/配下のディレクトリ](http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-ja-4/s1-proc-directories.html)
* [Red Hat Enterprise Linux 6 導入ガイド - E.3. /PROC/ 内のディレクトリ](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s1-proc-directories)
* [通信用語の基礎知識 - /proc](https://www.wdic.org/w/TECH//proc)
* [LinuC Linux豆知識 201「/proc/<pid>/status」ファイル](https://linuc.org/study/knowledge/531/)