当我通过传递 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
copy_thread(...stack_start...) on X86_32或者 copy_thread(...stack_start...) on X86_64
查看 copy_thread
让我假设因为这个函数不检查 stack_start
正确性(代码中的 sp 参数)所以在克隆之后我们有一个任务无效的堆栈指针和零地址的第一个引用导致 SIGSEGV
。
我建议您也查看 glibc 的克隆函数包装器。
关于linux - Linux 中的 Clone() 系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12855463/