C 编程获取正在运行的程序进程号

程序实现思想:Linux 系统的进程号是保存在 /proc 目录下的,一个在 linux 系统上运行的程序,只要是在运行状态下,就必然会在 /proc 目录下写入一批文件,其文件写入的方式如下:/proc//文件组这里面的文件组是指一批文件,不是指一个文件,大致的文件名信息如下:dr-xr-xr-x 2 work work 0 09-21 00:51 attr-r-------- 1
摘要由CSDN通过智能技术生成
程序实现思想:
Linux 系统的进程号是保存在 /proc 目录下的,一个在 linux 系统上运行的程序,只要是在运行状态下,就必然会在 /proc 目录下写入一批文件,其文件写入的方式如下:

/proc/<进程ID>/文件组

这里面的文件组是指一批文件,不是指一个文件,大致的文件名信息如下:
  1. dr-xr-xr-x 2 work work 0 09-21 00:51 attr
  2. -r-------- 1 work work 0 09-21 00:51 auxv
  3. -r--r--r-- 1 work work 0 09-21 00:51 cmdline
  4. -rw-r--r-- 1 work work 0 09-21 00:51 coredump_filter
  5. -r--r--r-- 1 work work 0 09-21 00:51 cpuset
  6. lrwxrwxrwx 1 work work 0 09-21 00:51 cwd -> /home/work/tmp
  7. -r-------- 1 work work 0 09-21 00:51 environ
  8. lrwxrwxrwx 1 work work 0 09-21 00:51 exe -> /home/work/tmp/tt
  9. dr-x------ 2 work work 0 09-21 00:51 fd
  10. dr-x------ 2 work work 0 09-21 00:51 fdinfo
  11. -r-------- 1 work work 0 09-21 00:51 io
  12. -r--r--r-- 1 work work 0 09-21 00:51 limits
  13. -rw-r--r-- 1 work work 0 09-21 00:51 loginuid
  14. -r--r--r-- 1 work work 0 09-21 00:51 maps
  15. -rw------- 1 work work 0 09-21 00:51 mem
  16. -r--r--r-- 1 work work 0 09-21 00:51 mounts
  17. -r-------- 1 work work 0 09-21 00:51 mountstats
  18. -r--r--r-- 1 work work 0 09-21 00:51 numa_maps
  19. -rw-r--r-- 1 work work 0 09-21 00:51 oom_adj
  20. -r--r--r-- 1 work work 0 09-21 00:51 oom_score
  21. lrwxrwxrwx 1 work work 0 09-21 00:51 root -> /
  22. -r--r--r-- 1 work work 0 09-21 00:51 schedstat
  23. -r--r--r-- 1 work work 0 09-21 00:51 smaps
  24. -r--r--r-- 1 work work 0 09-21 00:51 stat
  25. -r--r--r-- 1 work work 0 09-21 00:51 statm
  26. -r--r--r-- 1 work work 0 09-21 00:51 status
  27. dr-xr-xr-x 3 work work 0 09-21 00:51 task
  28. -r--r--r-- 1 work work 0 09-21 00:51 wchan
比如,我们运行了一个程序 tt ,假设其进程号为 31673 ,则在 /proc 目录下会形成 /proc/31673/ 的目录,且在其目录下存在上述的文件组。这个里面,我们需要的文件为 status ,该文件保存的是 tt 当前运行得状态,我们来看看这个文件的内容:

  1. Name: tt
  2. State: S (sleeping)
  3. SleepAVG: 98%
  4. Tgid: 31673
  5. Pid: 31673
  6. PPid: 7977
  7. TracerPid: 0
  8. Uid: 500 500 500 500
  9. Gid: 500 500 500 500
  10. FDSize: 256
  11. Groups: 500
  12. VmPeak: 3828 kB
  13. VmSize: 3664 kB
  14. VmLck: 0 kB
  15. VmHWM: 300 kB
  16. VmRSS: 300 kB
  17. VmData: 44 kB
  18. VmStk: 88 kB
  19. VmExe: 4 kB
  20. VmLib: 1448 kB
  21. VmPTE: 32 kB
  22. StaBrk: 09e04000 kB
  23. Brk: 09e04000 kB
  24. StaStk: 7ffff0e895d0 kB
  25. Threads: 1
  26. SigQ: 0/8192
  27. SigPnd: 0000000000000000
  28. ShdPnd: 0000000000000000
  29. SigBlk: 0000000000000000
  30. SigIgn: 0000000000000000
  31. SigCgt: 0000000000000000
  32. CapInh: 0000000000000000
  33. CapPrm: 0000000000000000
  34. CapEff: 0000000000000000
  35. Cpus_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,ffffffff
  36. Mems_allowed: 00000000,00000001
我们发现,这个文件的第一行就是文件名,有了这个东西,那我们就有了获取当前正在运行的特定程序的进程号的办法了。
基本的解决思路是——我们通过遍历 /proc 目录下所有用数字作为目录名的子目录,依次打开这些目录下的 status 文件,获取其中的第一行内容,并从中获取对应的 Name 节的信息,与我们传入的需要查询的程序名字进行比较,如果一致,则该目录的数字就是该程序的进程号。

  1. /* find_pid_by_name()
  2.  *
  3.  * This finds the pid of the specified process.
  4.  * Currently, it's implemented by rummaging through
  5.  * the proc filesystem.
  6.  * Returns a list of all matching PIDs
  7.  */

  8. #include <unistd.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值