Page MenuHomeFreeBSD

D31378.id93134.diff
No OneTemporary

D31378.id93134.diff

diff --git a/include/unistd.h b/include/unistd.h
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -586,6 +586,7 @@
int unwhiteout(const char *);
void *valloc(size_t); /* obsoleted by malloc() */
int funlinkat(int, const char *, int, int);
+pid_t _Fork(void);
#ifndef _OPTRESET_DECLARED
#define _OPTRESET_DECLARED
diff --git a/lib/libc/sys/Symbol.map b/lib/libc/sys/Symbol.map
--- a/lib/libc/sys/Symbol.map
+++ b/lib/libc/sys/Symbol.map
@@ -417,6 +417,10 @@
shm_rename;
};
+FBSD_1.7 {
+ _Fork;
+};
+
FBSDprivate_1.0 {
___acl_aclcheck_fd;
__sys___acl_aclcheck_fd;
diff --git a/lib/libc/sys/fork.2 b/lib/libc/sys/fork.2
--- a/lib/libc/sys/fork.2
+++ b/lib/libc/sys/fork.2
@@ -28,7 +28,7 @@
.\" @(#)fork.2 8.1 (Berkeley) 6/4/93
.\" $FreeBSD$
.\"
-.Dd April 20, 2021
+.Dd August 2, 2021
.Dt FORK 2
.Os
.Sh NAME
@@ -40,10 +40,12 @@
.In unistd.h
.Ft pid_t
.Fn fork void
+.Ft pid_t
+.Fn _Fork void
.Sh DESCRIPTION
The
.Fn fork
-system call causes creation of a new process.
+function causes creation of a new process.
The new process (child process) is an exact copy of the
calling process (parent process) except for the following:
.Bl -bullet -offset indent
@@ -77,6 +79,15 @@
All interval timers are cleared; see
.Xr setitimer 2 .
.It
+The robust mutexes list (see
+.Xr pthread_mutexattr_setrobust 3 )
+is cleared for the child.
+.It
+The atfork handlers established with the
+.Xr pthread_atfork 3
+function are called as appropriate before fork in the parent process,
+and after the child is created, in parent and child.
+.It
The child process has only one thread,
corresponding to the calling thread in the parent process.
If the process has more than one thread,
@@ -87,11 +98,58 @@
are guaranteed to work in the child process until a call to
.Xr execve 2
or a similar function.
+The
+.Fx
+implementation of
+.Fn fork
+provides a usable
+.Xr malloc 3
+and
+.Xr rtld 1
+services in the child process.
.El
+.Pp
+The
+.Fn 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
+.Xr pthread_atfork 3
+do not need to be async-signal safe either.
+.Pp
+The
+.Fn _Fork
+function creates a new process, similarly to
+.Fn fork ,
+but it is async-signal safe.
+.Fn _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 (
+.Xr malloc 3
+or
+.Xr 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
+.Fn _Fork
+must be pre-resolved.
+Note: resolving can be done globally by specifying the
+.Ev LD_BIND_NOW
+environment variable to dynamic linker, or per-binary by passing the
+.Fl z Ar now
+option to the static linker
+.Xr ld 1 ,
+or by using each symbol before the
+.Fn _Fork
+call to force the binding.
.Sh RETURN VALUES
Upon successful completion,
.Fn fork
-returns a value
+and
+.Fn _Fork
+return a value
of 0 to the child process and returns the process ID of the child
process to the parent process.
Otherwise, a value of -1 is returned
@@ -176,9 +234,21 @@
.Xr setrlimit 2 ,
.Xr sigaction 2 ,
.Xr vfork 2 ,
-.Xr wait 2
+.Xr wait 2 ,
+.Xr pthread_atfork 3
.Sh HISTORY
The
.Fn fork
function appeared in
.At v1 .
+.Pp
+The
+.Fn _Fork
+function was defined by Austin Group together with the removal
+of a requirement that the
+.Fn fork
+implementation must be async-signal safe.
+The
+.Fn _Fork
+function appeared in
+.Fx 14.0 .
diff --git a/lib/libc/sys/fork.c b/lib/libc/sys/fork.c
--- a/lib/libc/sys/fork.c
+++ b/lib/libc/sys/fork.c
@@ -38,6 +38,7 @@
#include "libc_private.h"
__weak_reference(__sys_fork, __fork);
+__weak_reference(__sys_fork, _Fork);
#pragma weak fork
pid_t

File Metadata

Mime Type
text/plain
Expires
Wed, May 20, 12:12 PM (10 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33346509
Default Alt Text
D31378.id93134.diff (3 KB)

Event Timeline