概述
执行ls -all $(which pidof)
,结果如下:
1 | lrwxrwxrwx 1 root root 14 May 19 2021 /usr/bin/pidof -> /sbin/killall5 |
核心代码
Linux man page
pidof(8)_ find process ID of running program - Linux man page
Notes
pidof is actually the same program as killall5; the program behaves according to the name under which it is called.
When pidof is invoked with a full pathname to the program it should find the pid of, it is reasonably safe. Otherwise it is possible that it returns pids of running programs that happen to have the same name as the program you’re after but are actually other programs. Note that that the executable name of running processes is calculated with readlink(2), so symbolic links to executables will also match.
pidof
实际上就是killall5
,通过调用名称来执行不同操作。
源码:
1 | /* Get program name. */ |
main_pidof
行为分析
使用strace
打印系统调用,strace pidof 1
:
1 | openat(AT_FDCWD, "156204/stat", O_RDONLY) = 4 |
遍历/proc/
,读取了/proc/$pid/stat
、/proc/$pid/cmdline
的文件内容,以及/proc/$pid/exe
的符号链接。
源码
- 先调用
readproc
,fopen
/proc/$pid/stat
和/proc/$pid/cmdline
- 再调用
pidof
,readlink
/proc/$pid/exe