summaryrefslogtreecommitdiff
path: root/docs/busybox.net/programming.html
diff options
context:
space:
mode:
authorRob Landley2006-01-29 06:45:38 +0000
committerRob Landley2006-01-29 06:45:38 +0000
commit03628c8f75bafd348cf32ea253279e6bc0596a90 (patch)
tree4478db7a7fe52ea0f600546cb0b4f2fe5507f15b /docs/busybox.net/programming.html
parentb1b3cee831bc8dfcf439ad69f4694d0a8ca3f7e9 (diff)
downloadbusybox-03628c8f75bafd348cf32ea253279e6bc0596a90.zip
busybox-03628c8f75bafd348cf32ea253279e6bc0596a90.tar.gz
Remind me to implement bb_fork_exec()...
Diffstat (limited to 'docs/busybox.net/programming.html')
-rw-r--r--docs/busybox.net/programming.html11
1 files changed, 11 insertions, 0 deletions
diff --git a/docs/busybox.net/programming.html b/docs/busybox.net/programming.html
index f77f3c3..6dbe693 100644
--- a/docs/busybox.net/programming.html
+++ b/docs/busybox.net/programming.html
@@ -235,6 +235,12 @@ second argument to pw_encrypt(text,buffer).</p>
<h2><a name="tips_vfork">Fork and vfork</a></h2>
+<p>Busybox hides the difference between fork() and vfork() in
+libbb/bb_fork_exec.c. If you ever want to fork and exec, use bb_fork_exec()
+(which returns a pid and takes the same arguments as execve(), although in
+this case envp can be NULL) and don't worry about it. This description is
+here in case you want to know why that does what it does.</p>
+
<p>On systems that haven't got a Memory Management Unit, fork() is unreasonably
expensive to implement, so a less capable function called vfork() is used
instead.</p>
@@ -277,6 +283,11 @@ processes running at the same time. It means you can't have two processes
sharing the same memory without stomping all over each other. As soon as
the child calls exec(), the parent resumes.</p>
+<p>If the child's attempt to call exec() fails, the child should call _exit()
+rather than a normal exit(). This avoids any atexit() code that might confuse
+the parent. (The parent should never call _exit(), only a vforked child that
+failed to exec.)</p>
+
<p>(Now in theory, a nommu system could just copy the _stack_ when it forks
(which presumably is much shorter than the heap), and leave the heap shared.
In practice, you've just wound up in a multi-threaded situation and you can't