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

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

如果我用fork()替换<syscall>,它总共返回0个调用,就像现在用clone()实现的那样.但是,如果它总是返回0,为什么它仍然被接受为系统调用?它不只是一个真正的syscall clone()的包装器吗?

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

strace: invalid system call 'fork'

我只是不明白为什么它仍然被接受为一个有效的参数,如果它实际上只是clone().我错过了什么?如果参数只接受系统调用,为什么在strace中仍然被接受?

我判断过的链接:

推荐答案

您将C库函数与实际的syscall混淆了.由于clone syscall更强大,并且总是可以用来代替fork,所以大多数C库都实现了关于clone syscall的库函数fork().然而,fork系统调用肯定仍然存在.这是因为内核需要保证与使用fork的旧程序的向后兼容性.

在内部,就内核代码而言,fork被实现为对clone的调用(参见例如,第here章,但它仍然存在.因此,像strace这样的工具仍然知道fork并允许你过滤它是有意义的.我能想到的唯一一个架构,其中fork不存在作为一个系统调用是ARM64和AArch64 ABI,这是"最近的".

C++相关问答推荐

rSP堆栈指针在返回函数调用的值时有任何用途吗?

错误:在.h程序中重新定义 struct

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

预先分配虚拟地址空间的区域

Flose()在Docker容器中抛出段错误

1处的解析器错误:yacc语法的语法错误

Square不与Raylib一起移动

用gcc-msse 2编译的C程序包含AVX 1指令

编译器如何处理具有更复杂值的枚举?

错误...的多个定义(&Q)首先在这里定义&

如何在C宏定义中包含双引号?

当我在34mb的.mp4文件中使用FREAD时,我得到了一个分段错误,我如何解决它?

浮动目标文件,数据段

按字典顺序打印具有给定字符的所有可能字符串

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?

从系统派生线程调用CRT

令人困惑的返回和 scanf 问题相关

Makefile - 将 .o 文件放入子文件夹中

使用邻接表创建图

在 C23 之前如何对空指针使用nullptr?