summaryrefslogtreecommitdiffstats
path: root/man2/fork.2
diff options
context:
space:
mode:
Diffstat (limited to 'man2/fork.2')
-rw-r--r--man2/fork.2348
1 files changed, 0 insertions, 348 deletions
diff --git a/man2/fork.2 b/man2/fork.2
deleted file mode 100644
index abfbbed..0000000
--- a/man2/fork.2
+++ /dev/null
@@ -1,348 +0,0 @@
-.\" Copyright (C) 2006 Michael Kerrisk <mtk.manpages@gmail.com>
-.\" A few fragments remain from an earlier (1992) page by
-.\" Drew Eckhardt (drew@cs.colorado.edu),
-.\"
-.\" SPDX-License-Identifier: Linux-man-pages-copyleft
-.\"
-.\" Modified by Michael Haardt (michael@moria.de)
-.\" Modified Sat Jul 24 13:22:07 1993 by Rik Faith (faith@cs.unc.edu)
-.\" Modified 21 Aug 1994 by Michael Chastain (mec@shell.portal.com):
-.\" Referenced 'clone(2)'.
-.\" Modified 1995-06-10, 1996-04-18, 1999-11-01, 2000-12-24
-.\" by Andries Brouwer (aeb@cwi.nl)
-.\" Modified, 27 May 2004, Michael Kerrisk <mtk.manpages@gmail.com>
-.\" Added notes on capability requirements
-.\" 2006-09-04, Michael Kerrisk
-.\" Greatly expanded, to describe all attributes that differ
-.\" parent and child.
-.\"
-.TH fork 2 2023-10-31 "Linux man-pages 6.7"
-.SH NAME
-fork \- create a child process
-.SH LIBRARY
-Standard C library
-.RI ( libc ", " \-lc )
-.SH SYNOPSIS
-.nf
-.B #include <unistd.h>
-.P
-.B pid_t fork(void);
-.fi
-.SH DESCRIPTION
-.BR fork ()
-creates a new process by duplicating the calling process.
-The new process is referred to as the
-.I child
-process.
-The calling process is referred to as the
-.I parent
-process.
-.P
-The child process and the parent process run in separate memory spaces.
-At the time of
-.BR fork ()
-both memory spaces have the same content.
-Memory writes, file mappings
-.RB ( mmap (2)),
-and unmappings
-.RB ( munmap (2))
-performed by one of the processes do not affect the other.
-.P
-The child process is an exact duplicate of the parent
-process except for the following points:
-.IP \[bu] 3
-The child has its own unique process ID,
-and this PID does not match the ID of any existing process group
-.RB ( setpgid (2))
-or session.
-.IP \[bu]
-The child's parent process ID is the same as the parent's process ID.
-.IP \[bu]
-The child does not inherit its parent's memory locks
-.RB ( mlock (2),
-.BR mlockall (2)).
-.IP \[bu]
-Process resource utilizations
-.RB ( getrusage (2))
-and CPU time counters
-.RB ( times (2))
-are reset to zero in the child.
-.IP \[bu]
-The child's set of pending signals is initially empty
-.RB ( sigpending (2)).
-.IP \[bu]
-The child does not inherit semaphore adjustments from its parent
-.RB ( semop (2)).
-.IP \[bu]
-The child does not inherit process-associated record locks from its parent
-.RB ( fcntl (2)).
-(On the other hand, it does inherit
-.BR fcntl (2)
-open file description locks and
-.BR flock (2)
-locks from its parent.)
-.IP \[bu]
-The child does not inherit timers from its parent
-.RB ( setitimer (2),
-.BR alarm (2),
-.BR timer_create (2)).
-.IP \[bu]
-The child does not inherit outstanding asynchronous I/O operations
-from its parent
-.RB ( aio_read (3),
-.BR aio_write (3)),
-nor does it inherit any asynchronous I/O contexts from its parent (see
-.BR io_setup (2)).
-.P
-The process attributes in the preceding list are all specified
-in POSIX.1.
-The parent and child also differ with respect to the following
-Linux-specific process attributes:
-.IP \[bu] 3
-The child does not inherit directory change notifications (dnotify)
-from its parent
-(see the description of
-.B F_NOTIFY
-in
-.BR fcntl (2)).
-.IP \[bu]
-The
-.BR prctl (2)
-.B PR_SET_PDEATHSIG
-setting is reset so that the child does not receive a signal
-when its parent terminates.
-.IP \[bu]
-The default timer slack value is set to the parent's
-current timer slack value.
-See the description of
-.B PR_SET_TIMERSLACK
-in
-.BR prctl (2).
-.IP \[bu]
-Memory mappings that have been marked with the
-.BR madvise (2)
-.B MADV_DONTFORK
-flag are not inherited across a
-.BR fork ().
-.IP \[bu]
-Memory in address ranges that have been marked with the
-.BR madvise (2)
-.B MADV_WIPEONFORK
-flag is zeroed in the child after a
-.BR fork ().
-(The
-.B MADV_WIPEONFORK
-setting remains in place for those address ranges in the child.)
-.IP \[bu]
-The termination signal of the child is always
-.B SIGCHLD
-(see
-.BR clone (2)).
-.IP \[bu]
-The port access permission bits set by
-.BR ioperm (2)
-are not inherited by the child;
-the child must turn on any bits that it requires using
-.BR ioperm (2).
-.P
-Note the following further points:
-.IP \[bu] 3
-The child process is created with a single thread\[em]the
-one that called
-.BR fork ().
-The entire virtual address space of the parent is replicated in the child,
-including the states of mutexes, condition variables,
-and other pthreads objects; the use of
-.BR pthread_atfork (3)
-may be helpful for dealing with problems that this can cause.
-.IP \[bu]
-After a
-.BR fork ()
-in a multithreaded program,
-the child can safely call only async-signal-safe functions (see
-.BR signal\-safety (7))
-until such time as it calls
-.BR execve (2).
-.IP \[bu]
-The child inherits copies of the parent's set of open file descriptors.
-Each file descriptor in the child refers to the same
-open file description (see
-.BR open (2))
-as the corresponding file descriptor in the parent.
-This means that the two file descriptors share open file status flags,
-file offset,
-and signal-driven I/O attributes (see the description of
-.B F_SETOWN
-and
-.B F_SETSIG
-in
-.BR fcntl (2)).
-.IP \[bu]
-The child inherits copies of the parent's set of open message
-queue descriptors (see
-.BR mq_overview (7)).
-Each file descriptor in the child refers to the same
-open message queue description
-as the corresponding file descriptor in the parent.
-This means that the two file descriptors share the same flags
-.RI ( mq_flags ).
-.IP \[bu]
-The child inherits copies of the parent's set of open directory streams (see
-.BR opendir (3)).
-POSIX.1 says that the corresponding directory streams
-in the parent and child
-.I may
-share the directory stream positioning;
-on Linux/glibc they do not.
-.SH RETURN VALUE
-On success, the PID of the child process is returned in the parent,
-and 0 is returned in the child.
-On failure, \-1 is returned in the parent,
-no child process is created, and
-.I errno
-is set to indicate the error.
-.SH ERRORS
-.TP
-.B EAGAIN
-.\" NOTE! The following should match the description in pthread_create(3)
-A system-imposed limit on the number of threads was encountered.
-There are a number of limits that may trigger this error:
-.RS
-.IP \[bu] 3
-the
-.B RLIMIT_NPROC
-soft resource limit (set via
-.BR setrlimit (2)),
-which limits the number of processes and threads for a real user ID,
-was reached;
-.IP \[bu]
-the kernel's system-wide limit on the number of processes and threads,
-.IR /proc/sys/kernel/threads\-max ,
-was reached (see
-.BR proc (5));
-.IP \[bu]
-the maximum number of PIDs,
-.IR /proc/sys/kernel/pid_max ,
-was reached (see
-.BR proc (5));
-or
-.IP \[bu]
-the PID limit
-.RI ( pids.max )
-imposed by the cgroup "process number" (PIDs) controller was reached.
-.RE
-.TP
-.B EAGAIN
-The caller is operating under the
-.B SCHED_DEADLINE
-scheduling policy and does not have the reset-on-fork flag set.
-See
-.BR sched (7).
-.TP
-.B ENOMEM
-.BR fork ()
-failed to allocate the necessary kernel structures because memory is tight.
-.TP
-.B ENOMEM
-An attempt was made to create a child process in a PID namespace
-whose "init" process has terminated.
-See
-.BR pid_namespaces (7).
-.TP
-.B ENOSYS
-.BR fork ()
-is not supported on this platform (for example,
-.\" e.g., arm (optionally), blackfin, c6x, frv, h8300, microblaze, xtensa
-hardware without a Memory-Management Unit).
-.TP
-.BR ERESTARTNOINTR " (since Linux 2.6.17)"
-.\" commit 4a2c7a7837da1b91468e50426066d988050e4d56
-System call was interrupted by a signal and will be restarted.
-(This can be seen only during a trace.)
-.SH VERSIONS
-.SS C library/kernel differences
-Since glibc 2.3.3,
-.\" nptl/sysdeps/unix/sysv/linux/fork.c
-rather than invoking the kernel's
-.BR fork ()
-system call,
-the glibc
-.BR fork ()
-wrapper that is provided as part of the
-NPTL threading implementation invokes
-.BR clone (2)
-with flags that provide the same effect as the traditional system call.
-(A call to
-.BR fork ()
-is equivalent to a call to
-.BR clone (2)
-specifying
-.I flags
-as just
-.BR SIGCHLD .)
-The glibc wrapper invokes any fork handlers that have been
-established using
-.BR pthread_atfork (3).
-.\" and does some magic to ensure that getpid(2) returns the right value.
-.SH STANDARDS
-POSIX.1-2008.
-.SH HISTORY
-POSIX.1-2001, SVr4, 4.3BSD.
-.SH NOTES
-Under Linux,
-.BR fork ()
-is implemented using copy-on-write pages, so the only penalty that it incurs
-is the time and memory required to duplicate the parent's page tables,
-and to create a unique task structure for the child.
-.SH EXAMPLES
-See
-.BR pipe (2)
-and
-.BR wait (2)
-for more examples.
-.P
-.\" SRC BEGIN (fork.c)
-.EX
-#include <signal.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-\&
-int
-main(void)
-{
- pid_t pid;
-\&
- if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) {
- perror("signal");
- exit(EXIT_FAILURE);
- }
- pid = fork();
- switch (pid) {
- case \-1:
- perror("fork");
- exit(EXIT_FAILURE);
- case 0:
- puts("Child exiting.");
- exit(EXIT_SUCCESS);
- default:
- printf("Child is PID %jd\en", (intmax_t) pid);
- puts("Parent exiting.");
- exit(EXIT_SUCCESS);
- }
-}
-.EE
-.\" SRC END
-.SH SEE ALSO
-.BR clone (2),
-.BR execve (2),
-.BR exit (2),
-.BR setrlimit (2),
-.BR unshare (2),
-.BR vfork (2),
-.BR wait (2),
-.BR daemon (3),
-.BR pthread_atfork (3),
-.BR capabilities (7),
-.BR credentials (7)