fork - Man Page

create a child process

Library

Standard C library (libc, -lc)

Synopsis

#include <unistd.h>

pid_t fork(void);

Description

fork() creates a new process by duplicating the calling process. The new process is referred to as the child process. The calling process is referred to as the parent process.

The child process and the parent process run in separate memory spaces. At the time of fork() both memory spaces have the same content. Memory writes, file mappings (mmap(2)), and unmappings (munmap(2)) performed by one of the processes do not affect the other.

The child process is an exact duplicate of the parent process except for the following points:

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:

Note the following further points:

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 errno is set to indicate the error.

Errors

EAGAIN

A system-imposed limit on the number of threads was encountered. There are a number of limits that may trigger this error:

  • the RLIMIT_NPROC soft resource limit (set via setrlimit(2)), which limits the number of processes and threads for a real user ID, was reached;
  • the kernel's system-wide limit on the number of processes and threads, /proc/sys/kernel/threads-max, was reached (see proc(5));
  • the maximum number of PIDs, /proc/sys/kernel/pid_max, was reached (see proc(5)); or
  • the PID limit (pids.max) imposed by the cgroup "process number" (PIDs) controller was reached.
EAGAIN

The caller is operating under the SCHED_DEADLINE scheduling policy and does not have the reset-on-fork flag set. See sched(7).

ENOMEM

fork() failed to allocate the necessary kernel structures because memory is tight.

ENOMEM

An attempt was made to create a child process in a PID namespace whose "init" process has terminated. See pid_namespaces(7).

ENOSYS

fork() is not supported on this platform (for example, hardware without a Memory-Management Unit).

ERESTARTNOINTR (since Linux 2.6.17)

System call was interrupted by a signal and will be restarted. (This can be seen only during a trace.)

Versions

C library/kernel differences

Since glibc 2.3.3, rather than invoking the kernel's fork() system call, the glibc fork() wrapper that is provided as part of the NPTL threading implementation invokes clone(2) with flags that provide the same effect as the traditional system call. (A call to fork() is equivalent to a call to clone(2) specifying flags as just SIGCHLD.) The glibc wrapper invokes any fork handlers that have been established using pthread_atfork(3).

Standards

POSIX.1-2008.

History

POSIX.1-2001, SVr4, 4.3BSD.

Notes

Under Linux, 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.

Examples

See pipe(2) and wait(2) for more examples.

#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.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\n", (intmax_t) pid);
        puts("Parent exiting.");
        exit(EXIT_SUCCESS);
    }
}

See Also

clone(2), execve(2), exit(2), setrlimit(2), unshare(2), vfork(2), wait(2), daemon(3), pthread_atfork(3), capabilities(7), credentials(7)

Referenced By

alarm(2), arch_prctl(2), atexit(3), bemenu(1), bpf(2), capabilities(7), cap_launch(3), cgroups(7), chdir(2), chroot(2), chrt(1), clone(2), collectd-exec(5), core(5), cpuset(7), credentials(7), daemon(3), dbpmda(1), environ(7), epic(1), epoll(7), eventfd(2), exec(3), execve(2), _exit(2), faxq.8c(8), fcntl(2), flock(2), fork.3am(3), getitimer(2), getpid(2), getpriority(2), getrlimit(2), gettid(2), gsisshd(8), guestfs-hacking(1), guestfs-release-notes-1.34(1), halockrun(1), hylafax-log.5f(5), ibv_fork_init(3), ibv_is_fork_initialized(3), inn.conf(5), ioperm(2), iopl(2), iv_signal(3), jemalloc(3), kcmp(2), keyctl(2), ksh93(1), lei-daemon(8), libpipeline(3), lseek(2), lslocks(8), ltrace(1), lttng-sessiond(8), lttng-ust(3), madvise(2), memfd_create(2), memfd_secret(2), mlock(2), mm(3), mmap(2), mount(2), mq_overview(7), nbd_get_subprocess_pid(3), nice(2), nvidia-modprobe(1), on_exit(3), open(2), openarc.conf(5), opendkim(8), opendkim.conf(5), opendmarc(8), opendmarc.conf(5), openpty(3), OPENSSL_fork_prepare.3ossl(3), pam_end(3), pam_set_data(3), perf_event_open(2), perlfunc(1), perlintern(1), persistent-keyring(7), picocom(1), pidfd_open(2), pid_namespaces(7), pipe(2), pipe(7), pmcd(1), __pmProcessAddArg(3), __pmProcessPipe(3), popen(3), posix_spawn(3), powerstat(8), proc_pid_oom_score(5), proc_sys_kernel(5), pthread_atfork(3), pthreads(7), ptrace(2), save.3valkey(3), sched(7), sched_setaffinity(2), sched_setattr(2), sched_setscheduler(2), sd_bus_creds_get_pid(3), sec(1), seccomp(2), select_tut(2), sem_init(3), semop(2), session-keyring(7), set_mempolicy(2), setns(2), setpgid(2), setsid(1), setsid(2), shmop(2), sigaction(2), sigaltstack(2), signal(7), signalfd(2), signal-safety(7), sigpending(2), sigprocmask(2), sk(3), smartd(8), smtpd(n), snobol4fork(3), spank(8), sshd(8), strace(1), stress-ng(1), sudo(8), syscalls(2), system(3), systemd.exec(5), tcsh(1), thread-keyring(7), timer_create(2), timerfd_create(2), trafgen(8), umask(2), unshare(2), userfaultfd(2), user-keyring(7), user_namespaces(7), user-session-keyring(7), valkey-latency-monitor(7), valkey-persistence(7), vfork(2), wait(2), wait4(2), xargs(1).

2024-06-15 Linux man-pages 6.9.1