DOKK / manpages / debian 12 / manpages-zh / proc.5.zh_TW
PROC(5) File Formats Manual PROC(5)

proc - 程序資訊偽檔案系統

描述

/proc 是一個偽檔案系統, 被用作核心資料結構的介面, 而不僅僅 是解釋說明 /dev/kmem. /proc裡的大多數檔案都是隻讀的, 但也可 以透過寫一些檔案來改變核心變數.

下面對整個 /proc 目錄作一個大略的介紹.

[number]
在 /proc 目錄裡, 每個正在執行的程序都有一個以該程序 ID 命名的子目錄, 其下包括如下的目錄和偽檔案.
該檔案儲存了程序的完整命令列. 如果該程序已經 被交換出記憶體, 或者該程序已經僵死, 那麼就沒有 任何東西在該檔案裡, 這時候對該檔案的讀操作將返回零 個字元. 該檔案以空字元 null 而不是換行符作為結 束標誌.
一個符號連線, 指向程序當前的工作目錄. 例如, 要找出程序 20 的 cwd, 你可以:
cd /proc/20/cwd; /bin/pwd

請注意 pwd 命令通常是 shell 內建的, 在這樣的情況下可能 工作得不是很好.

該檔案儲存程序的環境變數, 各項之間以空字元分隔, 結尾也可能是一個空字元. 因此, 如果要輸出程序 1 的環境變數, 你應該:
(cat /proc/1/environ; echo) | tr ";\000"; ";\n";

(至於為什麼想要這麼做, 請參閱 lilo(8).)

也是一個符號連線, 指向被執行的二進位制程式碼.

在 Linux 2.0 或者更早的版本下, 對 exe 特殊檔案的 readlink(2) 返回一個如下格式的字串:

[裝置號]:節點號

舉個例子, [0301]:1502 就是某裝置的 1502 節點, 該裝置的主裝置號為 03 (如 IDE, MFM 等驅動器), 從裝置號為 01 (第一個驅動器的第一分割槽).

而在 Linux 2.2 下, readlink(2) 則給出命令的實際路徑名.

另外, 該符號連線也可以正常析引用(試圖開啟 exe 檔案實際上將開啟一個可執行檔案). 你甚至可以鍵入 /proc/[number]/exe 來執行 [number] 程序的副本.

帶 -inum 選項的 find(1) 命令可以定位該檔案.

程序所開啟的每個檔案都有一個符號連線在該子目 錄裡, 以檔案描述符命名, 這個名字實際上是指向 真正的檔案的符號連線,(和 exe 記錄一樣). 例如, 0 是標準輸入, 1 是標準輸出, 2 是標準錯誤, 等等.

程式有時可能想要讀取一個檔案卻不想要標準輸入, 或者想寫到一個檔案卻不想將輸出送到標準輸出去, 那麼就可以很有效地用如下的辦法騙過(假定 -i 是輸入 檔案的標誌, 而 -o 是輸出檔案的標誌):

foobar -i /proc/self/fd/0 -o /proc/self/fd/1 ...

這樣就是一個能運轉的過濾器. 請注意該方法不能 用來在檔案裡搜尋, 這是因為 fd 目錄裡的檔案是 不可搜尋的.

在 UNIX 類的系統下, /proc/self/fd/N 基本上就與 /dev/fd/N 相同. 實際上, 大多數的 Linux MAKEDEV 指令碼都將 /dev/fd 符號連線到 [..]/proc/self/fd 上.

該檔案包含當前的映象記憶體區及他們的訪問許可.

格式如下:


address perms offset dev inode 00000000-0002f000 r-x-- 00000400 03:03 1401 0002f000-00032000 rwx-p 0002f400 03:03 1401 00032000-0005b000 rwx-p 00000000 00:00 0 60000000-60098000 rwx-p 00000400 03:03 215 60098000-600c7000 rwx-p 00000000 00:00 0 bfffa000-c0000000 rwx-p 00000000 00:00 0

address 是程序所佔據的地址空間, perms 是許可權集:


r = read w = write x = execute s = shared p = private (copy on write)

offset 是檔案或者別的什麼的偏移量, dev 是裝置號(主設 備號:從裝置號), 而 inode 則是裝置的節點號. 0 表明沒有 節點與記憶體相對應, 就象 bss 的情形.

