1 VFORK(2) System Calls VFORK(2)
2
3
4
5 NAME
6 vfork, vforkx - spawn new process in a virtual memory efficient way
7
8 SYNOPSIS
9 #include <unistd.h>
10
11 pid_t vfork(void);
12
13
14 #include <sys/fork.h>
15
16 pid_t vforkx(int flags);
17
18
19 DESCRIPTION
20 The vfork() and vforkx() functions create a new process without fully
21 copying the address space of the old process. These functions are
22 useful in instances where the purpose of a fork(2) operation is to
23 create a new system context for an execve() operation (see exec(2)).
24
25
26 Unlike with the fork() function, the child process borrows the parent's
27 memory and thread of control until a call to execve() or an exit
28 (either abnormally or by a call to _exit() (see exit(2)). Any
29 modification made during this time to any part of memory in the child
30 process is reflected in the parent process on return from vfork() or
31 vforkx(). The parent process is suspended while the child is using its
32 resources.
33
34
35 In a multithreaded application, vfork() and vforkx() borrow only the
36 thread of control that called vfork() or vforkx() in the parent; that
37 is, the child contains only one thread. The use of vfork() or vforkx()
38 in multithreaded applications, however, is unsafe due to race
39 conditions that can cause the child process to become deadlocked and
40 consequently block both the child and parent process from execution
41 indefinitely.
42
43
44 The vfork() and vforkx() functions can normally be used the same way as
45 fork() and forkx(), respectively. The calling procedure, however,
46 should not return while running in the child's context, since the
47 eventual return from vfork() or vforkx() in the parent would be to a
48 stack frame that no longer exists. The _exit() function should be used
49 in favor of exit(3C) if unable to perform an execve() operation, since
50 exit() will invoke all functions registered by atexit(3C) and will
51 flush and close standard I/O channels, thereby corrupting the parent
52 process's standard I/O data structures. Care must be taken in the child
53 process not to modify any global or local data that affects the
54 behavior of the parent process on return from vfork() or vforkx(),
55 unless such an effect is intentional.
56
57
58 Unlike fork() and forkx(), fork handlers are not run when vfork() and
59 vforkx() are called.
60
61
62 The vfork() and vforkx() functions are deprecated. Their sole
63 legitimate use as a prelude to an immediate call to a function from the
64 exec family can be achieved safely by posix_spawn(3C) or
65 posix_spawnp(3C).
66
67 Fork Extensions
68 The vforkx() function accepts a flags argument consisting of a bitwise
69 inclusive-OR of zero or more of the following flags, which are defined
70 in the header <sys/fork.h>:
71 FORK_NOSIGCHLD
72 FORK_WAITPID
73
74
75 See fork(2) for descriptions of these flags. If the flags argument is
76 0, vforkx() is identical to vfork().
77
78 RETURN VALUES
79 Upon successful completion, vfork() and vforkx() return 0 to the child
80 process and returns the process ID of the child process to the parent
81 process. Otherwise,1 is returned to the parent process, no child
82 process is created, and errno is set to indicate the error.
83
84 ERRORS
85 The vfork() and vforkx() functions will fail if:
86
87 EAGAIN
88 The system-imposed limit on the total number of processes
89 under execution (either system-quality or by a single user)
90 would be exceeded. This limit is determined when the system
91 is generated.
92
93
94 ENOMEM
95 There is insufficient swap space for the new process.
96
97
98
99 The vforkx() function will fail if:
100
101 EINVAL
102 The flags argument is invalid.
103
104
105 ATTRIBUTES
106 See attributes(5) for descriptions of the following attributes:
107
108
109
110
111 +--------------------+-----------------+
112 | ATTRIBUTE TYPE | ATTRIBUTE VALUE |
113 +--------------------+-----------------+
114 |Interface Stability | Obsolete |
115 +--------------------+-----------------+
116 |MT-Level | Unsafe |
117 +--------------------+-----------------+
118
119 SEE ALSO
120 exec(2), exit(2), fork(2), ioctl(2), atexit(3C), exit(3C),
121 posix_spawn(3C), posix_spawnp(3C), signal.h(3HEAD), wait(3C),
122 attributes(5), standards(5)
123
124 NOTES
125 To avoid a possible deadlock situation, processes that are children in
126 the middle of a vfork() or vforkx() are never sent SIGTTOU or SIGTTIN
127 signals; rather, output or ioctls are allowed and input attempts result
128 in an EOF indication.
129
130
131 To forestall parent memory corruption due to race conditions with
132 signal handling, vfork() and vforkx() treat signal handlers in the
133 child process in the same manner as the exec(2) functions: signals set
134 to be caught by the parent process are set to the default action
135 (SIG_DFL) in the child process (see signal.h(3HEAD)). Any attempt to
136 set a signal handler in the child before execve() to anything other
137 than SIG_DFL or SIG_IGN is disallowed and results in setting the
138 handler to SIG_DFL.
139
140
141 On some systems, the implementation of vfork() and vforkx() cause the
142 parent to inherit register values from the child. This can create
143 problems for certain optimizing compilers if <unistd.h> is not included
144 in the source calling vfork() or if <sys/fork.h> is not included in the
145 source calling vforkx().
146
147
148
149 December 13, 2006 VFORK(2)
|
1 VFORK(2) System Calls VFORK(2)
2
3 NAME
4 vfork, vforkx spawn new process in a virtual memory efficient way
5
6 SYNOPSIS
7 #include <unistd.h>
8
9 pid_t
10 vfork(void);
11
12 #include <sys/fork.h>
13
14 pid_t
15 vforkx(int flags);
16
17 DESCRIPTION
18 The vfork() and vforkx() functions create a new process without fully
19 copying the address space of the old process. These functions are useful
20 in instances where the purpose of a fork(2) operation is to create a new
21 system context for an exec(2) operation.
22
23 Unlike with the fork() function, the child process borrows the parent's
24 memory and thread of control until a call to execve() or an exit (either
25 abnormally or by a call to _exit(2)). Any modification made during this
26 time to any part of memory in the child process is reflected in the
27 parent process on return from vfork() or vforkx(). The parent process is
28 suspended while the child is using its resources.
29
30 In a multithreaded application, vfork() and vforkx() borrow only the
31 thread of control that called vfork() or vforkx() in the parent; that is,
32 the child contains only one thread. The use of vfork() or vforkx() in
33 multithreaded applications, however, is unsafe due to race conditions
34 that can cause the child process to become deadlocked and consequently
35 block both the child and parent process from execution indefinitely.
36
37 The vfork() and vforkx() functions can normally be used the same way as
38 fork() and forkx(), respectively. The calling procedure, however, should
39 not return while running in the child's context, since the eventual
40 return from vfork() or vforkx() in the parent would be to a stack frame
41 that no longer exists. The _exit() function should be used in favor of
42 exit(3C) if unable to perform an execve() operation, since exit() will
43 invoke all functions registered by atexit(3C) and will flush and close
44 standard I/O channels, thereby corrupting the parent process's standard
45 I/O data structures. Care must be taken in the child process not to
46 modify any global or local data that affects the behavior of the parent
47 process on return from vfork() or vforkx(), unless such an effect is
48 intentional.
49
50 Unlike fork() and forkx(), fork handlers are not run when vfork() and
51 vforkx() are called.
52
53 The vfork() and vforkx() functions are deprecated. Their sole legitimate
54 use as a prelude to an immediate call to a function from the exec(2)
55 family can be achieved safely by posix_spawn(3C) or posix_spawnp(3C).
56
57 Fork Extensions
58 The vforkx() function accepts a flags argument consisting of a bitwise
59 inclusive-OR of zero or more of the following flags, which are defined in
60 the header <sys/fork.h>:
61
62 FORK_NOSIGCHLD
63 FORK_WAITPID
64
65 See fork(2) for descriptions of these flags. If the flags argument is 0,
66 vforkx() is identical to vfork().
67
68 RETURN VALUES
69 Upon successful completion, vfork() and vforkx() return 0 to the child
70 process and return the process ID of the child process to the parent
71 process. Otherwise, 1 is returned to the parent process, no child process
72 is created, and errno is set to indicate the error.
73
74 ERRORS
75 The vfork() and vforkx() functions will fail if:
76
77 EAGAIN The system-imposed limit on the total number of
78 processes under execution (either system-quality or by
79 a single user) would be exceeded. This limit is
80 determined when the system is generated.
81
82 ENOMEM There is insufficient swap space for the new process.
83
84 The vforkx() function will fail if:
85
86 EINVAL The flags argument is invalid.
87
88 INTERFACE STABILITY
89 The vfork() function is Obsolete Standard.
90
91 The vforkx() function is Obsolete Uncommitted.
92
93 MT-LEVEL
94 Unsafe.
95
96 SEE ALSO
97 exec(2), exit(2), fork(2), ioctl(2), atexit(3C), exit(3C),
98 posix_spawn(3C), posix_spawnp(3C), signal.h(3HEAD), wait(3C),
99 standards(5)
100
101 NOTES
102 To avoid a possible deadlock situation, processes that are children in
103 the middle of a vfork() or vforkx() are never sent SIGTTOU or SIGTTIN
104 signals; rather, output or ioctls are allowed and input attempts result
105 in an EOF indication.
106
107 To forestall parent memory corruption due to race conditions with signal
108 handling, vfork() and vforkx() treat signal handlers in the child process
109 in the same manner as the exec(2) functions: signals set to be caught by
110 the parent process are set to the default action (SIG_DFL) in the child
111 process (see signal.h(3HEAD)). Any attempt to set a signal handler in
112 the child before execve() to anything other than SIG_DFL or SIG_IGN is
113 disallowed and results in setting the handler to SIG_DFL.
114
115 On some systems, the implementation of vfork() and vforkx() cause the
116 parent to inherit register values from the child. This can create
117 problems for certain optimizing compilers if <unistd.h> is not included
118 in the source calling vfork() or if <sys/fork.h> is not included in the
119 source calling vforkx().
120
121 STANDARDS
122 The vfork() function is available in the following compilation
123 environments. See standards(5).
124
125 X/Open Portability Guide Issue4, Version2 (XPG4.2)
126 Version2 of the Single UNIX Specification (SUSv2)
127 Version3 of the Single UNIX Specification (SUSv3)
128
129 It was marked obsolete in Version3 of the Single UNIX Specification
130 (SUSv3) and removed from IEEE Std 1003.1-2008 (POSIX.1).
131
132 The vforkx() function is a local extension and not available in any
133 strictly standards-compliant compilation environment.
134
135 illumos August 20, 2014 illumos
|