如果实际的系统调用是clone(),为什么在strace中接受fork()?

问题描述 投票:0回答:1

我正在使用以下命令来检查我的程序之一执行期间的系统调用次数:

strace -e trace=<syscall> -c ./program [ARGS] 

如果我用

<syscall>
替换
fork()
,它总共返回 0 个调用,因为它现在是用
clone()
实现的。但是,如果它始终返回 0,为什么它仍然被接受为系统调用呢?它不只是实际系统调用的包装吗
clone()

我希望

strace
命令返回
trace=fork()
的错误,例如:

strace: invalid system call 'fork'

我只是不明白为什么它仍然被接受为有效参数,如果它实际上只是

clone()
。我缺少什么?如果参数只接受系统调用,为什么在
strace
中仍然接受?

我检查的链接:

c fork system-calls glibc strace
1个回答
0
投票

您将 C 库函数与实际的系统调用混淆了。由于

clone
系统调用更强大并且始终可以用来代替
fork
,因此大多数 C 库都根据
fork()
系统调用实现了库函数
clone
。然而,
fork
系统调用肯定仍然存在。这是因为内核需要保证与使用
fork
的旧程序的向后兼容性。

在内核代码内部,它是作为对

clone
的调用来实现的,但它仍然存在。我能想到的唯一不存在
fork
作为系统调用的架构是具有 AArch64 ABI 的 ARM64,这是相当新的。

© www.soinside.com 2019 - 2024. All rights reserved.