On Tue, Apr 30, 2019 at 9:19 AM Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > Of course, if you *don't* need the exact vfork() semantics, clone > itself actually very much supports a callback model with s separate > stack. You can basically do this: > > - allocate new stack for the child > - in trivial asm wrapper, do: > - push the callback address on the child stack > - clone(CLONE_VFORK|CLONE_VM|CLONE_SIGCHLD, chld_stack, NULL, NULL,NULL) > - "ret" > - free new stack > > where the "ret" in the child will just go to the callback, while the > parent (eventually) just returns from the trivial wrapper and frees > the new stack (which by definition is no longer used, since the child > has exited or execve'd. In fact, Florian, maybe this is the solution to your "I want to use vfork for posix_spawn(), but I don't know if I can trust it" problem. Just use clone() directly. On WSL it will presumably just fail, and you can then fall back on doing the slow stupid fork+pipes-to-communicate. On valgrind, I don't know what will happen. Maybe it will just do an unchecked posix_spawn() because valgrind doesn't catch it? Linus