我原以爲這會成爲許多其他人遇到過的問題類型,但我很難找到任何人談論「殺死父母」的問題。
我最初以爲你應該能夠有一個(不那麼,但是那種)簡單的調用做到這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