当我通过传递0作为stack_start来调用克隆系统调用时会发生什么?
根据克隆的手册页面,它应该返回-EINVAL
,但是当我这样做时,它会显示SIGSEGV (11)
错误。
clone(func,NULL,0,args);
应该返回-EINVAL,但是它失败了SIGSEGV
答案 0 :(得分:1)
根据linux内核有这样一个调用链:
sys_clone(...stack_start...) - > do_fork
do_fork(...stack_start...) - > copy_process
copy_process(...stack_start...) - > copy_thread
copy_thread(...stack_start...) on X86_32或copy_thread(...stack_start...) on X86_64
查看copy_thread
会让我假设因为此函数不检查stack_start
正确性(代码中的sp参数)所以在克隆之后我们有一个带有无效堆栈指针和第一个引用的任务零地址导致SIGSEGV
。
我建议你看看克隆功能的glibc包装器。