linux - Linux 中的 Clone() 系统调用

标签 linux linux-kernel system-calls

当我通过传递 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/

相关文章:

linux - 设置了具有 "sudo"Windows 权限的非 root 用户帐户

linux - ls 输出特定文件的颜色?

c - 修改 fs/binfmt_elf.c 以获取自定义添加的部分内容

linux - 有限制的 Shellcode

C 程序 - printf 与其他 printf 字符重叠

linux - xdotool 类型需要很长时间并导致整个桌面卡住

linux - 如何让 Raspberry Pi 直接启动进入浏览器?

c - 绕过 softlockup_threshold

makefile - 在单独的对象目录中构建树外 Linux 内核模块

linux - 未找到新的系统调用(linux 内核 3.0.0)我应该从哪里开始寻找?