| Main index | Section 2 | Options |
#include <unistd.h>
The fork() function is not async-signal safe and creates a cancellation point in the parent process. It cannot be safely used from signal handlers, and the atfork handlers established by pthread_atfork(3) do not need to be async-signal safe either.
The
_Fork()
function creates a new process, similarly to
fork(),
but it is async-signal safe.
_Fork()
does not call atfork handlers, and does not create a cancellation point.
It can be used safely from signal handlers, but then no userspace
services (
malloc(3)
or
rtld(1))
are available in the child if forked from multi-threaded parent.
In particular, if using dynamic linking, all dynamic symbols used by the
child after
_Fork()
must be pre-resolved.
Note: resolving can be done globally by specifying the
LD_BIND_NOW
environment variable to the dynamic linker, or per-binary by passing the
#include <err.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h>int main(void) { pid_t pid;
/* * If child is expected to use stdio(3), state of * the reused io streams must be synchronized between * parent and child, to avoid double output and other * possible issues. */ fflush(stdout);
switch (pid = fork()) { case -1: err(1, "Failed to fork"); case 0: printf("Hello from child process!\n");
/* * Since we wrote into stdout, child needs to use * exit(3) and not _exit(2). This causes handlers * registered with atexit(3) to be called twice, * once in parent, and once in the child. If such * behavior is undesirable, consider * terminating child with _exit(2) or _Exit(3). */ exit(0); default: break; }
printf("Hello from parent process (child's PID: %d)!\n", pid);
return (0); }
The output of such a program is along the lines of:
Hello from parent process (child's PID: 27804)! Hello from child process!
| [EAGAIN] | |
| The system-imposed limit on the total number of processes under execution would be exceeded. The limit is given by the sysctl(3) MIB variable KERN_MAXPROC. (The limit is actually ten less than this except for the super user). | |
| [EAGAIN] | |
| The user is not the super user, and the system-imposed limit on the total number of processes under execution by a single user would be exceeded. The limit is given by the sysctl(3) MIB variable KERN_MAXPROCPERUID. | |
| [EAGAIN] | |
| The user is not the super user, and the soft resource limit corresponding to the resource argument RLIMIT_NPROC would be exceeded (see getrlimit(2)). | |
| [ENOMEM] | |
| There is insufficient swap space for the new process. | |
| FORK (2) | August 5, 2021 |
| Main index | Section 2 | Options |
Please direct any comments about this manual page service to Ben Bullock. Privacy policy.
| “ | Some people, when confronted with a problem, think “I know, I'll use regular expressions.” Now they have two problems. | ” |
| — Jamie Zawinski | ||