是因为Rust标准库通过glibc调用内核系统调用吗?但是在Rust本身编写系统调用包装器并不难吗?
答案 0 :(得分:6)
当一种语言基于C库时,其库调用通常如下所示:
Language API -> C API -> System API
当一种语言不使用C库时,它的库直接调用委托给系统API:
Language API -> System API
当您在中间使用C API时,语言API的实现将更容易编写,因为您几乎不需要编写任何特定于操作系统的代码。反过来,这可以使语言更容易跨平台 - 您可以委托跨平台C库,而不是考虑如何使用具体的平台特定功能。
原则上,Rust中没有任何内容可以防止您丢弃C库并直接使用系统调用。正如你所注意到的,Go正是这样做的。但是,对于libc的依赖并不认为Rust开发人员在标准库中编写大量特定于平台的代码是合理的。
答案 1 :(得分:3)
库/二进制文件不应直接调用系统调用,而应始终调用相应的函数:
LD_PRELOAD
livrary覆盖库函数。POSIX在library (function) level定义API,但不强制要求任何类型的系统调用约定。
例如,Wine项目通过提供在本机libc之上实现Windows API的库来运行Windows程序。如果您有一个程序进行直接的Windows系统调用,Wine将无法执行任何操作,因为Wine不实现系统调用,而只实现库级别的Windows API。
此外,Rust在libc和其他库中调用了许多其他东西:
malloc
,free
pthread_mutex
,pthread_cond
; strcmp
,strlen
,strncpy
; qsort
,bsearch
。