是否可以使用克隆模拟vfrok的行为?到目前为止我已经
了pid=clone(fn,cStack,SIGCHLD|CLONE_FS | CLONE_FILES | CLONE_VM | CLONE_VFORK,NULL);
但是我仍然需要传递自己的堆栈,所以新进程在不同的堆栈框架中工作,但是在同一个地址空间(因为CLONE_VM),据我所知,如果我调用vfork而不使用某些来自exec的函数,新进程在与父进程相同的地址空间中运行,并且它使用相同的堆栈帧。
那么是否可以使用在同一地址空间中运行的克隆创建一个新进程并使用与父代相同的堆栈帧?
答案 0 :(得分:3)
如果没有在汇编程序中编写函数,那是不可能的。这是一个无法“修复”的根本问题;即使是vfork
系统调用包装器本身也必须用汇编而不是C来编写大多数archs(返回地址存储在堆栈中的任何arch)。这是因为在子进程使用与父进程相同的堆栈之后,它可能会覆盖函数(vfork
,clone
或其他一些包装器)需要返回的返回地址。父节点。
在汇编程序中,您只需在发出系统调用之前将返回地址保存在寄存器中。