PROC(5) | File Formats Manual | PROC(5) |
NAME¶
proc - 進程信息僞文件系統描述¶
/proc 是一個僞文件系統, 被用作內核數據結構的接口, 而不僅僅 是解釋說明 /dev/kmem. /proc裏的大多數文件都是隻讀的, 但也可 以通過寫一些文件來改變內核變量.下面對整個 /proc 目錄作一個大略的介紹.
- [number]
- 在 /proc 目錄裏, 每個正在運行的進程都有一個以該進程 ID 命名的子目錄, 其下包括如下的目錄和僞文件.
- cmdline
- 該文件保存了進程的完整命令行. 如果該進程已經 被交換出內存, 或者該進程已經僵死, 那麼就沒有 任何東西在該文件裏, 這時候對該文件的讀操作將返回零 個字符. 該文件以空字符 null 而不是換行符作爲結 束標誌.
- cwd
- 一個符號連接,
指向進程當前的工作目錄.
例如, 要找出進程 20 的
cwd, 你可以:
cd /proc/20/cwd; /bin/pwd
請注意 pwd 命令通常是 shell 內置的, 在這樣的情況下可能 工作得不是很好.
- environ
- 該文件保存進程的環境變量,
各項之間以空字符分隔,
結尾也可能是一個空字符.
因此, 如果要輸出進程
1 的環境變量, 你應該:
(cat /proc/1/environ; echo) | tr ";\000"; ";\n";
(至於爲什麼想要這麼做, 請參閱 lilo(8).)
- exe
- 也是一個符號連接,
指向被執行的二進制代碼.
在 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) 命令可以定位該文件.
- fd
- 進程所打開的每個文件都有一個符號連接在該子目
錄裏,
以文件描述符命名,
這個名字實際上是指向
真正的文件的符號連接,(和
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 上.
- maps
- 該文件包含當前的映象內存區及他們的訪問許可.
格式如下:
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
- 該文件並不是 mem (1:1) 設備, 儘管它們有相同的設備號. /dev/mem 設備是做任何地址轉換之前的物理內存, 而這裏的 mem 文件是訪問它的進程的內存.目前這個 mem 還不能 mmap(2) (內存映射)出去,而且可能一直要等到內核中增加了一個通用的 mmap(2) 以後才能實現. (也許在你讀本手冊頁時這一切已經發生了)
- mmap
- mmap(2) 做的 maps
映射目錄,是和 exe, fd/*
等類似的符號連接.
請注意 maps 包含了比
/proc/*/mmap 更多的信息,
所以應該廢棄 mmap.
";0"; 通常指 libc.so.4.
在 linux 內核 1.1.40 裏, /proc/*/mmap 被取消了. (現在是 真的 廢棄不用了!)
- root
- 依靠系統調用 chroot(2), unix 和 linux 可以讓 每個進程有各自的文件系統根目錄. 由 chroot(2) 系統調用設置. 根指向文件系統的根,性質就象 exe, fd/* 等一樣.
- stat
- 進程狀態信息, 被命令
ps(1) 使用.
現將該文件裏各域, 以及他們的 scanf(3) 格式說明符, 按順序分述如下:
- pid %d
- 進程標識.
- comm %s
- 可執行文件的文件名, 包括路徑. 該文件是否可 見取決於該文件是否已被交換出內存.
- state %c
- ";RSDZT"; 中的一個, R 是正在運行, S 是 在可中斷的就緒態中睡眠, D 是在不可中 斷的等待或交換態中睡眠, Z 是僵死, T 是被跟蹤或被停止(由於收到信號).
- ppid %d
- 父進程 PID.
- pgrp %d
- 進程的進程組 ID.
- session %d
- 進程的會話 ID.
- tty %d
- 進程所使用終端.
- tpgid %d
- 當前擁有該進程所連接終端的進程所在的進程 組 ID.
- flags %u
- 進程標誌. 目前每個標誌都設了數學位, 所以輸出裏就不包括該位. crt0.s 檢查數學仿真 這可能是一個臭蟲, 因爲不是每個進 程都是用 c 編譯的程序. 數學位應該是十 進制的 4, 而跟蹤位應該是十進制的 10.
- minflt %u
- 進程所導致的小錯誤(minor faults)數目, 這樣的 小錯誤(minor faults)不需要從磁盤重新載入一個 內存頁.
- cminflt %u
- 進程及其子進程所導致的小錯誤(minor faults)數目.
- majflt %u
- 進程所導致的大錯誤(major faults)數目, 這樣的 大錯誤(major faults)需要重新載入內存頁.
- cmajflt %u
- 進程及其子進程所導致的大錯誤(major faults)數目.
- utime %d
- 進程被調度進用戶態的時間(以 jiffy 爲單 位, 1 jiffy=1/100 秒,另外不同硬件體系略有不同).
- stime %d
- 進程被調度進內核態的時間, 以 jiffy 爲 單位.
- cutime %d
- 進程及其子進程被調度進用戶態的時間, 以 jiffy 爲單位.
- cstime %d
- 進程及其子進程被調度進內核態的時間, 以 jiffy 爲單位.
- counter %d
- 如果進程不是當前正在運行的進程, 就是 進程在下個時間片當前可以擁有的最大時 間, 以 jiffy 爲單位. 如果進程是當前正 在運行的進程, 就是當前時間片中所剩下 jiffy 數目.
- priority %d
- 標準優先數只再加上 15, 在內核裏該值總 是正的.
- timeout %u
- 當前至進程的下一次間歇時間, 以 jiffy 爲單位.
- itrealvalue %u
- 由於計時間隔導致的下一個 SIGALRM 發送進程的時延,以 jiffy 爲單位.
- starttime %d
- 進程自系統啓動以來的開始時間, 以 jiffy 爲單位.
- vsize %u
- 虛擬內存大小.
- rss %u
- Resident Set Size(駐留大小): 進程所佔用的真實內 存大小, 以頁爲單位, 爲便於管理而減去 了 3. rss 只包括正文, 數據以及堆棧的空間, 但不包括尚未要求裝入內存的或已被交換出去的.
- rlim %u
- 當前進程的 rss 限制, 以字節爲單位, 通 常爲 2,147,483,647.
- startcode %u
- 正文部分地址下限.
- endcode %u
- 正文部分地址上限.
- startstack %u
- 堆棧開始地址.
- kstkesp %u
- esp(32 位堆棧指針) 的當前值, 與在進程 的內核堆棧頁得到的一致.
- kstkeip %u
- EIP(32 位指令指針)的當前值.
- signal %d
- 待處理信號的 bitmap(通常爲 0).
- blocked %d
- 被阻塞信號的 bitmap(對 shell 通常是 0, 2).
- sigignore %d
- 被忽略信號的 bitmap.
- sigcatch %d
- 被俘獲信號的 bitmap.
- wchan %u
- 進程在其中等待的通道, 實際是一個系統 調用的地址. 如果你需要文本格式的, 也 可以在名字列表中找到. (如果有最新版本的 /etc/psdatabase, 你 可以在 ps -l 的結果中的 WCHAN 域看到)
- cpuinfo
- 保存了CPU 以及體系架構依賴條目的列表. 對於不同的系 統架構有不同的列表, 共有的兩項是 cpu 和 BogoMIPS, cpu 可能是當前在用的 CPU, 而 BogoMIPS 則是內核初始化時計算出 的一個系統常數.
- devices
- 主設備號及設備組的列表, 文本格式. MAKEDEV 腳本使用 該文件來維持內核的一致性.
- dma
- 一個列表, 指出正在使用的ISA DMA (直接內存訪問)通道.
- filesystems
- 以文本格式列出了被編譯進內核的文件系統. 當沒有給 mount(1) 指明哪個文件系統的時候, mount(1) 就依靠該文件遍歷不同的文件系統.
- interrupts
- 該文件以 ASCII 格式記錄了(至少是在 i386 體系上的)每次 IRQ 的中斷數目.
- ioports
- 該文件列出了當前在用的已註冊 I/O 端口範圍.
- kcore
- 該僞文件以 core
文件格式給出了系統的物理內存映象,
再 利用未卸載的內核
(/usr/src/linux/tools/zSystem), 我
們就可以用 GDB
查探當前內核的任意數據結構.
該文件的總長度是物理內存 (RAM) 的大小再加上 4KB.
- kmsg
- 可以用該文件取代系統調用
syslog(2) 來記錄內核信息.
但是讀該文件需要超級用戶權限,
並且一次只能有一個進
程可以讀該文件,
因而如果一個使用了
syslog(2)
系統調用功能來記錄內核信息的系統日誌進程正在運行的話,
別的進程就不能再去讀該僞文件了.
該文件的內容可以用 dmesg(8) 來察看.
- ksyms
- 該文件保存了內核輸出的符號定義, modules(X) 使用該文件 動態地連接和捆綁可裝載的模塊.
- loadavg
- 平均負載數給出了在過去的 1, 5, 15 分鐘裏在運行隊列裏 的任務數, 與 uptime(1) 等命令的結果相同.
- locks
- 這個文件顯示當前文件鎖.
- malloc
- 只有在編譯時定義了 CONFIGDEBUGMALLOC 纔會有該文件.
- meminfo
- free(1)
利用該文件來給出系統總的空閒內存和已用內存
(包括物理內存和交換內存),
以及內核所使用的共享內存
和緩衝區.
該文件與 free(1) 格式相同, 但是以字節爲單位而不是 KB.
- modules
- 列出了系統已載入的模塊, 文本格式.
- net
- 該子目錄包括多個 ASCII 格式的網絡僞文件, 描述了網絡 層的部分情況. 可以用 cat 來察看這些文件, 但標準的 netstat(8) 命令組更清晰地給出了這些文件的信息.
- arp
- 該文件以 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 地址的物理層映射(如果知道的話).
- dev
- 該僞文件包含網絡設備狀態信息,
給出了發送和收
到的包的數目,
錯誤和衝突的數目,
以及別的一些
基本統計數據. 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
- ipx
- 無信息.
- ipx_route
- 無信息.
- rarp
- 該文件具有和 arp 同樣的格式, 包含當前的逆向 地址映射數據. rarp(8) 利用這些數據來作逆向 地址查詢服務. 只有將 RARP 配置進內核, 該文件才 存在.
- raw
- 該文件保存了 RAW 套接字表, 大部分信息除用於調試以外沒有什麼用. `sl' 指出了套接字的內核散列槽號; 'local address' 包括本地地址和協議號對; "St" 是套接字的內部狀態; tx_queue 和 rx_queue 是內核存儲器使用意義上的輸入輸 出數據隊列; RAW 沒有使用"tr", "tm->when" 和 "rexmits"; uid 是套接字創建者的有效 uid.
- route
- 沒有信息, 但是看上去類似於 route(8)
- snmp
- 該文件以 ASCII 格式保存了 IP, ICMP, TCP 以及 UDP 管理所需的數據信息, 基於 snmp 協議. TCP mib (TCP 管理數據庫)尚未完善, 可能在 1.2.0 內核能夠 完成.
- tcp
- 該文件保存了 TCP 套接字表, 大部分信息除用於調試以外沒有什麼用. "sl" 指出了套接字的內核散列槽號; "local address" 包括本地地址和端口號; "remote address" 包括遠地 地址和端口號(如果有連接的話); 'St' 是套接字的內 部狀態; 'tx_queue' 和 'rx_queue' 是內核存儲器使用意義上 的輸入輸出數據隊列; "tr", "tm->when" 和 "rexmits" 保存 了內核套接字聲明的內部信息, 只用於調試; uid 是套接字創建者的有效 uid.
- udp
- 該文件保存了 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
- 列出了當前系統的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
- 該文件列出了內核初始化時發現的所有 PCI 設備及其配置.
- scsi
- 該目錄包括 scsi
中間層僞文件及各種
SCSI 底層驅動器子目錄,
對系統中每個 SCSI host,
子目錄中都存在一個文件與之對應,
展示了部分 SCSI IO
子系統的狀態.
這些文件是 ASCII 格式 的,
可用cat閱讀.
你也可以通過寫其中某些文件來重新配置該子系統, 開關一些功能.
- scsi
- 該文件列出了內核掌握的所有
SCSI 設備, 其內容就
和系統啓動時所看到的類似.
目前 scsi 只支持
singledevice命令,
該命令允許 root
添加一個熱插
拔(hotplugged)設備到一個已知設備列表中.
命令 echo 'scsi singledevice 1 0 5 0' > /proc/scsi/scsi 令 host scsi1 掃描 SCSI 通道 0, 看在 ID 5 LUN 0 是否存在設備, 如果在該地址 存在設備, 或者該地址無效, 則返回一個錯誤.
- drivername
- 目前 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 可以用 latency 和 nolatency 命令打 開或者關閉 eata_dma 驅動器上測量延時的代碼, 也可以用 lockup 和 unlock 命令 控制 scsi_debug 驅動器所模擬的總線鎖操作.
- self
- 當某進程訪問 /proc 目錄時, 該目錄就指向 /proc 下以該進 程 ID 命名的目錄.
- stat
- 內核及系統的統計數據.
- cpu 3357 0 4313 1362393
- 系統分別消耗在用戶模式, 低優先權的用戶模式(nice), 系統模式, 以及空閒任務的時間, 以 jiffy 爲單位. 最後一個數值應該是 uptime 僞文件第二個數值的 100 倍.
- disk 0 0 0 0
- 目前並沒有實現這四個磁盤記錄, 我甚至認爲就不應該實現它, 這是由於在別的機器上內核統計通常依賴轉換率及 每秒 I/O 數, 而這令每個驅動器只能有一個域.
- page 5741 1808
- 系統(從磁盤)交換進的頁數和交換出去的頁數.
- swap 1 0
- 取入的交換頁及被取出的交換頁的頁數.
- intr 1462898
- 系統自啓動以來所收到的中斷數.
- ctxt 115315
- 系統所作的進程環境切換次數.
- btime 769041601
- 系統自 1970 年 1 月 1 號以來總的運行時間, 以秒爲單位.
- sys
- 該目錄在 1.3.57 的內核裏開始出現, 包含一些對應於內 核變量的文件和子目錄. 你可以讀這些變量, 有的也可以 通過proc修改, 或者用系統調用 sysctl(2) 修改. 目前該目錄下有如下三個子目錄: kernel;, ;net;, ;vm 每個各自包括一些文件和子目錄.
- kernel
- 該目錄包括如下文件: 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 無所不能.
- uptime
- 該文件包含兩個數: 系統正常運行時間和總的空閒時間, 都以秒爲單位.
- version
- 指明瞭當前正在運行的內核版本,
例如:
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"; 使之變得更可讀.本手冊頁還不完善, 可能有不夠確切的地方, 需要經常更新.
BUGS¶
/proc 可能會給那些使用了 chroot(2) 的進程帶來安全問題. 例如, 如果 /proc 被 mount 在 chroot 級別裏, 一個 到 /proc/1/root 的 chdir(2) 操作將返回文件系統的原始根目錄. 由於 Linux 還不支持 fchroot(2) 調用, 該問題可能更應該看作一個特性而不是一個 bug.[中文版維護人]¶
mapping <mapping@263.net>[中文版最新更新]¶
2000/11/26《中國linux論壇man手冊頁翻譯計劃》:¶
跋¶
本頁面中文版由中文 man 手冊頁計劃提供。中文 man 手冊頁計劃:../../man-pages-zh/manpages-zh
22 July 1996 | Linux Programmer's Manual |