在Linux中克隆()系统调用

当我通过传递0作为stack_start调用克隆系统调用时会发生什么? 根据克隆的手册页,它应该返回-EINVAL ,但是当我这样做时,它显示SIGSEGV (11)错误。

 clone(func,NULL,0,args); 

应该返回-EINVAL,但它与SIGSEGV失败

根据linux内核有这样一个调用链:

sys_clone(… stack_start …) – > do_fork

do_fork(… stack_start …) – > copy_process

copy_process(… stack_start …) – > copy_thread

X86_32上的copy_thread(… stack_start …)或X86_64上的copy_thread(… stack_start …)

看着copy_thread我认为这个函数没有检查stack_start正确性(代码中的sp参数),所以在克隆之后,我们有一个带有无效堆栈指针的任务,并且在零地址处的第一个引用导致SIGSEGV

我建议你也看一下克隆功能的glibc包装。