Probe for fork() instead of relying on a distro-specific #define.

This commit is contained in:
Rob Landley 2015-07-03 15:17:25 -05:00
parent 82d8d7cb7e
commit 9933273c5b
2 changed files with 20 additions and 1 deletions

View File

@ -6,7 +6,20 @@
#include "toys.h"
#if !defined(__uClinux__)
// We can't fork() on nommu systems, and vfork() requires an exec() or exit()
// before resuming the parent (because they share a heap until then). And no,
// we can't implement our own clone() call that does the equivalent of fork()
// because nommu heaps use physical addresses so if we copy the heap all our
// pointers are wrong. (You need an mmu in order to map two heaps to the same
// address range without interfering with each other.) In the absence of
// a portable way to tell malloc() to start a new heap without freeing the old
// one, you pretty much need the exec().)
// So we exec ourselves (via /proc/self/exe, if anybody knows a way to
// re-exec self without depending on the filesystem, I'm all ears),
// and use the arguments to signal reentry.
#if CFG_TOYBOX_FORK
pid_t xfork(void)
{
pid_t pid = fork();

View File

@ -83,6 +83,12 @@ EOF
#error nope
#endif
EOF
# nommu support
probesymbol TOYBOX_FORK << EOF
#include <unistd.h>
int main(int argc, char *argv[]) { return fork(); }
EOF
}
genconfig()