---
name: "getppid"
section: "2"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/getpid"
---

# getppid(2)

get process identification

Part of [getpid(2)](/getpid/2.md).

## NAME

getpid, getppid - get process identification

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <unistd.h>
```

**pid\_t getpid(void);** **pid\_t getppid(void);**

## DESCRIPTION

**getpid**() returns the process ID (PID) of the calling process. (This is often used by routines that generate unique temporary filenames.)

**getppid**() returns the process ID of the parent of the calling process. This will be either the ID of the process that created this process using **fork**(), or, if that process has already terminated, the ID of the process to which this process has been reparented (either [**init**(1)](/init/1.md) or a "subreaper" process defined via the [**prctl**(2)](/prctl/2.md) **PR\_SET\_CHILD\_SUBREAPER** operation).

## ERRORS

These functions are always successful.

## VERSIONS

On Alpha, instead of a pair of **getpid**() and **getppid**() system calls, a single **getxpid**() system call is provided, which returns a pair of PID and parent PID. The glibc **getpid**() and **getppid**() wrapper functions transparently deal with this. See [**syscall**(2)](/syscall/2.md) for details regarding register mapping.

## STANDARDS

POSIX.1-2024.

## HISTORY

4\.3BSD, SVr4, POSIX.1-1988.

### C library/kernel differences

From glibc 2.3.4 up to and including glibc 2.24, the glibc wrapper function for **getpid**() cached PIDs, with the goal of avoiding additional system calls when a process calls **getpid**() repeatedly. Normally this caching was invisible, but its correct operation relied on support in the wrapper functions for [**fork**(2)](/fork/2.md), [**vfork**(2)](/vfork/2.md), and [**clone**(2)](/clone/2.md): if an application bypassed the glibc wrappers for these system calls by using [**syscall**(2)](/syscall/2.md), then a call to **getpid**() in the child would return the wrong value (to be precise: it would return the PID of the parent process). In addition, there were cases where **getpid**() could return the wrong value even when invoking [**clone**(2)](/clone/2.md) via the glibc wrapper function. (For a discussion of one such case, see BUGS in [**clone**(2)](/clone/2.md).) Furthermore, the complexity of the caching code had been the source of a few bugs within glibc over the years.

Because of the aforementioned problems, since glibc 2.25, the PID cache is removed: calls to **getpid**() always invoke the actual system call, rather than returning a cached value.

## NOTES

If the caller's parent is in a different PID namespace (see [**pid\_namespaces**(7)](/pid_namespaces/7.md)), **getppid**() returns 0.

From a kernel perspective, the PID (which is shared by all of the threads in a multithreaded process) is sometimes also known as the thread group ID (TGID). This contrasts with the kernel thread ID (TID), which is unique for each thread. For further details, see [**gettid**(2)](/gettid/2.md) and the discussion of the **CLONE\_THREAD** flag in [**clone**(2)](/clone/2.md).

## SEE ALSO

[**clone**(2)](/clone/2.md), [**fork**(2)](/fork/2.md), [**gettid**(2)](/gettid/2.md), [**kill**(2)](/kill/2.md), [**exec**(3)](/exec/3.md), [**mkstemp**(3)](/mkstemp/3.md), [**tempnam**(3)](/tempnam/3.md), [**tmpfile**(3)](/tmpfile/3.md), [**tmpnam**(3)](/tmpnam/3.md), [**credentials**(7)](/credentials/7.md), [**pid\_namespaces**(7)](/pid_namespaces/7.md)
