什么时候可以将 C 中的函数作为系统调用来调用

When can I call a function in C as a system call

在C语言中,fopen(), open()我都可以用于文件操作。

fopen()是不是系统调用?如果没有,为什么?

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

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

系统调用是应用程序的最低级功能。它们往往是简洁的 API,提供完成任务所需的最低限度。系统调用是您的应用程序向内核发出的与文件系统或网络套接字等事物交互的请求。

系统调用的主要区别在于您离开应用程序代码所在的用户模式上下文运行,并转换到内核模式,内核代码执行的位置来为您处理该请求。

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

开始

fopen() 是一个库调用,由你的 libc 提供。 man 3 fopen 为您提供详细信息。许多这些库调用充当系统调用的包装器。 fopen 在幕后进行了一次 open() 调用,同时还设置了 FILE 流 - 一种使您作为开发人员的生活更轻松的抽象。

例如,对于 write 系统调用,您向它传递一个指向某些数据的指针和一个长度 - 仅此而已。使用 FILE 流,您可以 fwritefprintf 等。这些流还提供 缓冲 ​​ 以提高应用程序的性能。系统调用会产生大量开销,以进行用户内核模式切换;这种缓冲基本上结合了多个 fwrite / fprintf 调用来加快速度。

另请参阅:

一般信息

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

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

通常,标准库提供的包装函数为底层系统调用and/or提供了一些额外的功能and/or完整性检查/错误检查.

系统调用是传递给内核的最少调用,它在内核模式和returns下执行 所需的结果]用户-space 应用程序。

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

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


回答你的问题

open()是系统调用。

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

syscalls 手册页中查看更多详细信息。

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

有关库和系统调用之间区别的更多详细信息,请参阅 open() and man page of fopen() and here 的手册页。后者link表示:

Well, the answer to this is the fact that fopen() is a library function which provides buffered I/O services for opening a file while open() is a system call that provides non-buffered I/O services. Though open() function is also available for applications to use but application should avoid using it directly.