为什么克隆包装器需要堆栈参数?

exl*_*mer 4 linux system-calls stack clone

我一直在仔细阅读 clone() 的 linux 手册页,我了解 clone() 包装器和“原始”系统调用之间的区别。但我不明白的是为什么父进程需要为子进程分配一个堆栈,即使包装器中没有使用 CLONE_VM。

如果不使用 CLONE_VM,包装器是否会简单地忽略堆栈参数?为什么需要它呢?原始系统调用允许它为空,这是有道理的,但我不明白为什么包装器需要这个。即使您不告诉它,包装器也会让孩子和父母共享内存吗?

Ste*_*itt 5

所需的栈参数齐头并进在手用fn说法。原始内核系统调用并不总是需要堆栈,因为它的行为类似于fork:子进程中的执行在系统调用返回时开始。然后 libc 包装器需要设置调用fn,为此,它需要堆栈(并且一直这样做)。

因此,在调用包装器时总是需要一个堆栈,以便将信息通过clone系统调用传递给调用fn函数的代码(thread_start在 glibc 代码中)。