我什么时候可以在C中调用函数作为系统调用

时间:2015-01-05 06:32:27

标签: c linux operating-system

在C编程语言中,fopen(),open()我可以同时使用它们进行文件操作。

是fopen()是否是系统调用?如果没有原因?

是open()是不是系统调用?如果是的话为什么?

3 个答案:

答案 0 :(得分:2)

一般信息

  • 系统调用基本上是应用程序与操作系统内核的接口。
  • 系统调用通常由平台标准库提供的包装函数包装。

有时系统调用名称和包装函数名称相同,有时它们不是。

通常,标准库提供的包装函数为底层的系统调用提供了一些额外的功能和/或健全性检查/错误检查。

系统调用是传递给内核的最小调用,它在内核模式中执行,并将所需结果返回给用户空间应用程序。 / p>

对于每个内核版本,都有可用的已定义系统调用集,通常由与每个调用关联的数字表示。准备参考:arch/i386/kernel/entry.S file(寻找sys_call_table

标准[或非标准]库提供的库函数OTOH是简单的API,用于提供对各种功能的访问,包括系统调用,对于开发人员来说有点简单。这些用于隐藏一些复杂的部分,提供一些额外的检查,一些错误处理,最后调用内部函数,主要是基础系统调用


回答您的问题

open()是系统调用。

fopen()是标准库[例如linux glibc]提供的包装器。

syscalls手册页中查看更多详情。

答案 1 :(得分:0)

open()是系统调用。 man 2 open为您提供详细信息,系统调用位于第2部分。

系统调用是应用程序的最低级功能。它们往往是一个简单的API,提供完成任务的最低限度。系统调用是从您的应用程序到内核的请求,以便与文件系统或网络套接字等内容进行交互。

系统调用的主要区别特征是您将用户模式上下文保留在应用程序代码运行的位置,并转换到内核模式,内核代码执行以处理该请求对你而言。

有很多关于该主题的信息。我建议你从Google开始。


fopen()是一个由libc提供的库调用。 man 3 fopen为您提供详细信息。其中许多库调用都充当系统调用的包装器。 fopen进行了open()调用,但也设置了FILE流 - 一种让您的开发人员生活更轻松的抽象。

例如,通过write系统调用,您可以向其传递指向某些数据的指针和长度 - 这就是全部。使用FILE流,您可以fwritefprintf等。这些流还提供缓冲,可提高应用程序的性能。系统调用会产生相当大的开销,使用户内核模式切换;此缓冲基本上结合了多个fwrite / fprintf调用,以加快速度。

另见:

答案 2 :(得分:0)

open()是系统调用,fopen()是库函数。

有关更多详细信息,请参阅open()的手册页和fopen()的手册页以及here,了解库和系统调用之间的差异。后一个链接说:

  

嗯,答案是fopen()是一个库函数,它提供用于打开文件的缓冲I / O服务,而open()是一个提供非缓冲I / O服务的系统调用。虽然open()函数也可供应用程序使用,但应用程序应避免直接使用它。