所以我正在努力解决 syscall() 和可移植性的概念。我听说使用系统调用包装器比仅进行系统调用更便携,但为什么呢?我知道可移植性是指我的代码能够在不同的系统或平台上运行,但我不明白为什么系统调用包装器比 syscall() 更可移植?
并非每个架构都有每个系统调用。例如,RISC-V 没有
rmdir
。如果您使用包装函数,那么 libc 将自动为您调用其替换函数(unlinkat
与 AT_REMOVEDIR
)。但如果您尝试使用原始系统调用,它就是行不通的。
操作系统之间也存在差异。一个极端的例子是 OpenBSD:出于安全原因,动态链接的程序根本不允许进行原始系统调用。那里唯一起作用的是包装函数。