xref: /illumos-gate/usr/src/man/man2/vfork.2 (revision 4870e0a7)
1.\" Copyright 2014 Garrett D'Amore <garrett@damore.org>
2.\" Copyright (c) 2004, Sun Microsystems, Inc.  All Rights Reserved.
3.\" Copyright 1989 AT&T.
4.\" Copyright (c) 1980 Regents of the University of California.
5.\" All rights reserved.  The Berkeley software License Agreement
6.\" specifies the terms and conditions for redistribution.
7.Dd Aug 20, 2014
8.Dt VFORK 2
9.Os
10.Sh NAME
11.Nm vfork ,
12.Nm vforkx
13.Nd spawn new process in a virtual memory efficient way
14.Sh SYNOPSIS
15.In unistd.h
16.Ft pid_t
17.Fn vfork void
18.
19.In sys/fork.h
20.Ft pid_t
21.Fn vforkx "int flags"
22.Sh DESCRIPTION
23The
24.Fn vfork
25and
26.Fn vforkx
27functions create a new process without
28fully copying the address space of the old process. These functions are useful
29in instances where the purpose of a
30.Xr fork 2
31operation is to create a new
32system context for an
33.Xr exec 2
34operation.
35.Lp
36Unlike with the
37.Fn fork
38function, the child process borrows the parent's
39memory and thread of control until a call to
40.Fn execve
41or an exit
42.Pq either abnormally or by a call to Xr _exit 2 .
43Any modification
44made during this time to any part of memory in the child process is reflected
45in the parent process on return from
46.Fn vfork
47or
48.Fn vforkx .
49The parent process is suspended while the child is using its resources.
50.Lp
51In a multithreaded application,
52.Fn vfork
53and
54.Fn vforkx
55borrow only the thread of control that called
56.Fn vfork
57or
58.Fn vforkx
59in the parent; that is, the child contains only one thread. The use of
60.Fn vfork
61or
62.Fn vforkx
63in multithreaded applications, however, is unsafe due to race
64conditions that can cause the child process to become deadlocked and
65consequently block both the child and parent process from execution
66indefinitely.
67.Lp
68The
69.Fn vfork
70and
71.Fn vforkx
72functions can normally be used the same way as
73.Fn fork
74and
75.Fn forkx ,
76respectively. The calling procedure,
77however, should not return while running in the child's context, since the
78eventual return from
79.Fn vfork
80or
81.Fn vforkx
82in the parent would be to
83a stack frame that no longer exists. The
84.Fn _exit
85function should be used
86in favor of
87.Xr exit 3C
88if unable to perform an
89.Fn execve
90operation, since
91.Fn exit
92will invoke all functions registered by
93.Xr atexit 3C
94and will flush and close standard I/O channels, thereby corrupting the parent
95process's standard I/O data structures. Care must be taken in the child process
96not to modify any global or local data that affects the behavior of the parent
97process on return from
98.Fn vfork
99or
100.Fn vforkx ,
101unless such an effect
102is intentional.
103.Lp
104Unlike
105.Fn fork
106and
107.Fn forkx ,
108fork handlers are not run when
109.Fn vfork
110and
111.Fn vforkx
112are called.
113.Lp
114The
115.Fn vfork
116and
117.Fn vforkx
118functions are deprecated. Their sole
119legitimate use as a prelude to an immediate call to a function from the
120.Xr exec 2
121family can be achieved safely by
122.Xr posix_spawn 3C
123or
124.Xr posix_spawnp 3C .
125.Ss "Fork Extensions"
126The
127.Fn vforkx
128function accepts a
129.Fa flags
130argument consisting of a
131bitwise inclusive-OR of zero or more of the following flags, which are defined
132in the header
133.In sys/fork.h :
134.Lp
135.Bl -item -compact -offset indent
136.It
137.Dv FORK_NOSIGCHLD
138.It
139.Dv FORK_WAITPID
140.El
141.Lp
142See
143.Xr fork 2
144for descriptions of these flags. If the
145.Fa flags
146argument is 0,
147.Fn vforkx
148is identical to
149.Fn vfork .
150.Sh RETURN VALUES
151Upon successful completion,
152.Fn vfork
153and
154.Fn vforkx
155return 0 to
156the child process and return the process ID of the child process to the parent
157process. Otherwise, \(mi1 is returned to the parent process, no child
158process is created, and
159.Va errno
160is set to indicate the error.
161.Sh ERRORS
162The
163.Fn vfork
164and
165.Fn vforkx
166functions will fail if:
167.Bl -tag -width Er
168.It Er EAGAIN
169The system-imposed limit on the total number of processes under execution
170(either system-quality or by a single user) would be exceeded. This limit is
171determined when the system is generated.
172.
173.It Er ENOMEM
174There is insufficient swap space for the new process.
175.El
176.Lp
177The
178.Fn vforkx
179function will fail if:
180.Bl -tag -width Er
181.It Er EINVAL
182The
183.Va flags
184argument is invalid.
185.El
186.Sh INTERFACE STABILITY
187The
188.Fn vfork
189function is
190.Sy Obsolete Standard .
191.Lp
192The
193.Fn vforkx
194function is
195.Sy Obsolete Uncommitted .
196.Sh MT-LEVEL
197.Sy Unsafe .
198.Sh SEE ALSO
199.Xr exec 2 ,
200.Xr exit 2 ,
201.Xr fork 2 ,
202.Xr ioctl 2 ,
203.Xr atexit 3C ,
204.Xr exit 3C ,
205.Xr posix_spawn 3C ,
206.Xr posix_spawnp 3C ,
207.Xr wait 3C ,
208.Xr signal.h 3HEAD ,
209.Xr standards 5
210.Sh NOTES
211To avoid a possible deadlock situation, processes that are children in the
212middle of a
213.Fn vfork
214or
215.Fn vforkx
216are never sent
217.Dv SIGTTOU
218or
219.Dv SIGTTIN
220signals; rather, output or ioctls are allowed and input attempts
221result in an
222.Dv EOF
223indication.
224.Lp
225To forestall parent memory corruption due to race conditions with signal
226handling,
227.Fn vfork
228and
229.Fn vforkx
230treat signal handlers in the child
231process in the same manner as the
232.Xr exec 2
233functions: signals set to be
234caught by the parent process are set to the default action
235.Pq Dv SIG_DFL
236in the child process
237.Pq see Xr signal.h 3HEAD .
238Any attempt to set a signal
239handler in the child before
240.Fn execve
241to anything other than
242.Dv SIG_DFL
243or
244.Dv SIG_IGN
245is disallowed and results in setting the handler to
246.Dv SIG_DFL .
247.Lp
248On some systems, the implementation of
249.Fn vfork
250and
251.Fn vforkx
252cause
253the parent to inherit register values from the child. This can create problems
254for certain optimizing compilers if
255.In unistd.h
256is not included in the source calling
257.Fn vfork
258or if
259.In sys/fork.h
260is not included in the
261source calling
262.Fn vforkx .
263.Sh STANDARDS
264The
265.Fn vfork
266function is available in the following compilation environments.  See
267.Xr standards 5 .
268.Lp
269.Bl -bullet -compact
270.It
271.St -xpg4.2
272.It
273.St -susv2
274.It
275.St -susv3
276.El
277.Lp
278It was marked obsolete in
279.St -susv3
280and removed from
281.St -p1003.1-2008 .
282.Lp
283The
284.Fn vforkx
285function is a local extension and not available in any strictly
286standards-compliant compilation environment.
287