程序实现思想:
Linux 系统的进程号是保存在 /proc 目录下的,一个在 linux 系统上运行的程序,只要是在运行状态下,就必然会在 /proc 目录下写入一批文件,其文件写入的方式如下:
/proc/<进程ID>/文件组
这里面的文件组是指一批文件,不是指一个文件,大致的文件名信息如下:
比如,我们运行了一个程序 tt ,假设其进程号为 31673 ,则在 /proc 目录下会形成 /proc/31673/ 的目录,且在其目录下存在上述的文件组。这个里面,我们需要的文件为 status ,该文件保存的是 tt 当前运行得状态,我们来看看这个文件的内容:
我们发现,这个文件的第一行就是文件名,有了这个东西,那我们就有了获取当前正在运行的特定程序的进程号的办法了。
基本的解决思路是——我们通过遍历 /proc 目录下所有用数字作为目录名的子目录,依次打开这些目录下的 status 文件,获取其中的第一行内容,并从中获取对应的 Name 节的信息,与我们传入的需要查询的程序名字进行比较,如果一致,则该目录的数字就是该程序的进程号。
Linux 系统的进程号是保存在 /proc 目录下的,一个在 linux 系统上运行的程序,只要是在运行状态下,就必然会在 /proc 目录下写入一批文件,其文件写入的方式如下:
/proc/<进程ID>/文件组
这里面的文件组是指一批文件,不是指一个文件,大致的文件名信息如下:
- dr-xr-xr-x 2 work work 0 09-21 00:51 attr
- -r-------- 1 work work 0 09-21 00:51 auxv
- -r--r--r-- 1 work work 0 09-21 00:51 cmdline
- -rw-r--r-- 1 work work 0 09-21 00:51 coredump_filter
- -r--r--r-- 1 work work 0 09-21 00:51 cpuset
- lrwxrwxrwx 1 work work 0 09-21 00:51 cwd -> /home/work/tmp
- -r-------- 1 work work 0 09-21 00:51 environ
- lrwxrwxrwx 1 work work 0 09-21 00:51 exe -> /home/work/tmp/tt
- dr-x------ 2 work work 0 09-21 00:51 fd
- dr-x------ 2 work work 0 09-21 00:51 fdinfo
- -r-------- 1 work work 0 09-21 00:51 io
- -r--r--r-- 1 work work 0 09-21 00:51 limits
- -rw-r--r-- 1 work work 0 09-21 00:51 loginuid
- -r--r--r-- 1 work work 0 09-21 00:51 maps
- -rw------- 1 work work 0 09-21 00:51 mem
- -r--r--r-- 1 work work 0 09-21 00:51 mounts
- -r-------- 1 work work 0 09-21 00:51 mountstats
- -r--r--r-- 1 work work 0 09-21 00:51 numa_maps
- -rw-r--r-- 1 work work 0 09-21 00:51 oom_adj
- -r--r--r-- 1 work work 0 09-21 00:51 oom_score
- lrwxrwxrwx 1 work work 0 09-21 00:51 root -> /
- -r--r--r-- 1 work work 0 09-21 00:51 schedstat
- -r--r--r-- 1 work work 0 09-21 00:51 smaps
- -r--r--r-- 1 work work 0 09-21 00:51 stat
- -r--r--r-- 1 work work 0 09-21 00:51 statm
- -r--r--r-- 1 work work 0 09-21 00:51 status
- dr-xr-xr-x 3 work work 0 09-21 00:51 task
- -r--r--r-- 1 work work 0 09-21 00:51 wchan
- Name: tt
- State: S (sleeping)
- SleepAVG: 98%
- Tgid: 31673
- Pid: 31673
- PPid: 7977
- TracerPid: 0
- Uid: 500 500 500 500
- Gid: 500 500 500 500
- FDSize: 256
- Groups: 500
- VmPeak: 3828 kB
- VmSize: 3664 kB
- VmLck: 0 kB
- VmHWM: 300 kB
- VmRSS: 300 kB
- VmData: 44 kB
- VmStk: 88 kB
- VmExe: 4 kB
- VmLib: 1448 kB
- VmPTE: 32 kB
- StaBrk: 09e04000 kB
- Brk: 09e04000 kB
- StaStk: 7ffff0e895d0 kB
- Threads: 1
- SigQ: 0/8192
- SigPnd: 0000000000000000
- ShdPnd: 0000000000000000
- SigBlk: 0000000000000000
- SigIgn: 0000000000000000
- SigCgt: 0000000000000000
- CapInh: 0000000000000000
- CapPrm: 0000000000000000
- CapEff: 0000000000000000
- Cpus_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,ffffffff
- Mems_allowed: 00000000,00000001
基本的解决思路是——我们通过遍历 /proc 目录下所有用数字作为目录名的子目录,依次打开这些目录下的 status 文件,获取其中的第一行内容,并从中获取对应的 Name 节的信息,与我们传入的需要查询的程序名字进行比较,如果一致,则该目录的数字就是该程序的进程号。
- /* find_pid_by_name()
- *
- * This finds the pid of the specified process.
- * Currently, it's implemented by rummaging through
- * the proc filesystem.
- * Returns a list of all matching PIDs
- */
-
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h