Fork 系统调用失败后 rax 中的返回值是多少?

2024-04-14

我知道打电话fork()在C中如果有错误将返回-1,但我想知道当你调用时错误返回值是什么sys_fork在装配中。

我通常会假设它也返回 -1,但我已经处理过 sys_brk 并且汇编中的原始系统调用返回与 C Brk() 包装器不同的东西。

有谁知道汇编中的 fork 错误返回值是什么?

(我正在 Linux 上进行 64 位 NASM 汇编)


首先也是最重要的一点是,C 库包装器fork(2) http://man7.org/linux/man-pages/man2/fork.2.html调用sys_clone http://elixir.free-electrons.com/linux/v3.3/source/arch/x86/kernel/process.c#L257并不是sys_fork http://elixir.free-electrons.com/linux/v3.3/source/arch/x86/kernel/process.c#L235.

C 库/内核差异

从2.3.3版本开始,不再调用内核的fork()系统
调用,作为 NPTL 一部分提供的 glibc fork() 包装器
线程实现调用clone(2),其标志提供了
与传统的系统调用效果相同。


The Linux手册第2部分简介 http://man7.org/linux/man-pages/man2/intro.2.html解释如何在一般上下文中解释系统调用的返回值:

返回值

出错时,大多数系统调用都会返回负错误数(即
errno(3) 中描述的常量之一的负值。 C
库包装器向调用者隐藏此详细信息:当系统调用时
返回负值,包装器将绝对值复制到
errno 变量,并返回 -1
作为返回值
包装纸。

So for most系统调用,EAX/RAX 保持-ESOMETHING错误时,或成功时非负结果。 libc 包装器对其进行解码以实现第 2 节手册页中描述的 errno 设置并返回 -1 行为,该手册页主要记录了包装器; “C 库/内核差异”的详细信息有时可以在 Linux 手册页的注释部分找到。

It's important to note that this applies to most but not all system calls, as the first paragraph says. sys_fork is not special in this regard. A couple interesting special cases are getpriority as mentioned in the beginning of errno(3) http://man7.org/linux/man-pages/man3/errno.3.htmlmore below, and mmap. (Valid pointers can have their high bit set, so distinguishing error from success requires other tricks, like checking the low bits since a successful mmap always returns a page-aligned address http://nullprogram.com/blog/2016/09/23/.) These ABI details are not documented in the man pages.


为了查明是否sys_fork调用成功,测试负值就足够了:

test eax, eax
jl _error_handler              ;See Peter Cordes's comments below

我已经包含了有关 C 库包装器的部分,例如fork(2) http://man7.org/linux/man-pages/man2/fork.2.html因为它提供了一种找出错误号的实用方法。
的价值errno,取反,是系统调用可能返回的可能错误值。

EAGAIN
伊诺梅
伊诺西斯
ERESTARTNOINTR

一般来说,C 库包装器可以在将返回值写入之前添加、删除或转码errno,所以这是失败的。

找出可能的返回值的最终方法是查看源代码。
例如,do_fork http://elixir.free-electrons.com/linux/v3.3/source/kernel/fork.c#L1515,由调用sys_fork, 可以返回EINVAL and EPERM除了上面列出的值之外。
其他值也是可能的,我没有深入研究所有嵌套函数调用。

sys_clone还调用do_fork所以我假设clone(2) http://man7.org/linux/man-pages/man2/clone.2.html#ERRORS可以返回所有的错误号fork(2) can.


调查案件sys_getpriority http://elixir.free-electrons.com/linux/latest/source/kernel/sys.c#L252上面提到了一条评论

/*
 * Ugh. To avoid negative return values, "getpriority()" will
 * not return the normal nice-value, but a negated value that
 * has been offset by 20 (ie it returns 40..1 instead of -20..19)
 * to stay compatible.
 */

看来Linux系统调用always发生错误时返回负值,C 库包装器尝试将这些值规范化为errno,引入额外的复杂性层。

正如我们从mmap在这种情况下,设置符号位并不总是意味着它是错误值。 根据这个答案 https://stackoverflow.com/questions/18996410/linux-kernel-system-call-returns-1-instead-of-1-256/18998521#18998521(下面的 Peter Cordes 评论值得称赞),值在该范围内[-4095,-1]总是意味着错误,但其他负值不应该。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fork 系统调用失败后 rax 中的返回值是多少? 的相关文章

  • 除了 iptables 之外还有数据包管理实用程序吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Linux 实用程序 它可以根据一组规则更改网络数据包的有效负载 理想情况下 我会使用
  • 从 Java 读取 /dev/input/js0

    我正在尝试阅读 dev input js0来自Java 但我不断得到 java io IOException Invalid argument at java io FileInputStream read0 Native Method a
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • sed 仅最后一个匹配模式

    我想sed仅文本文件的最后一个匹配模式 输入文件 boy boy girl boy 输出文件 boy boy girl boys 一种方法是反转文件 仅替换第一个匹配项 然后再次反转 tac
  • 如何使用sprof?

    请举例说明 从邮件中找到here http sources redhat com ml libc alpha 2003 07 msg00029 html and here http sourceware org ml binutils 20
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • 如何使用 tmuxinator 在 tmux 中拆分水平窗格内的两个垂直窗格

    目前我的 tmuxinator yml 文件中有这个 windows editor layout main horizontal panes vim server rails s 这给了我两个窗口 一个用于编辑器 另一个用于服务器 在编辑器
  • Snap-confine 具有提升的权限,并且不受限制,但应该受到限制。拒绝继续避免权限升级攻击

    我已经使用 snap 一段时间了 但最近升级后 当我尝试打开任何应用程序时 出现此错误 Snap confine has elevated permissions and is not confined but should be Refu
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • 我在哪里可以学习如何使 C++ 程序与操作系统 (Linux) 交互

    我是一个 C 初学者 我想创建与操作系统交互的小程序 使用 Kubuntu Linux 到目前为止 我还没有找到任何教程或手册来让 C 与操作系统交互 在 PHP 中 我可以使用命令 exec 或反引号运算符来启动通常在控制台中执行的命令
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 无法访问打开的/arch/x86/syscalls/syscall_32.tbl

    当我在切换到内核后编写此命令时 当我编译它时 它没有显示任何列表 是否有其他命令可以打开列表 open arch x86 syscalls syscall 32 tbl Bug 先删除 文件路径中的字符 应该是relative http e
  • 使用netcat将unix套接字传输到tcp套接字

    我正在尝试使用以下命令将 unix 套接字公开为 tcp 套接字 nc lkv 44444 nc Uv var run docker sock 当我尝试访问时localhost 44444 containers json从浏览器中 它不会加
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • Docker DNS 设置

    我尝试使用自定义网络和 dos 设置创建 docker 容器 docker网络创建 driver bridge opt com docker network bridge enable ip masquerade true opt com
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r

随机推荐