Linux系统调用:获取进程PID

Posted shadowgully

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统调用:获取进程PID相关的知识,希望对你有一定的参考价值。

1.获取进程ID

每个进程都有一个唯一的非零进程PID,下面是得到这个PID的函数原型及相关头文件:

#include<sys/types.h>//pid_t定义在这个头文件中
#include<unistd.h>   //意为unix std,是POSIX标准定义的,包含许多系统服务的函数原型
pid_t getpid(void);//返回调用进程的PID
pid_t getppid(void);//返回父进程的PID
//pid_t 在types.h中被定义为int

使用示例:

//a.c
#include<sys/types.h>
#include<unistd.h>
int main()
{
	printf("pid: %d
",getpid());
	printf("ppid: %d
",getppid());
}
/*
	gcc -o getpid a.c
	./getpid
	重复多次可以发现每次运行结果中pid是不断变化的,可见每次创建进程随机分配一个pid
	但是ppid每次都是一样的,由此可见每次创建这个进程的进程(即父进程)是同一个。
*/

得到的ppid是一个正整数,在我的机器上是24176.

在/proc目录下可以看到很多进程的信息

linux> cd /proc
linux> ls
#找到示例运行得到的ppid
linux> cd 24176                       #进入进程信息目录
linux> ll                             #或ls -l
#下面是我得到的结果
total 0
dr-xr-xr-x  9 root root 0 Apr 19 13:45 .
dr-xr-xr-x 92 root root 0 May 22  2019 ..
dr-xr-xr-x  2 root root 0 Apr 19 13:55 attr
-rw-r--r--  1 root root 0 Apr 19 13:55 autogroup
-r--------  1 root root 0 Apr 19 13:55 auxv
-r--r--r--  1 root root 0 Apr 19 13:55 cgroup
--w-------  1 root root 0 Apr 19 13:55 clear_refs
-r--r--r--  1 root root 0 Apr 19 13:45 cmdline
-rw-r--r--  1 root root 0 Apr 19 13:55 comm
-rw-r--r--  1 root root 0 Apr 19 13:55 coredump_filter
-r--r--r--  1 root root 0 Apr 19 13:55 cpuset
lrwxrwxrwx  1 root root 0 Apr 19 13:55 cwd -> /proc/24176
-r--------  1 root root 0 Apr 19 13:55 environ
lrwxrwxrwx  1 root root 0 Apr 19 13:45 exe -> /usr/bin/bash
#看到这个bash,我猜测这个进程极有可能就是linux shell,即shell是我们的程序对应进程的父进程
dr-x------  2 root root 0 Apr 19 13:45 fd
dr-x------  2 root root 0 Apr 19 13:55 fdinfo
-rw-r--r--  1 root root 0 Apr 19 13:55 gid_map
-r--------  1 root root 0 Apr 19 13:55 io
-r--r--r--  1 root root 0 Apr 19 13:55 limits
-rw-r--r--  1 root root 0 Apr 19 13:55 loginuid
dr-x------  2 root root 0 Apr 19 13:55 map_files
-r--r--r--  1 root root 0 Apr 19 13:55 maps
-rw-------  1 root root 0 Apr 19 13:55 mem
-r--r--r--  1 root root 0 Apr 19 13:55 mountinfo
-r--r--r--  1 root root 0 Apr 19 13:55 mounts
-r--------  1 root root 0 Apr 19 13:55 mountstats
dr-xr-xr-x  5 root root 0 Apr 19 13:55 net
dr-x--x--x  2 root root 0 Apr 19 13:55 ns
-r--r--r--  1 root root 0 Apr 19 13:55 numa_maps
-rw-r--r--  1 root root 0 Apr 19 13:55 oom_adj
-r--r--r--  1 root root 0 Apr 19 13:55 oom_score
-rw-r--r--  1 root root 0 Apr 19 13:55 oom_score_adj
-r--r--r--  1 root root 0 Apr 19 13:55 pagemap
-r--r--r--  1 root root 0 Apr 19 13:55 personality
-rw-r--r--  1 root root 0 Apr 19 13:55 projid_map
lrwxrwxrwx  1 root root 0 Apr 19 13:55 root -> /
-rw-r--r--  1 root root 0 Apr 19 13:55 sched
-r--r--r--  1 root root 0 Apr 19 13:55 schedstat
-r--r--r--  1 root root 0 Apr 19 13:55 sessionid
-rw-r--r--  1 root root 0 Apr 19 13:55 setgroups
-r--r--r--  1 root root 0 Apr 19 13:55 smaps
-r--r--r--  1 root root 0 Apr 19 13:55 stack
-r--r--r--  1 root root 0 Apr 19 13:45 stat
-r--r--r--  1 root root 0 Apr 19 13:55 statm
-r--r--r--  1 root root 0 Apr 19 13:45 status
-r--r--r--  1 root root 0 Apr 19 13:55 syscall
dr-xr-xr-x  3 root root 0 Apr 19 13:55 task
-r--r--r--  1 root root 0 Apr 19 13:55 timers
-rw-r--r--  1 root root 0 Apr 19 13:55 uid_map
-r--r--r--  1 root root 0 Apr 19 13:55 wchan

总结

pid_t getpid(void);//返回当前进程pid
pid_t getppid(void);//返回父进程pid

以上是关于Linux系统调用:获取进程PID的主要内容,如果未能解决你的问题,请参考以下文章

linux应用中,在一个进程内如何获取本进程内其它线程的堆栈信息、

Linux进程概念

linux-系统调用

Linux——进程概念(上)

Linux进程pid分配法

Linux进程概念(精讲)