- 這篇是用來記錄 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。