fork, vfork - Create a new process
void ); pid_t vfork(
Application developers may want to specify an #include
statement for <sys/types.h> before the one for <unistd.h>
if programs are being developed for multiple platforms.
The additional #include statement is not required on Tru64
UNIX systems or by ISO or XSH standards, but may be on
other vendors' systems that conform to these standards.
Interfaces documented on this reference page conform to
industry standards as follows:
fork(): XSH4.0, XSH4.2, XSH5.0
vfork(): XSH4.2, XSH5.0
Refer to the standards(5) reference page for more information
about industry standards and associated tags.
The fork() and vfork() functions create a new process
(child process) that is identical to the calling process
The child process inherits the following from the parent
process: Environment Close-on-exec flags Signal-handling
settings Set user ID mode bit Set group ID mode bit
Trusted state Profiling on/off status Nice value All
attached shared libraries Process group ID tty group ID
Current directory Root directory File mode creation mask
File size limit Attached shared memory segments Attached
mapped file segments All mapped regions, with the same
protection and sharing mode as in the parent process
[Tru64 UNIX] Message catalog descriptors. These are
shared by parent and child processes until a modification
is made. The parent's policy and priority settings for
the SCHED_FIFO and SCHED_RR scheduling policies (fork()
call) Open semaphores. Any semaphores open in the parent
process are also open in the child process.
The child process differs from the parent process in the
following ways: The child process has a unique process ID
that does not match any active process group ID. The parent
process ID of the child process matches the process ID
of the parent. The child process has its own copy of the
parent process's file descriptors. Each of the child's
file descriptors refers to the same open file description
with the corresponding file descriptor of the parent process.
The child process has its own copy of the parent's
open directory streams. Each open directory stream in the
child process may share directory stream positioning with
the corresponding directory stream of the parent. The
child process has its own copy of the parent's message
queue descriptors, each of which refers to the same open
message description as referred to by the corresponding
message queue descriptor of the parent. All semadj values
are cleared. Process locks, text locks, and data locks
are not inherited by the child process. The child process'
values of tms_utime, tms_stime, tms_cutime, and
tms_cstime are set to 0 (zero). Any pending alarms are
cleared in the child process. [Tru64 UNIX] Any interval
timers enabled by the parent process are reset in the
child process. Any signals pending for the parent process
are cleared for the child process. Address space memory
locks established by the parent process through calls to
mlockall() or mlock() are not inherited by the child process.
Per-process timers created by the parent process
are not inherited by the child process. Asynchronous
input or asynchronous output operations started by the
parent process are not inherited by the child process.
If a multithreaded process forks a child process, the new
process contains a replica of the calling thread and its
entire address space, possibly including the states of
mutexes and other resources. Consequently, to avoid
errors, the child process should only execute operations
it knows will not cause deadlock.
The fork() and vfork() functions have essentially the same
implementation at the level of the operating system kernel
but may differ in how they are supported through different
libraries. Some libraries, such as libpthread and libc,
support fork handler routines that can acquire and release
resources that are critical to the child process. Fork
handlers therefore allow an application to manage potential
deadlock situations that might occur between the parent
and child processes. Fork handlers do not work correctly
if the application calls vfork() to create the
child process. Therefore, applications using libpthread
and libc should call fork() to create a child process.
For more information about fork handler routines, see
pthread_atfork(3). For a complete list of system calls
that are reentrant with respect to signals, see signal(4).
Upon successful completion, the fork() and vfork() functions
return a value of 0 (zero) 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,
no child process is created, and errno is set to
indicate the error.
The fork() and vfork() functions set errno to the specified
values for the following conditions: The limit on the
total number of processes executing for a single user
would be exceeded. This limit can be exceeded by a process
with superuser privilege. There is not enough space left
for this process.
Functions: exec(2), exit(2), getpriority(2), getrusage(2),
plock(2), ptrace(2), semop(2), shmat(2), sigaction(2),
sigvec(2), umask(2), wait(2), nice(3), pthread_atfork(3),
raise(3), times(3), ulimit(3)
[ Back ]