Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
FORK(2) 		       System Calls Manual			 FORK(2)

NAME
     fork -- create a new process

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <unistd.h>

     pid_t
     fork(void);

     pid_t
     _Fork(void);

DESCRIPTION
     The  fork()  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:

	   *   The child process has a unique process ID.

	   *   The  child  process  has a different parent process ID (i.e., the
	       process ID of the parent process).

	   *   The child process has its own copy of the  parent's  descriptors,
	       except  for  descriptors returned by kqueue(2), which are not in-
	       herited from the parent process.  These descriptors reference the
	       same underlying objects, so that, for instance, file pointers  in
	       file objects are shared between the child and the parent, so that
	       an  lseek(2)  on  a  descriptor in the child process can affect a
	       subsequent read(2) or write(2) by the  parent.	This  descriptor
	       copying is also used by the shell to establish standard input and
	       output  for  newly  created processes as well as to set up pipes.
	       Any file descriptors that  were	marked	with  the  close-on-fork
	       flag,  FD_CLOFORK  (see	fcntl(2) and O_CLOFORK in open(2)), will
	       not be present in the child process, but remain open in the  par-
	       ent.

	   *   The  child process' resource utilizations are set to 0; see setr-
	       limit(2).

	   *   All interval timers are cleared; see setitimer(2).

	   *   The robust mutexes list (see  pthread_mutexattr_setrobust(3))  is
	       cleared for the child.

	   *   The  atfork handlers established with the pthread_atfork(3) func-
	       tion are called as appropriate before fork in the parent process,
	       and after the child is created, in parent and child.

	   *   The child process has only one thread, corresponding to the call-
	       ing thread in the parent process.  If the process has  more  than
	       one  thread,  locks and other resources held by the other threads
	       are not released and therefore only  async-signal-safe  functions
	       (see  sigaction(2))  are  guaranteed to work in the child process
	       until a call to execve(2) or a similar function.  The FreeBSD im-
	       plementation of fork() provides a usable malloc(3),  and  rtld(1)
	       services in the child process.

     The  fork()  function  is	not async-signal safe and creates a cancellation
     point in the parent process.  It cannot be safely	used  from  signal  han-
     dlers, 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 -z now option to the static linker
     ld(1), or by using each symbol before the _Fork() call to force  the  bind-
     ing.  Either of the methods subtly changes the ABI of the resulting binary.

RETURN VALUES
     Upon  successful  completion, fork() and _Fork() return a value of 0 to the
     child process and return the process ID of the child process to the  parent
     process.	Otherwise,  a  value of -1 is returned to the parent process, no
     child process is created, and the global variable errno is set to	indicate
     the error.

EXAMPLES
     The following example shows a common pattern of how fork() is used in prac-
     tice.

	   #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!

ERRORS
     The fork() system call will fail and no child process will be created if:

     [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.

SEE ALSO
     execve(2),  rfork(2),  setitimer(2),  setrlimit(2), sigaction(2), vfork(2),
     wait(2), pthread_atfork(3)

STANDARDS
     The  fork()  and  _Fork()	functions  conform  to	IEEE   Std   1003.1-2024
     ("POSIX.1").

HISTORY
     The  fork() function appeared in Version 1 AT&T UNIX.  The _Fork() function
     appeared in FreeBSD 13.1.

FreeBSD ports 15.quarterly	  May 17, 2024				 FORK(2)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=fork&sektion=2&manpath=FreeBSD+15.1-RELEASE+and+Ports.quarterly>

home | help