FORK1(9)

πŸ“¦
version 11.0 Β· 2 versions
, in nixpkgs unstable

✨ NAME ✨

fork1 β€” create a new process

okay bestie, welcome to fork1(9) from the Kernel Developer's Manual πŸ’– this one is literally about making new processes, and it's giving main-character backend energy fr fr.


🌸 SYNOPSIS 🌸

#include <sys/types.h>
#include <sys/proc.h>

int
fork1(struct lwp *l1, int flags, int exitsig, void *stack,
    size_t stacksize, void (*func)(void *), void *arg,
    register_t *retval);

πŸ¦‹ DESCRIPTION πŸ¦‹

fork1() creates a new process out of the process behind l1, and l1 is assumed to be the current lwp. It's used primarily to implement the fork(2) and vfork(2) system calls, but it's lowkey versatile enough to be a backend for stuff like the __clone(2) call too πŸ‘‘

The flags argument controls the semantics of the fork operation, and it's made up of the bitwise-OR of these values:

  • FORK_PPWAIT β€” the parent process will sleep until the child process successfully calls execve(2) or exits, either by a call to _exit(2) or abnormally 😴
  • FORK_SHAREVM β€” the child process will share the parent's virtual address space. If this flag is not specified, the child gets a copy-on-write snapshot of the parent's address space 🫢
  • FORK_SHARECWD β€” the child process will share the parent's current directory, root directory, and file creation mask.
  • FORK_SHAREFILES β€” the child process will share the parent's file descriptors.
  • FORK_SHARESIGS β€” the child process will share the parent's signal actions.
  • FORK_NOWAIT β€” the child process will at creation time be inherited by the init process.
  • FORK_CLEANFILES β€” the child process will not copy or share the parent's descriptors, but rather will start out with a clean set.

A flags value of 0 indicates a standard fork operation, no cap.

The exitsig argument controls the signal sent to the parent on child death. If normal operation is desired, SIGCHLD should be supplied.

It is possible to specify the child userspace stack location and size by using the stack and stacksize arguments, respectively. Values NULL and 0, respectively, will give the child the default values for the machine architecture in question.

The arguments func and arg can be used to specify a kernel function to be called when the child process returns instead of child_return(). These are used for example in starting the init process and creating kernel threads 🧚

The retval argument is provided for the use of system call stubs. If retval is not NULL, it will hold the following values after successful completion of the fork operation:

  • retval[0] β€” this will contain the pid of the child process.
  • retval[1] β€” in the parent process, this will contain the value 0. In the child process, this will contain 1.

User level system call stubs typically subtract 1 from retval[1] and bitwise-AND it with retval[0], thus returning the pid to the parent process and 0 to the child. slay, that's the whole trick πŸ’…


πŸ’œ RETURN VALUES πŸ’œ

Upon successful completion of the fork operation, fork1() returns 0. Otherwise, the following error values are returned:

  • [EAGAIN] β€” the limit on the total number of system processes would be exceeded; or the limit RLIMIT_NPROC on the total number of processes under execution by this user id would be exceeded 😭

🌈 SEE ALSO 🌈


xoxo, your Debian source/version page, dated April 16, 2018 β€” FORK1(9) says bye bestie πŸ’…πŸŽ€

πŸ“¦ where this page comes from