C库的实现是否依赖于OS?

时间:2014-12-18 11:01:01

标签: c operating-system systems-programming

我只是想知道在不同的操作系统中有不同的功能,但它们用于相同的目的,或者可以说不同的操作系统具有不同的系统编程语言(如Windows的版本与UNIX版本)。

因此,例如,由于C库包含函数的实现,它们的实现必须调用不同的函数(取决于OS),以实现相同的功能。它是否正确? 那么,在cygwin中使用的库是用于编译专门为Windows编写的C程序,还是gcc编写的,特别是对于Linux?我对么? 如果没有,为什么呢?

4 个答案:

答案 0 :(得分:4)

是的,这是正确的。不同的OS具有不同的功能,可以执行相同的操作。例如,在Windows上,您可以通过调用CreateThread()创建一个线程,而在Linux上则调用pthread_create()

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

Cygwin等喜欢添加库以在Windows上实现仅支持linux的功能。例如,cygwin将通过包装pthread_create()在Windows上实现CreateThread(),就像MS为fopen()所做的那样。

答案 1 :(得分:2)

要添加到ElderBug's answer,充当不同类型系统调用包装的C库会因系统而异。系统调用,例如以下(来自NYU's Operating Systems, Lecture #4),将进程从用户模式转移到超级用户/内核模式。

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

  

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

enter image description here

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

希望有所帮助!

答案 2 :(得分:1)

是的,你明白了。我可以添加的内容不多。

但据我所知,操作系统正在为图书馆服务,他们只是联系起来。 原因是,开发系统特定实现的程序员最了解自己的系统。 实现fopen()不只是要求硬盘获取其中的内容。 (你可能知道)

您必须尊重使用文件描述符的其他实现的许多情况。也许你必须依赖于你的操作系统中特定功能中发生的事情,不需要什么样的行为。但是在你的环境中,这一直都在运行。

这也是为什么C标准说更改标准库的源代码会导致未定义的行为,即使它自身的功能仍然提供相同的行为(试图为你找到引用但是不能,抱歉。)< / p>

所以它是一个优化的东西。可能有generell实现,但由于整个操作系统主要基于thoose实现,每个操作系统都有兴趣使它们为自己的Case运行最佳。

(可能不是唯一一个,但我在操作系统开发方面并不是那么深,因为我可以命名另一个)

答案 3 :(得分:1)

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

sprintf和atoi等实用程序函数在任何实现上都是相同的,因为它们不需要OS系统服务。

通常,您的库中会有一个抽象层。你可能有像

这样的功能
 void * getBytesFromOS (unsigned int count) ;

分配内存页面。它将有各种系统的不同实现。使用这种接口的malloc函数在操作系统中的可能性可能相同。

相关问题