Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候可以在C中调用函数作为系统调用_C_Linux_Operating System - Fatal编程技术网

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

什么时候可以在C中调用函数作为系统调用,c,linux,operating-system,C,Linux,Operating System,在C编程语言中,fopen()和open()都可以用于文件操作 fopen()是否为系统调用?如果没有,为什么 open()是否为系统调用?如果是,为什么?open()是一个系统调用man 2 open提供了详细信息,系统调用在第2节中 系统调用是应用程序的最低级别功能。它们往往是一个简单的API,提供了完成任务的最低限度。系统调用是应用程序向内核发出的与文件系统或网络套接字等内容交互的请求 系统调用的主要区别在于,您离开了应用程序代码运行的用户模式上下文,并转换到内核模式,在内核模式下,内核代

在C编程语言中,fopen()和open()都可以用于文件操作

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

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

open()
是一个系统调用<代码>man 2 open提供了详细信息,系统调用在第2节中

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

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

关于这个话题有很多信息。我建议你先开始


fopen()
是libc提供的库调用<代码>man 3 fopen为您提供详细信息。许多库调用充当系统调用的包装器
fopen
在引擎盖下进行
open()
调用,但也设置
文件
流-这是一种使开发人员的生活更轻松的抽象

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

另见:


一般信息

  • 系统调用基本上是应用程序与操作系统内核的接口
  • 系统调用通常由平台的标准库提供的包装函数包装
有时系统调用名和包装器函数名相同,有时不同

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

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

对于每个内核版本,都定义了一组可用的系统调用,并且通常由与每个调用关联的数字表示。准备参考:(查找系统调用表)

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


回答您的问题

open()
是一个系统调用

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

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

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

有关更多详细信息,请参阅的手册页和的手册页,以了解库调用和系统调用之间的区别。后一个链接说:

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


查看手册并与“系统调用”的定义进行比较。将fopen()调用为open()的包装可能不合适。fopen()的主要用途是实现标准的C lib函数,而不是包装open()。包装器应该公开与包装器一样多的函数。真正的包装器主要是一个汇编代码,如:ENTRY(read)movl$\uuu NR\u read,%eax syscall。。。ret结束(读取)