mirror of https://github.com/mkerrisk/man-pages
167 lines
5.0 KiB
Groff
167 lines
5.0 KiB
Groff
.\" Copyright 1993 Rickard E. Faith (faith@cs.unc.edu)
|
|
.\"
|
|
.\" %%%LICENSE_START(VERBATIM)
|
|
.\" Permission is granted to make and distribute verbatim copies of this
|
|
.\" manual provided the copyright notice and this permission notice are
|
|
.\" preserved on all copies.
|
|
.\"
|
|
.\" Permission is granted to copy and distribute modified versions of this
|
|
.\" manual under the conditions for verbatim copying, provided that the
|
|
.\" entire resulting derived work is distributed under the terms of a
|
|
.\" permission notice identical to this one.
|
|
.\"
|
|
.\" Since the Linux kernel and libraries are constantly changing, this
|
|
.\" manual page may be incorrect or out-of-date. The author(s) assume no
|
|
.\" responsibility for errors or omissions, or for damages resulting from
|
|
.\" the use of the information contained herein. The author(s) may not
|
|
.\" have taken the same level of care in the production of this manual,
|
|
.\" which is licensed free of charge, as they might when working
|
|
.\" professionally.
|
|
.\"
|
|
.\" Formatted or processed versions of this manual, if unaccompanied by
|
|
.\" the source, must acknowledge the copyright and authors of this work.
|
|
.\" %%%LICENSE_END
|
|
.\"
|
|
.TH GETPID 2 2019-03-06 "Linux" "Linux Programmer's Manual"
|
|
.SH NAME
|
|
getpid, getppid \- get process identification
|
|
.SH SYNOPSIS
|
|
.B #include <sys/types.h>
|
|
.br
|
|
.B #include <unistd.h>
|
|
.PP
|
|
.B pid_t getpid(void);
|
|
.br
|
|
.B pid_t getppid(void);
|
|
.SH DESCRIPTION
|
|
.BR getpid ()
|
|
returns the process ID (PID) of the calling process.
|
|
(This is often used by
|
|
routines that generate unique temporary filenames.)
|
|
.PP
|
|
.BR 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
|
|
.BR fork (),
|
|
or, if that process has already terminated,
|
|
the ID of the process to which this process has been reparented (either
|
|
.BR init (1)
|
|
or a "subreaper" process defined via the
|
|
.BR prctl (2)
|
|
.BR PR_SET_CHILD_SUBREAPER
|
|
operation).
|
|
.SH ERRORS
|
|
These functions are always successful.
|
|
.SH CONFORMING TO
|
|
POSIX.1-2001, POSIX.1-2008, 4.3BSD, SVr4.
|
|
.SH NOTES
|
|
If the caller's parent is in a different PID namespace (see
|
|
.BR pid_namespaces (7)),
|
|
.BR getppid ()
|
|
returns 0.
|
|
.PP
|
|
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
|
|
.BR gettid (2)
|
|
and the discussion of the
|
|
.BR CLONE_THREAD
|
|
flag in
|
|
.BR clone (2).
|
|
.\"
|
|
.SS C library/kernel differences
|
|
From glibc version 2.3.4 up to and including version 2.24,
|
|
the glibc wrapper function for
|
|
.BR getpid ()
|
|
cached PIDs,
|
|
with the goal of avoiding additional system calls when a process calls
|
|
.BR getpid ()
|
|
repeatedly.
|
|
Normally this caching was invisible,
|
|
but its correct operation relied on support in the wrapper functions for
|
|
.BR fork (2),
|
|
.BR vfork (2),
|
|
and
|
|
.BR clone (2):
|
|
if an application bypassed the glibc wrappers for these system calls by using
|
|
.BR syscall (2),
|
|
then a call to
|
|
.BR getpid ()
|
|
in the child would return the wrong value
|
|
(to be precise: it would return the PID of the parent process).
|
|
.\" The following program demonstrates this "feature":
|
|
.\"
|
|
.\" #define _GNU_SOURCE
|
|
.\" #include <sys/syscall.h>
|
|
.\" #include <sys/wait.h>
|
|
.\" #include <stdio.h>
|
|
.\" #include <stdlib.h>
|
|
.\" #include <unistd.h>
|
|
.\"
|
|
.\" int
|
|
.\" main(int argc, char *argv[])
|
|
.\" {
|
|
.\" /* The following statement fills the getpid() cache */
|
|
.\"
|
|
.\" printf("parent PID = %ld\n", (long) getpid());
|
|
.\"
|
|
.\" if (syscall(SYS_fork) == 0) {
|
|
.\" if (getpid() != syscall(SYS_getpid))
|
|
.\" printf("child getpid() mismatch: getpid()=%ld; "
|
|
.\" "syscall(SYS_getpid)=%ld\n",
|
|
.\" (long) getpid(), (long) syscall(SYS_getpid));
|
|
.\" exit(EXIT_SUCCESS);
|
|
.\" }
|
|
.\" wait(NULL);
|
|
.\"}
|
|
In addition, there were cases where
|
|
.BR getpid ()
|
|
could return the wrong value even when invoking
|
|
.BR clone (2)
|
|
via the glibc wrapper function.
|
|
(For a discussion of one such case, see BUGS in
|
|
.BR clone (2).)
|
|
Furthermore, the complexity of the caching code had been
|
|
the source of a few bugs within glibc over the years.
|
|
.PP
|
|
Because of the aforementioned problems,
|
|
since glibc version 2.25, the PID cache is removed:
|
|
.\" commit c579f48edba88380635ab98cb612030e3ed8691e
|
|
.\" https://sourceware.org/glibc/wiki/Release/2.25#pid_cache_removal
|
|
calls to
|
|
.BR getpid ()
|
|
always invoke the actual system call, rather than returning a cached value.
|
|
.\" FIXME .
|
|
.\" Review progress of https://bugzilla.redhat.com/show_bug.cgi?id=1469757
|
|
.PP
|
|
On Alpha, instead of a pair of
|
|
.BR getpid ()
|
|
and
|
|
.BR getppid ()
|
|
system calls, a single
|
|
.BR getxpid ()
|
|
system call is provided, which returns a pair of PID and parent PID.
|
|
The glibc
|
|
.BR getpid ()
|
|
and
|
|
.BR getppid ()
|
|
wrapper functions transparently deal with this.
|
|
See
|
|
.BR syscall (2)
|
|
for details regarding register mapping.
|
|
.SH SEE ALSO
|
|
.BR clone (2),
|
|
.BR fork (2),
|
|
.BR gettid (2),
|
|
.BR kill (2),
|
|
.BR exec (3),
|
|
.BR mkstemp (3),
|
|
.BR tempnam (3),
|
|
.BR tmpfile (3),
|
|
.BR tmpnam (3),
|
|
.BR credentials (7),
|
|
.BR pid_namespaces (7)
|