- 這篇是用來記錄 UNIX hw1 的實作坑。
- 實作時可能會因為不是 root 權限,而需要輸出
permission denied
。 - 這份功課有點吃字串處理技巧。
Goal
COMMAND PID USER FD TYPE NODE NAME
PID
- 先從
/proc
裡面撈出所有的 pid,然後再針對每個 pid 去撈剩下的資訊。
Command
- 從
/proc/[pid]/comm
讀寫。
User、UID
- 每個 pid 資料夾中的 user 都相同,於是只要用
stat()
去找/proc/[pid]
的st_uid
就行了,然後從/etc/passwd
撈出對應的 username。
FD
分成以下幾種:
cwd
- 從
proc/[pid]/cwd
裡找,因為是 symbolic link,所以用readlink()
讀出連接的檔名。
rtd
- 從
proc/[pid]/root
裡找,然後一樣用readlink()
。
txt
- 從
/proc/[pid]/exe
裡找,然後一樣用readlink()
。
mem
- 讀
/proc/[pid]/maps
。
[0-9]+[rwu]
從 /proc/[pid]/fdinfo/[fd]
裡讀取 flag,然後用 & O_O_ACCMODE
去區分是讀或寫。
Name
- 除了上述三種用
readlink()
以外,mem
是讀./maps
,fd
則是/proc/[pid]/fd/[fd]
丟進readlink()
。
Node
- 把檔名丟進
stat()
得到st_ino
。
Type
- 把檔名丟進
stat()
得到st_mod
。 - 然後要注意
socket
和pipe
的 Type。