我原以为这会成为许多其他人遇到过的问题类型,但我很难找到任何人谈论“杀死父母”的问题。
我最初以为你应该能够有一个(不那么,但是那种)简单的调用做到这clone
,像这样:
pid_t new_vfork(void) {
return clone(child_func, /* child function */
child_stack, /* child stack */
SIGCHLD | CLONE_VM, /* flags */
NULL, /* argument to child */
NULL, /* pid of the child */
NULL, /* thread local storage for child */
NULL); /* thread id of child in child's mem */
}
除了确定child_stack和child_func到工作方式与vfork的做法相当困难,因为child_func需要成为克隆调用的返回地址,并且child_stack需要在实际系统调用(sys_clone)创建时位于堆栈顶部。
你也许可以尝试直接与
pid_t new_vfork(void) {
return sys_clone(SIGCHLD | CLONE_VM, NULL);
}
我想这可能会得到你想要什么叫sys_clone
。传递NULL作为第二个参数,即child_stack指针,会导致内核执行与vfork和fork中相同的操作,即使用与父代相同的堆栈。
我从来没有直接使用sys_clone
,并没有测试过这个,但我认为它应该可以工作。我相信:
sys_clone(SIGCHLD | CLONE_VM | CLONE_VFORK, NULL);
相当于vfork
。
如果这不起作用(并且您无法弄清楚如何执行类似操作),那么您可以使用常规克隆呼叫以及setjump
和longjmp
调用来模拟它,或者您也许可以以避免需要“返回两次”的语义fork
和vfork
。
downvote是不应该的。 zdav是对的。 – ninjalj 2010-10-08 19:30:18
一个扭曲是使用多重调用二进制文件,那么你不需要把二进制代码放到另一个可执行文件中。 – 2010-10-08 20:44:59
我相信网址应该是http://www.ucdot.org/article.pl?sid=03/12/12/0317219&mode=thread – ninjalj 2010-10-09 15:08:44