實作 lsof

高等 UNIX 程式設計 HW1

  • 這篇是用來記錄 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 是讀 ./mapsfd 則是 /proc/[pid]/fd/[fd] 丟進 readlink()

Node

  • 把檔名丟進 stat() 得到 st_ino

Type

  • 把檔名丟進 stat() 得到 st_mod
  • 然後要注意 socketpipe 的 Type。
Licensed under CC BY-NC-ND
Built with Hugo
Theme Stack designed by Jimmy