在 Linux 2.2 下還增加了一個域給可用的路徑名.

該檔案並不是 mem (1:1) 裝置, 儘管它們有相同的裝置號. /dev/mem 裝置是做任何地址轉換之前的物理記憶體, 而這裡的 mem 檔案是訪問它的程序的記憶體.目前這個 mem 還不能 mmap(2) (記憶體對映)出去,而且可能一直要等到核心中增加了一個通用的 mmap(2) 以後才能實現. (也許在你讀本手冊頁時這一切已經發生了)
mmap(2) 做的 maps 對映目錄,是和 exe, fd/* 等類似的符號連線. 請注意 maps 包含了比 /proc/*/mmap 更多的資訊, 所以應該廢棄 mmap.

";0"; 通常指 libc.so.4.

在 linux 核心 1.1.40 裡, /proc/*/mmap 被取消了. (現在是 真的 廢棄不用了!)

依靠系統呼叫 chroot(2), unix 和 linux 可以讓 每個程序有各自的檔案系統根目錄. 由 chroot(2) 系統呼叫設定. 根指向檔案系統的根,性質就象 exe, fd/* 等一樣.
程序狀態資訊, 被命令 ps(1) 使用.

現將該檔案裡各域, 以及他們的 scanf(3) 格式說明符, 按順序分述如下:

程序標識.
可執行檔案的檔名, 包括路徑. 該檔案是否可 見取決於該檔案是否已被交換出記憶體.
";RSDZT"; 中的一個, R 是正在執行, S 是 在可中斷的就緒態中睡眠, D 是在不可中 斷的等待或交換態中睡眠, Z 是僵死, T 是被跟蹤或被停止(由於收到訊號).
父程序 PID.
程序的程序組 ID.
程序的會話 ID.
程序所使用終端.
當前擁有該程序所連線終端的程序所在的程序 組 ID.
程序標誌. 目前每個標誌都設了數學位, 所以輸出裡就不包括該位. crt0.s 檢查數學模擬 這可能是一個臭蟲, 因為不是每個進 程都是用 c 編譯的程式. 數學位應該是十 進位制的 4, 而跟蹤位應該是十進位制的 10.
程序所導致的小錯誤(minor faults)數目, 這樣的 小錯誤(minor faults)不需要從磁碟重新載入一個 記憶體頁.
程序及其子程序所導致的小錯誤(minor faults)數目.
程序所導致的大錯誤(major faults)數目, 這樣的 大錯誤(major faults)需要重新載入記憶體頁.
程序及其子程序所導致的大錯誤(major faults)數目.
程序被排程進使用者態的時間(以 jiffy 為單 位, 1 jiffy=1/100 秒,另外不同硬體體系略有不同).
程序被排程進核心態的時間, 以 jiffy 為 單位.
程序及其子程序被排程進使用者態的時間, 以 jiffy 為單位.
程序及其子程序被排程進核心態的時間, 以 jiffy 為單位.
如果程序不是當前正在執行的程序, 就是 程序在下個時間片當前可以擁有的最大時 間, 以 jiffy 為單位. 如果程序是當前正 在執行的程序, 就是當前時間片中所剩下 jiffy 數目.
標準優先數只再加上 15, 在核心裡該值總 是正的.
當前至程序的下一次間歇時間, 以 jiffy 為單位.
由於計時間隔導致的下一個 SIGALRM 傳送程序的時延,以 jiffy 為單位.
程序自系統啟動以來的開始時間, 以 jiffy 為單位.
虛擬記憶體大小.
Resident Set Size(駐留大小): 程序所佔用的真實內 存大小, 以頁為單位, 為便於管理而減去 了 3. rss 只包括正文, 資料以及堆疊的空間, 但不包括尚未要求裝入記憶體的或已被交換出去的.
當前程序的 rss 限制, 以位元組為單位, 通 常為 2,147,483,647.
正文部分地址下限.
正文部分地址上限.
堆疊開始地址.
esp(32 位堆疊指標) 的當前值, 與在程序 的核心堆疊頁得到的一致.
EIP(32 位指令指標)的當前值.
待處理訊號的 bitmap(通常為 0).
被阻塞訊號的 bitmap(對 shell 通常是 0, 2).
被忽略訊號的 bitmap.
被俘獲訊號的 bitmap.
程序在其中等待的通道, 實際是一個系統 呼叫的地址. 如果你需要文字格式的, 也 可以在名字列表中找到. (如果有最新版本的 /etc/psdatabase, 你 可以在 ps -l 的結果中的 WCHAN 域看到)

儲存了CPU 以及體系架構依賴條目的列表. 對於不同的系 統架構有不同的列表, 共有的兩項是 cpuBogoMIPS, cpu 可能是當前在用的 CPU, 而 BogoMIPS 則是核心初始化時計算出 的一個系統常數.
主裝置號及裝置組的列表, 文字格式. MAKEDEV 指令碼使用 該檔案來維持核心的一致性.
一個列表, 指出正在使用的ISA DMA (直接記憶體訪問)通道.
以文字格式列出了被編譯進核心的檔案系統. 當沒有給 mount(1) 指明哪個檔案系統的時候, mount(1) 就依靠該檔案遍歷不同的檔案系統.
該檔案以 ASCII 格式記錄了(至少是在 i386 體系上的)每次 IRQ 的中斷數目.
該檔案列出了當前在用的已註冊 I/O 埠範圍.
該偽檔案以 core 檔案格式給出了系統的物理記憶體映象, 再 利用未解除安裝的核心 (/usr/src/linux/tools/zSystem), 我 們就可以用 GDB 查探當前核心的任意資料結構.

該檔案的總長度是物理記憶體 (RAM) 的大小再加上 4KB.

可以用該檔案取代系統呼叫 syslog(2) 來記錄核心資訊. 但是讀該檔案需要超級使用者許可權, 並且一次只能有一個進 程可以讀該檔案, 因而如果一個使用了 syslog(2) 系統呼叫功能來記錄核心資訊的系統日誌程序正在執行的話, 別的程序就不能再去讀該偽檔案了.

該檔案的內容可以用 dmesg(8) 來察看.

該檔案儲存了核心輸出的符號定義, modules(X) 使用該檔案 動態地連線和捆綁可裝載的模組.
平均負載數給出了在過去的 1, 5, 15 分鐘裡在執行佇列裡 的任務數, 與 uptime(1) 等命令的結果相同.
這個檔案顯示當前檔案鎖.
只有在編譯時定義了 CONFIGDEBUGMALLOC 才會有該檔案.
free(1) 利用該檔案來給出系統總的空閒記憶體和已用記憶體 (包括物理記憶體和交換記憶體), 以及核心所使用的共享記憶體 和緩衝區.

該檔案與 free(1) 格式相同, 但是以位元組為單位而不是 KB.

列出了系統已載入的模組, 文字格式.
該子目錄包括多個 ASCII 格式的網路偽檔案, 描述了網路 層的部分情況. 可以用 cat 來察看這些檔案, 但標準的 netstat(8) 命令組更清晰地給出了這些檔案的資訊.
該檔案以 ASCII 格式儲存了核心 ARP 表, 用於地址解析, 包括靜態和動態 arp 資料. 檔案格式如下:

IP address HW type Flags HW address 10.11.100.129 0x1 0x6 00:20:8A:00:0C:5A 10.11.100.5 0x1 0x2 00:C0:EA:00:00:4E 44.131.10.6 0x3 0x2 GW4PTS

其中 'IP address' 是機器的 IPv4 地址; 'HW type' 是地址的硬 件型別, 遵循 RFC 826; flags 是 ARP 結構的內部標誌, 在 /usr/include/linux/if_arp.h 中定義; 'HW address' 是該 IP 地址的物理層對映(如果知道的話).

該偽檔案包含網路裝置狀態資訊, 給出了傳送和收 到的包的數目, 錯誤和衝突的數目, 以及別的一些 基本統計資料. ifconfig(8) 利用了該檔案來報 告網路裝置狀態. 檔案格式如下:

Inter-| Receive | Transmit face |packets errs drop fifo frame|packets errs drop fifo colls carrier lo: 0 0 0 0 0 2353 0 0 0 0 0 eth0: 644324 1 0 0 1 563770 0 0 0 581 0
無資訊.
無資訊.
該檔案具有和 arp 同樣的格式, 包含當前的逆向 地址對映資料. rarp(8) 利用這些資料來作逆向 地址查詢服務. 只有將 RARP 配置進核心, 該檔案才 存在.
該檔案儲存了 RAW 套接字表, 大部分資訊除用於除錯以外沒有什麼用. `sl' 指出了套接字的核心雜湊槽號; 'local address' 包括本地地址和協議號對; "St" 是套接字的內部狀態; tx_queue 和 rx_queue 是核心儲存器使用意義上的輸入輸 出資料佇列; RAW 沒有使用"tr", "tm->when" 和 "rexmits"; uid 是套接字建立者的有效 uid.
沒有資訊, 但是看上去類似於 route(8)
該檔案以 ASCII 格式儲存了 IP, ICMP, TCP 以及 UDP 管理所需的資料資訊, 基於 snmp 協議. TCP mib (TCP 管理資料庫)尚未完善, 可能在 1.2.0 核心能夠 完成.
該檔案儲存了 TCP 套接字表, 大部分資訊除用於除錯以外沒有什麼用. "sl" 指出了套接字的核心雜湊槽號; "local address" 包括本地地址和埠號; "remote address" 包括遠地 地址和埠號(如果有連線的話); 'St' 是套接字的內 部狀態; 'tx_queue' 和 'rx_queue' 是核心儲存器使用意義上 的輸入輸出資料佇列; "tr", "tm->when" 和 "rexmits" 儲存 了核心套接字宣告的內部資訊, 只用於除錯; uid 是套接字建立者的有效 uid.
該檔案儲存了 UDP 套接字表, 大部分資訊除用於除錯以外沒有什麼用. "sl" 指出了套接字的核心雜湊槽號; "local address" 包括本地地址和埠號; "remote address" 包括遠地 地址和埠號(如果有連線的話); "St" 是套接字的內 部狀態; "tx_queue" 和 "rx_queue" 是核心儲存器使用意義上 的輸入輸出資料佇列; UDP 沒有使用 "tr","tm->when" 和 "rexmits"; uid 是套接字建立者的有效 uid. 格式如下:

sl local_address rem_address st tx_queue rx_queue tr rexmits tm->when uid 1: 01642C89:0201 0C642C89:03FF 01 00000000:00000001 01:000071BA 00000000 0 1: 00000000:0801 00000000:0000 0A 00000000:00000000 00:00000000 6F000100 0 1: 00000000:0201 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0
列出了當前系統的UNIX域套接字以及它們的狀態, 格式如下:
Num RefCount Protocol Flags    Type St Path
0: 00000002 00000000 00000000 0001 03
1: 00000001 00000000 00010000 0001 01 /dev/printer

    

`Num' 是核心雜湊槽號; 'RefCount' 是使用者套接字號; 'Protocol' 當前總是 0; 'Flags' 是核心標誌, 指出了套接字的狀態; 'Type' 當前總是 1(在核心中尚未支援 unix 域資料報套接字); 'St' 是套接字內部狀態; 'Path' 套接字綁捆的路徑(如果有的話).

該檔案列出了核心初始化時發現的所有 PCI 裝置及其配置.
該目錄包括 scsi 中間層偽檔案及各種 SCSI 底層驅動器子目錄, 對系統中每個 SCSI host, 子目錄中都存在一個檔案與之對應, 展示了部分 SCSI IO 子系統的狀態. 這些檔案是 ASCII 格式 的, 可用cat閱讀.

你也可以透過寫其中某些檔案來重新配置該子系統, 開關一些功能.

該檔案列出了核心掌握的所有 SCSI 裝置, 其內容就 和系統啟動時所看到的類似. 目前 scsi 只支援 singledevice命令, 該命令允許 root 新增一個熱插 拔(hotplugged)裝置到一個已知裝置列表中.

命令 echo 'scsi singledevice 1 0 5 0' > /proc/scsi/scsi 令 host scsi1 掃描 SCSI 通道 0, 看在 ID 5 LUN 0 是否存在裝置, 如果在該地址 存在裝置, 或者該地址無效, 則返回一個錯誤.

目前 drivername 可包含: NCR53c7xx, aha152x, aha1542, aha1740, aic7xxx, buslogic, eata_dma, eata_pio, fdomain, in2000, pas16, qlogic, scsi_debug, seagate, t128, u15-24f, ultrastore 或者 wd7000. 這些目錄展示那些至少註冊了一個 SCSI HBA 的驅動. 而對每個已註冊的 host, 每個目錄中都包含一個檔案與之對應, 而這些對應的 host 檔案就以初始化時分配給 host 的數字來命名.

這些檔案給出了驅動程式以及裝置的配置, 統計資料等.

可以透過寫這些檔案實現不同的 host 上做不同的工作. 例如, root 可以用 latencynolatency 命令打 開或者關閉 eata_dma 驅動器上測量延時的程式碼, 也可以用 lockupunlock 命令 控制 scsi_debug 驅動器所模擬的匯流排鎖操作.

當某程序訪問 /proc 目錄時, 該目錄就指向 /proc 下以該進 程 ID 命名的目錄.
核心及系統的統計資料.
系統分別消耗在使用者模式, 低優先權的使用者模式(nice), 系統模式, 以及空閒任務的時間, 以 jiffy 為單位. 最後一個數值應該是 uptime 偽檔案第二個數值的 100 倍.
目前並沒有實現這四個磁碟記錄, 我甚至認為就不應該實現它, 這是由於在別的機器上核心統計通常依賴轉換率及 每秒 I/O 數, 而這令每個驅動器只能有一個域.
系統(從磁碟)交換進的頁數和交換出去的頁數.
取入的交換頁及被取出的交換頁的頁數.
系統自啟動以來所收到的中斷數.
系統所作的程序環境切換次數.
系統自 1970 年 1 月 1 號以來總的執行時間, 以秒為單位.
該目錄在 1.3.57 的核心裡開始出現, 包含一些對應於內 核變數的檔案和子目錄. 你可以讀這些變數, 有的也可以 透過proc修改, 或者用系統呼叫 sysctl(2) 修改. 目前該目錄下有如下三個子目錄: kernel;, ;net;, ;vm 每個各自包括一些檔案和子目錄.
該目錄包括如下檔案: domainname;, ;file-max;, ;file-nr;, ;hostname;, ; inode-max;, ;inode-nr;, ;osrelease;, ;ostype;, ; panic;, ;real-root-dev;, ;securelevel;, ;version, 由檔名就可以清楚地得知各檔案功能.

只讀檔案 file-nr 給出當前開啟的檔案數.

檔案 file-max 給出系統所容許的最大可開啟檔案數. 如果 1024 不夠大的話, 可以

echo 4096 > /proc/sys/kernel/file-max

類似地, 檔案 inode-nr 以及檔案 inode-max 指出了當前 inode 數和最大 inode 數.

檔案 ostype;, ;osrelease;, ;version 實際上是 /proc/version 的子字串.

檔案 panic 可以對核心變數 panic_timeout 進行讀/寫訪問. 如果該值為零, 核心在 panic 時進入(死)迴圈; 如果非零, 該值指出核心將自動重起的時間, 以秒為單位.

檔案 securelevel 目前似乎沒什麼意義 - root 無所不能.

該檔案包含兩個數: 系統正常執行時間和總的空閒時間, 都以秒為單位.
指明瞭當前正在執行的核心版本, 例如:

Linux version 1.0.9 (quinlan@phaze) #1 Sat May 14 01:51:54 EDT 1994

又見

cat(1), find(1), free(1), mount(1), ps(1), tr(1), uptime(1), readlink(2), mmap(2), chroot(2), syslog(2), hier(7), arp(8), dmesg(8), netstat(8), route(8), ifconfig(8), procinfo(8)等等.

遵循

本手冊頁基本上是針對 Linux 1.3.11 核心, 如有必要請及時更新!

最後更新也是針對 Linux 1.3.11.

注意事項

請注意許多字串(例如環境變數或者命令列)是以內部格式儲存的, 以 NUL 作為子域的結束標誌, 可以用 od -c 或者 tr ";\000"; ";\n"; 使之變得更可讀.

本手冊頁還不完善, 可能有不夠確切的地方, 需要經常更新.

/proc 可能會給那些使用了 chroot(2) 的程序帶來安全問題. 例如, 如果 /proc 被 mount 在 chroot 級別裡, 一個 到 /proc/1/rootchdir(2) 操作將返回檔案系統的原始根目錄. 由於 Linux 還不支援 fchroot(2) 呼叫, 該問題可能更應該看作一個特性而不是一個 bug.

mapping <mapping@263.net>

2000/11/26

《中國linux論壇man手冊頁翻譯計劃》:

http://cmpp.linuxforum.net

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

22 July 1996 Linux Programmer's Manual