在C编程语言中,fopen(),open()我可以同时使用它们进行文件操作。
是fopen()是否是系统调用?如果没有原因?
是open()是不是系统调用?如果是的话为什么?
答案 0 :(得分:2)
一般信息
有时系统调用名称和包装函数名称相同,有时它们不是。
通常,标准库提供的包装函数为底层的系统调用提供了一些额外的功能和/或健全性检查/错误检查。
系统调用是传递给内核的最小调用,它在内核模式中执行,并将所需结果返回给用户空间应用程序。 / p>
对于每个内核版本,都有可用的已定义系统调用集,通常由与每个调用关联的数字表示。准备参考:arch/i386/kernel/entry.S file(寻找sys_call_table
)
回答您的问题
open()
是系统调用。
fopen()
是标准库[例如linux glibc]提供的包装器。
在syscalls
手册页中查看更多详情。
答案 1 :(得分:0)
open()
是系统调用。 man 2 open
为您提供详细信息,系统调用位于第2部分。
系统调用是应用程序的最低级功能。它们往往是一个简单的API,提供完成任务的最低限度。系统调用是从您的应用程序到内核的请求,以便与文件系统或网络套接字等内容进行交互。
系统调用的主要区别特征是您将用户模式上下文保留在应用程序代码运行的位置,并转换到内核模式,内核代码执行以处理该请求对你而言。
有很多关于该主题的信息。我建议你从Google开始。
fopen()
是一个由libc提供的库调用。 man 3 fopen
为您提供详细信息。其中许多库调用都充当系统调用的包装器。 fopen
进行了open()
调用,但也设置了FILE
流 - 一种让您的开发人员生活更轻松的抽象。
例如,通过write
系统调用,您可以向其传递指向某些数据的指针和长度 - 这就是全部。使用FILE
流,您可以fwrite
,fprintf
等。这些流还提供缓冲,可提高应用程序的性能。系统调用会产生相当大的开销,使用户内核模式切换;此缓冲基本上结合了多个fwrite
/ fprintf
调用,以加快速度。
另见:
答案 2 :(得分:0)