Я бы подумал, что это будет тот тип проблемы, с которым многие другие сталкивались раньше, но мне было трудно найти, что кто-то говорит о проблемах «убить родителя».
Первоначально я думал, что вы должны быть в состоянии сделать это с (не совсем так, но вроде) простого вызова 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 должен быть обратным адресом от вызова clone, а child_stack должен быть вершиной стека в точке, в которой выполняется фактический системный вызов (sys_clone).
Вы могли бы попытаться вызвать sys_clone
непосредственно
pid_t new_vfork(void) {
return sys_clone(SIGCHLD | CLONE_VM, NULL);
}
который я думаю, могли бы получить то, что вы хотите. Передача NULL в качестве второго аргумента, который является указателем child_stack, заставляет ядро делать то же самое, что и в vfork и fork, которое должно использовать тот же стек, что и родительский.
Я никогда не использовал sys_clone
и не тестировал это, но думаю, он должен работать. Я считаю, что:
sys_clone(SIGCHLD | CLONE_VM | CLONE_VFORK, NULL);
равнозначно vfork
.
Если это не сработает (и вы не можете понять, как сделать что-то подобное), вы можете использовать обычный вызов клона вместе с вызовами setjump
и longjmp
, чтобы имитировать его, или вы можете быть в состоянии чтобы обойти необходимость в семантике «возвращение дважды» в fork
и vfork
.
Нижняя часть была незаслуженной. Здав прав. – ninjalj
Твист заключается в использовании двоичного кода с несколькими вызовами, тогда вам не нужно вводить двоичный код в другой исполняемый файл. –
Я считаю, что URL должен быть http://www.ucdot.org/article.pl?sid=03/12/12/0317219&mode=thread – ninjalj