我正在使用以下命令来检查我的程序之一执行期间的系统调用次数:
strace -e trace=<syscall> -c ./program [ARGS]
如果我用
<syscall>
替换 fork()
,它总共返回 0 个调用,因为它现在是用 clone()
实现的。但是,如果它始终返回 0,为什么它仍然被接受为系统调用呢?它不只是实际系统调用的包装吗clone()
?
我希望
strace
命令返回 trace=fork()
的错误,例如:
strace: invalid system call 'fork'
我只是不明白为什么它仍然被接受为有效参数,如果它实际上只是
clone()
。我缺少什么?如果参数只接受系统调用,为什么在strace
中仍然接受?
我检查的链接:
您将 C 库函数与实际的系统调用混淆了。由于
clone
系统调用更强大并且始终可以用来代替 fork
,因此大多数 C 库都根据 fork()
系统调用实现了库函数 clone
。然而,fork
系统调用肯定仍然存在。这是因为内核需要保证与使用 fork
的旧程序的向后兼容性。
在内核代码内部,它是作为对
clone
的调用来实现的,但它仍然存在。我能想到的唯一不存在 fork
作为系统调用的架构是具有 AArch64 ABI 的 ARM64,这是相当新的。