GETPID - Linux手册页

时间:2019-08-20 17:58:50  来源:igfitidea点击:

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/