GETPID - Linux手册页
Linux程序员手册 第2部分
更新日期: 2019-03-06
名称
getpid,getppid-获取进程标识
语法
#包括
#包括
pid_t getpid(void);
pid_t getppid(void);
说明
getpid()返回调用进程的进程ID(PID)。 (通常由生成唯一临时文件名的例程使用。)
getppid()返回调用进程的父进程的进程ID。这将是使用fork()创建此进程的进程的ID,或者是该进程已经终止的(如果已终止)该进程的ID(init(1)或" subreaper"通过prctl(2)PR_SET_CHILD_SUBREAPER操作定义的进程)。
错误说明
这些功能总是成功的。
遵循规范
POSIX.1-2001,POSIX.1-2008、4.3BSD,SVr4。
备注
如果调用方的父级位于另一个PID名称空间中(请参见pid_namespaces(7)),则getppid()返回0。
从内核的角度来看,PID(由多线程进程中的所有线程共享)有时也称为线程组ID(TGID)。这与内核线程ID(TID)不同,后者对于每个线程都是唯一的。有关更多详细信息,请参见gettid(2)和对clone(2)中的CLONE_THREAD标志的讨论。
C library/kernel differences
从glibc 2.3.4版到2.24版(包括2.24版),该glibc包装函数用于getpid()缓存的PID,目的是避免在进程重复调用getpid()时避免其他系统调用。通常,此缓存是不可见的,但其正确操作依赖于fork(2),vfork(2)和clone(2)的包装函数的支持:如果应用程序通过使用syscall(2)绕过了这些系统调用的glibc包装器),那么在子级中对getpid()的调用将返回错误的值(准确地说:它将返回父级进程的PID)。另外,在某些情况下,即使通过glibc包装函数调用clone(2),getpid()仍可能返回错误的值。 (有关这种情况的讨论,请参见clone(2)中的BUGS。)此外,多年来,缓存代码的复杂性一直是glibc中一些错误的源头。
由于上述问题,从glibc 2.25版本开始,PID缓存已删除:对getpid()的调用始终会调用实际的系统调用,而不是返回缓存的值。
在Alpha上,提供了单个getxpid()系统调用,而不是一对getpid()和getppid()系统调用,该系统调用返回一对PID和父PID。 glibc的getpid()和getppid()包装函数透明地处理了这一点。有关寄存器映射的详细信息,请参见syscall(2)。
另外参见
clone(2),fork(2),gettid(2),kill(2),exec(3),mkstemp(3),tempnam(3),tmpfile(3),tmpnam(3),凭据(7), pid_namespaces(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。