---
name: "forker"
section: "3"
platform: "linux"
package: "ltp-dev"
version: "20091231+dfsg-1"
release: "Debian 6.0 (Squeeze)"
platforms: ["linux"]
url: "https://new.carta.tech/forker"
---

# forker(3)

fork desired number of copies of the current process background - fork a process and return control to caller

## NAME

forker - fork desired number of copies of the current process\
 background - fork a process and return control to caller

## SYNOPSIS

int \
 **background**(*prefix*)\
 char \**prefix*;

int\
 **forker**(*ncopies, mode, prefix*)\
 int *ncopies*;\
 int *mode*;\
 char \**prefix*;

extern int **Forker\_pids**\[\];\
 extern int **Forker\_npids**;

## DESCRIPTION

The **background** function will do a fork of the current process. The parent process will then exit, thus orphaning the child process.  Doing this will not nice the child process like executing a cmd in the background using "&" from the shell. If the fork fails and prefix is not NULL, a error message is printed to stderr and the process will exit with a value of errno.

The **forker** function will fork *ncopies* minus one copies of the current process.  There are two modes in how the forks will be done.  Mode 0 (default) will have all new processes be children of the parent process.    Using Mode 1, the parent process will have one child and that child will fork the next process, if necessary, and on and on. The **forker** function will return the number of successful forks.  This value will be different for the parent and each child. Using mode 0, the parent will get the total number of successful forks.  Using mode 1, the newest child will get the total number of forks.  The parent will get a return value of 1.

The **forker** function also updates the global variables *Forker\_pids\[*\] and Forker\_npids.  The *Forker\_pids* array will be updated to contain the pid of each new process.  The *Forker\_npids* variable contains the number of entries in *Forker\_pids.*  Note, not all processes will have access to all pids via *Forker\_pids.*  If using mode 0, only the parent process will have all information.  If using mode 1, only the last child process will have all information.

If the *prefix* parameter is not NULL and the fork system call fails, a error message will be printed to stderr.  The error message will be preceded with *prefix* string.  If *prefix* is NULL, no error message is printed.

## EXAMPLES

```
/*
 * The following is a unit test main for the background and forker
 * functions.
 */
#include <stdio.h>
main(argc, argv)
int argc;
char **argv;
{
    int ncopies=1;
    int mode=0;
    int ret;
    if ( argc == 1 ) {
        printf("Usage: %s ncopies [mode]0, argv[0]);
        exit(1);
    }
    if ( sscanf(argv[1], "%i", &ncopies) != 1 ) {
        printf("%s: ncopies argument must be integer0, argv[0]);
        exit(1);
    }
    if ( argc == 3 )
        if ( sscanf(argv[2], "%i", &mode) != 1 ) {
        printf("%s: mode argument must be integer0, argv[0]);
        exit(1);
    }
    printf("Starting Pid = %d0, getpid());
    ret=background(argv[0]);
    printf("After background() ret:%d, pid = %d0, ret, getpid());
    ret=forker(ncopies, mode, argv[0]);
    printf("forker(%d, %d, %s) ret:%d, pid = %d, sleeping 30 seconds.0,
        ncopies, mode, argv[0], ret, getpid());
    sleep(30);
    exit(0);
}
```

## SEE ALSO

[fork(2)](/fork/2.md).

## BUGS

The child pids are stored in the fixed array, *Forker\_pids*. The array only has space for 4098 pids.  Only the first 4098 pids will be stored in the array.
