C库的实现是否依赖于操作系统?

C库的实现是否依赖于操作系统?,c,operating-system,systems-programming,C,Operating System,Systems Programming,我只是想知道,不同的操作系统有不同的功能,但它们的用途是相同的,或者说不同的操作系统有不同的系统编程语言(比如Windows和UNIX) 因此,例如,由于C库包含函数的实现,它们的实现必须调用不同的函数(取决于操作系统),以实现相同的功能。这是正确的吗? 那么,cygwin中的库是否用于编译专门为Windows编写的C程序,以及gcc的库,尤其是Linux?我说得对吗? 如果没有,为什么呢?是的,这是正确的。不同的操作系统有不同的功能来做相同的事情。例如,在Windows上通过调用CreateT

我只是想知道,不同的操作系统有不同的功能,但它们的用途是相同的,或者说不同的操作系统有不同的系统编程语言(比如Windows和UNIX)

因此,例如,由于C库包含函数的实现,它们的实现必须调用不同的函数(取决于操作系统),以实现相同的功能。这是正确的吗? 那么,cygwin中的库是否用于编译专门为Windows编写的C程序,以及gcc的库,尤其是Linux?我说得对吗?
如果没有,为什么呢?

是的,这是正确的。不同的操作系统有不同的功能来做相同的事情。例如,在Windows上通过调用
CreateThread()
创建线程,而在linux上则调用
pthread\u create()

关于C运行时,所有操作系统都实现了它们,但不同。在Windows上,
fopen()
是将调用
CreateFile()
的包装器,而在linux上,
fopen()
open()
的包装器


Cygwin等人添加了一些库,以便在Windows上实现仅限linux的功能。例如,cygwin将通过包装
CreateThread()
,在Windows上实现
pthread\u create()
,就像微软为
fopen()
所做的那样。我没有什么可以补充的

但据我所知,操作系统是为图书馆服务的,它们只是被链接起来。 原因是,开发特定于系统的实现的程序员最了解自己的系统。 实现一个
fopen()
不仅仅是要求硬盘提供一条通道来存储其内容。(你可能知道)

您必须考虑使用文件描述符的其他实现的许多情况。也许你必须依赖于你操作系统上某个特定函数中发生的某些事情,而对于generell行为来说,这是不需要的。但在你的环境中,这一切都在运行

这也是为什么C标准说更改标准库的源代码会导致未定义的行为,即使它本身的函数仍然服务于相同的行为(试图为您找到引用,但无法,抱歉)

因此,这完全是一件优化的事情。可能会有generell实现,但由于大部分整个操作系统都是基于这些实现的,所以每个操作系统都有兴趣让它们针对自己的情况运行得最好


(可能不是唯一的一个,但我对操作系统开发没有我能说的那么深入)

请记住,有两种类型的库函数:实用程序和系统包装器。假设您是一家试图创建便携库的供应商

像sprintf和atoi这样的实用功能在任何实现上都是相同的,因为它们不需要OS系统服务

通常,您的库中会有一个抽象层。你可能有一个函数,比如

 void * getBytesFromOS (unsigned int count) ;
它分配内存页。对于不同的系统,它将有不同的实现。使用这种接口的malloc函数在操作系统中可能有99%相同。

要添加到,充当不同类型系统调用包装器的C库在不同系统中有所不同。系统调用,例如下面的(from),将进程从用户模式转换为主管/内核模式

注意区分用户模式(包装器)和内核模式(操作系统的实现)的目标

操作系统的一个重要目标是从用户进程的角度观察简单的过程调用语义。复杂性隐藏在内核本身中,这是操作系统向用户进程提供更抽象(即更简单)虚拟机的另一个例子

正如您所知,这些示例调用在不同的操作系统(如Windows和Linux)中并不相似,但C包装函数的名称是相似的——否则,预编译语言本身在不同的系统中会有所不同


希望有帮助

这个问题可能没有它应有的精确,但我真的不知道如何更好地表达它。请原谅。您是在询问诸如
printf()
malloc()
之类的标准函数,还是询问诸如
CreateThread()
之类的函数?库包含诸如
printf()
等函数,它们需要系统调用来实现这些函数。无论如何,我不明白:你是在问像printf这样的函数,它们必须提供服务,但根据环境的不同而实现不同吗?或者询问一些函数,这些函数可以但不必与非标准化函数的行为相同?谢谢,我希望它应该是这样的,但我对OSs知之甚少。“而在linux上,fopen()是本机函数”你错了。你是说open()?@black My bad,我忘了
open()
pthread\u create
更像
\u beginthreadex
,实际上:调用C运行时库(CRT)的可执行文件中的线程应该使用_beginthreadex和_endthreadex函数进行线程管理,而不是使用CreateThread和ExitThread;这需要使用多线程版本的CRT。如果使用CreateThread创建的线程调用CRT,CRT可能会在内存不足的情况下终止进程。@MaximYegorushkin您没有抓住要点
\u beginthreadex
也是
CreateThread
的包装器
pthread\u create
在Windows中的等价物是
CreateThread