在Linux下面,編寫類似的資源管理器,需要讀取proc下面的很多文件,為此,搜尋了下面的資料,以利于學(xué)習(xí)和保存!
總之,可以使用命令來讀取cat /proc/pid/stat(讀取進(jìn)程信息…………)
=============================================================================
/proc 是一個(gè)偽文件系統(tǒng), 被用作內(nèi)核數(shù)據(jù)結(jié)構(gòu)的接口, 而不僅僅是解釋說明 /dev/kmem. /proc里的大多數(shù)文件都是只讀的, 但也可以通過寫一些文件來改變內(nèi)核變量.
下面對(duì)整個(gè) /proc 目錄作一個(gè)大略的介紹.
- [number]
- 在 /proc 目錄里, 每個(gè)正在運(yùn)行的進(jìn)程都有一個(gè)以該進(jìn)程 ID 命名的子目錄, 其下包括如下的目錄和偽文件.
- cmdline
- 該文件保存了進(jìn)程的完整命令行. 如果該進(jìn)程已經(jīng)被交換出內(nèi)存, 或者該進(jìn)程已經(jīng)僵死, 那么就沒有任何東西在該文件里, 這時(shí)候?qū)υ撐募淖x操作將返回零個(gè)字符. 該文件以空字符 null 而不是換行符作為結(jié)束標(biāo)志.
- cwd
- 一個(gè)符號(hào)連接, 指向進(jìn)程當(dāng)前的工作目錄. 例如, 要找出進(jìn)程 20 的 cwd, 你可以:
cd /proc/20/cwd; /bin/pwd
請(qǐng)注意 pwd 命令通常是 shell 內(nèi)置的, 在這樣的情況下可能工作得不是很好.
- environ
- 該文件保存進(jìn)程的環(huán)境變量, 各項(xiàng)之間以空字符分隔, 結(jié)尾也可能是一個(gè)空字符. 因此, 如果要輸出進(jìn)程 1 的環(huán)境變量, 你應(yīng)該:
(cat /proc/1/environ; echo) | tr ";\000"; ";\n";
(至于為什么想要這么做, 請(qǐng)參閱 lilo(8).)
- exe
- 也是一個(gè)符號(hào)連接, 指向被執(zhí)行的二進(jìn)制代碼.
在 Linux 2.0 或者更早的版本下, 對(duì) exe 特殊文件的 readlink(2) 返回一個(gè)如下格式的字符串:
[設(shè)備號(hào)]:節(jié)點(diǎn)號(hào)
舉個(gè)例子, [0301]:1502 就是某設(shè)備的 1502 節(jié)點(diǎn), 該設(shè)備的主設(shè)備號(hào)為 03 (如 IDE, MFM 等驅(qū)動(dòng)器), 從設(shè)備號(hào)為 01 (第一個(gè)驅(qū)動(dòng)器的第一分區(qū)).
而在 Linux 2.2 下, readlink(2) 則給出命令的實(shí)際路徑名.
另外, 該符號(hào)連接也可以正常析引用(試圖打開 exe 文件實(shí)際上將打開一個(gè)可執(zhí)行文件). 你甚至可以鍵入 /proc/[number]/exe 來運(yùn)行 [number] 進(jìn)程的副本.
帶 -inum 選項(xiàng)的 find(1) 命令可以定位該文件.
- fd
- 進(jìn)程所打開的每個(gè)文件都有一個(gè)符號(hào)連接在該子目錄里, 以文件描述符命名, 這個(gè)名字實(shí)際上是指向真正的文件的符號(hào)連接,(和 exe 記錄一樣).例如, 0 是標(biāo)準(zhǔn)輸入, 1 是標(biāo)準(zhǔn)輸出, 2 是標(biāo)準(zhǔn)錯(cuò)誤, 等等.
程序有時(shí)可能想要讀取一個(gè)文件卻不想要標(biāo)準(zhǔn)輸入,或者想寫到一個(gè)文件卻不想將輸出送到標(biāo)準(zhǔn)輸出去,那么就可以很有效地用如下的辦法騙過(假定 -i 是輸入文件的標(biāo)志, 而 -o 是輸出文件的標(biāo)志):
foobar -i /proc/self/fd/0 -o /proc/self/fd/1 ...
這樣就是一個(gè)能運(yùn)轉(zhuǎn)的過濾器. 請(qǐng)注意該方法不能用來在文件里搜索, 這是因?yàn)?fd 目錄里的文件是不可搜索的.
在 UNIX 類的系統(tǒng)下, /proc/self/fd/N 基本上就與 /dev/fd/N 相同. 實(shí)際上, 大多數(shù)的 Linux MAKEDEV 腳本都將 /dev/fd 符號(hào)連接到 [..]/proc/self/fd 上.
- maps
- 該文件包含當(dāng)前的映象內(nèi)存區(qū)及他們的訪問許可.
格式如下: 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 是進(jìn)程所占據(jù)的地址空間, perms 是權(quán)限集: r = read
w = write
x = execute
s = shared
p = private (copy on write)
offset 是文件或者別的什么的偏移量, dev 是設(shè)備號(hào)(主設(shè)備號(hào):從設(shè)備號(hào)), 而 inode 則是設(shè)備的節(jié)點(diǎn)號(hào). 0 表明沒有節(jié)點(diǎn)與內(nèi)存相對(duì)應(yīng), 就象 bss 的情形.
在 Linux 2.2 下還增加了一個(gè)域給可用的路徑名.
- mem
- 該文件并不是 mem (1:1) 設(shè)備, 盡管它們有相同的設(shè)備號(hào). /dev/mem 設(shè)備是做任何地址轉(zhuǎn)換之前的物理內(nèi)存, 而這里的 mem 文件是訪問它的進(jìn)程的內(nèi)存.目前這個(gè) mem 還不能 mmap(2) (內(nèi)存映射)出去,而且可能一直要等到內(nèi)核中增加了一個(gè)通用的 mmap(2) 以后才能實(shí)現(xiàn). (也許在你讀本手冊(cè)頁時(shí)這一切已經(jīng)發(fā)生了)
- mmap
- mmap(2) 做的 maps 映射目錄,是和 exe, fd/* 等類似的符號(hào)連接. 請(qǐng)注意 maps 包含了比 /proc/*/mmap 更多的信息, 所以應(yīng)該廢棄 mmap.
";0"; 通常指 libc.so.4.
在 linux 內(nèi)核 1.1.40 里, /proc/*/mmap 被取消了. (現(xiàn)在是 真的 廢棄不用了!)
- root
- 依靠系統(tǒng)調(diào)用 chroot(2), unix 和 linux 可以讓每個(gè)進(jìn)程有各自的文件系統(tǒng)根目錄. 由 chroot(2) 系統(tǒng)調(diào)用設(shè)置.根指向文件系統(tǒng)的根,性質(zhì)就象 exe, fd/* 等一樣.
- stat
- 進(jìn)程狀態(tài)信息, 被命令 ps(1) 使用.
現(xiàn)將該文件里各域, 以及他們的 scanf(3)格式說明符, 按順序分述如下:
- pid %d
- 進(jìn)程標(biāo)識(shí).
- comm %s
- 可執(zhí)行文件的文件名, 包括路徑. 該文件是否可見取決于該文件是否已被交換出內(nèi)存.
- state %c
- ";RSDZT"; 中的一個(gè), R 是正在運(yùn)行, S 是在可中斷的就緒態(tài)中睡眠, D 是在不可中斷的等待或交換態(tài)中睡眠, Z 是僵死, T 是被跟蹤或被停止(由于收到信號(hào)).
- ppid %d
- 父進(jìn)程 PID.
- pgrp %d
- 進(jìn)程的進(jìn)程組 ID.
- session %d
- 進(jìn)程的會(huì)話 ID.
- tty %d
- 進(jìn)程所使用終端.
- tpgid %d
- 當(dāng)前擁有該進(jìn)程所連接終端的進(jìn)程所在的進(jìn)程組 ID.
- flags %u
- 進(jìn)程標(biāo)志. 目前每個(gè)標(biāo)志都設(shè)了數(shù)學(xué)位, 所以輸出里就不包括該位. crt0.s 檢查數(shù)學(xué)仿真這可能是一個(gè)臭蟲, 因?yàn)椴皇敲總€(gè)進(jìn)程都是用 c 編譯的程序. 數(shù)學(xué)位應(yīng)該是十進(jìn)制的 4, 而跟蹤位應(yīng)該是十進(jìn)制的 10.
- minflt %u
- 進(jìn)程所導(dǎo)致的小錯(cuò)誤(minor faults)數(shù)目, 這樣的小錯(cuò)誤(minor faults)不需要從磁盤重新載入一個(gè)內(nèi)存頁.
- cminflt %u
- 進(jìn)程及其子進(jìn)程所導(dǎo)致的小錯(cuò)誤(minor faults)數(shù)目.
- majflt %u
- 進(jìn)程所導(dǎo)致的大錯(cuò)誤(major faults)數(shù)目, 這樣的大錯(cuò)誤(major faults)需要重新載入內(nèi)存頁.
- cmajflt %u
- 進(jìn)程及其子進(jìn)程所導(dǎo)致的大錯(cuò)誤(major faults)數(shù)目.
- utime %d
- 進(jìn)程被調(diào)度進(jìn)用戶態(tài)的時(shí)間(以 jiffy 為單位, 1 jiffy=1/100 秒,另外不同硬件體系略有不同).
- stime %d
- 進(jìn)程被調(diào)度進(jìn)內(nèi)核態(tài)的時(shí)間, 以 jiffy 為單位.
- cutime %d
- 進(jìn)程及其子進(jìn)程被調(diào)度進(jìn)用戶態(tài)的時(shí)間, 以 jiffy 為單位.
- cstime %d
- 進(jìn)程及其子進(jìn)程被調(diào)度進(jìn)內(nèi)核態(tài)的時(shí)間, 以 jiffy 為單位.
- counter %d
- 如果進(jìn)程不是當(dāng)前正在運(yùn)行的進(jìn)程, 就是進(jìn)程在下個(gè)時(shí)間片當(dāng)前可以擁有的最大時(shí)間, 以 jiffy 為單位. 如果進(jìn)程是當(dāng)前正在運(yùn)行的進(jìn)程, 就是當(dāng)前時(shí)間片中所剩下 jiffy 數(shù)目.
- priority %d
- 標(biāo)準(zhǔn)優(yōu)先數(shù)只再加上 15, 在內(nèi)核里該值總是正的.
- timeout %u
- 當(dāng)前至進(jìn)程的下一次間歇時(shí)間, 以 jiffy 為單位.
- itrealvalue %u
- 由于計(jì)時(shí)間隔導(dǎo)致的下一個(gè) SIGALRM 發(fā)送進(jìn)程的時(shí)延,以 jiffy 為單位.
- starttime %d
- 進(jìn)程自系統(tǒng)啟動(dòng)以來的開始時(shí)間, 以 jiffy 為單位.
- vsize %u
- 虛擬內(nèi)存大小.
- rss %u
- Resident Set Size(駐留大小): 進(jìn)程所占用的真實(shí)內(nèi)存大小, 以頁為單位, 為便于管理而減去了 3. rss 只包括正文, 數(shù)據(jù)以及堆棧的空間, 但不包括尚未要求裝入內(nèi)存的或已被交換出去的.
- rlim %u
- 當(dāng)前進(jìn)程的 rss 限制, 以字節(jié)為單位, 通常為 2,147,483,647.
- startcode %u
- 正文部分地址下限.
- endcode %u
- 正文部分地址上限.
- startstack %u
- 堆棧開始地址.
- kstkesp %u
- esp(32 位堆棧指針) 的當(dāng)前值, 與在進(jìn)程的內(nèi)核堆棧頁得到的一致.
- kstkeip %u
- EIP(32 位指令指針)的當(dāng)前值.
- signal %d
- 待處理信號(hào)的 bitmap(通常為 0).
- blocked %d
- 被阻塞信號(hào)的 bitmap(對(duì) shell 通常是 0, 2).
- sigignore %d
- 被忽略信號(hào)的 bitmap.
- sigcatch %d
- 被俘獲信號(hào)的 bitmap.
- wchan %u
- 進(jìn)程在其中等待的通道, 實(shí)際是一個(gè)系統(tǒng)調(diào)用的地址. 如果你需要文本格式的, 也可以在名字列表中找到. (如果有最新版本的 /etc/psdatabase, 你可以在 ps -l 的結(jié)果中的 WCHAN 域看到)
- cpuinfo
- 保存了CPU 以及體系架構(gòu)依賴條目的列表. 對(duì)于不同的系統(tǒng)架構(gòu)有不同的列表, 共有的兩項(xiàng)是 cpu 和 BogoMIPS, cpu 可能是當(dāng)前在用的 CPU, 而 BogoMIPS 則是內(nèi)核初始化時(shí)計(jì)算出的一個(gè)系統(tǒng)常數(shù).
- devices
- 主設(shè)備號(hào)及設(shè)備組的列表, 文本格式. MAKEDEV 腳本使用該文件來維持內(nèi)核的一致性.
- dma
- 一個(gè)列表, 指出正在使用的ISA DMA (直接內(nèi)存訪問)通道.
- filesystems
- 以文本格式列出了被編譯進(jìn)內(nèi)核的文件系統(tǒng). 當(dāng)沒有給 mount(1) 指明哪個(gè)文件系統(tǒng)的時(shí)候, mount(1) 就依靠該文件遍歷不同的文件系統(tǒng).
- interrupts
- 該文件以 ASCII 格式記錄了(至少是在 i386 體系上的)每次 IRQ 的中斷數(shù)目.
- ioports
- 該文件列出了當(dāng)前在用的已注冊(cè) I/O 端口范圍.
- kcore
- 該偽文件以 core 文件格式給出了系統(tǒng)的物理內(nèi)存映象, 再利用未卸載的內(nèi)核 (/usr/src/linux/tools/zSystem), 我們就可以用 GDB 查探當(dāng)前內(nèi)核的任意數(shù)據(jù)結(jié)構(gòu).
該文件的總長度是物理內(nèi)存 (RAM) 的大小再加上 4KB.
- kmsg
- 可以用該文件取代系統(tǒng)調(diào)用 syslog(2) 來記錄內(nèi)核信息. 但是讀該文件需要超級(jí)用戶權(quán)限, 并且一次只能有一個(gè)進(jìn)程可以讀該文件, 因而如果一個(gè)使用了 syslog(2) 系統(tǒng)調(diào)用功能來記錄內(nèi)核信息的系統(tǒng)日志進(jìn)程正在運(yùn)行的話, 別的進(jìn)程就不能再去讀該偽文件了.
該文件的內(nèi)容可以用 dmesg(8) 來察看.
- ksyms
- 該文件保存了內(nèi)核輸出的
posted on 2010-03-08 22:40
deercoder 閱讀(1382)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Linux/Unix