什么时候可以在C中调用函数作为系统调用
在C编程语言中,fopen()和open()都可以用于文件操作 fopen()是否为系统调用?如果没有,为什么 open()是否为系统调用?如果是,为什么?什么时候可以在C中调用函数作为系统调用,c,linux,operating-system,C,Linux,Operating System,在C编程语言中,fopen()和open()都可以用于文件操作 fopen()是否为系统调用?如果没有,为什么 open()是否为系统调用?如果是,为什么?open()是一个系统调用man 2 open提供了详细信息,系统调用在第2节中 系统调用是应用程序的最低级别功能。它们往往是一个简单的API,提供了完成任务的最低限度。系统调用是应用程序向内核发出的与文件系统或网络套接字等内容交互的请求 系统调用的主要区别在于,您离开了应用程序代码运行的用户模式上下文,并转换到内核模式,在内核模式下,内核代
open()
是一个系统调用<代码>man 2 open提供了详细信息,系统调用在第2节中
系统调用是应用程序的最低级别功能。它们往往是一个简单的API,提供了完成任务的最低限度。系统调用是应用程序向内核发出的与文件系统或网络套接字等内容交互的请求
系统调用的主要区别在于,您离开了应用程序代码运行的用户模式上下文,并转换到内核模式,在内核模式下,内核代码执行以处理该请求
关于这个话题有很多信息。我建议你先开始
fopen()
是libc提供的库调用<代码>man 3 fopen为您提供详细信息。许多库调用充当系统调用的包装器fopen
在引擎盖下进行open()
调用,但也设置文件
流-这是一种使开发人员的生活更轻松的抽象
例如,通过write
系统调用,您向它传递一个指向某些数据的指针和一个长度,仅此而已。使用文件
流,您可以fwrite
、fprintf
等。这些流还提供缓冲,从而提高应用程序的性能。系统调用会产生相当大的开销,以使用户内核模式切换;这种缓冲基本上结合了多个fwrite
/fprintf
调用来加快速度
另见:
- 系统调用基本上是应用程序与操作系统内核的接口
- 系统调用通常由平台的标准库提供的包装函数包装李>
回答您的问题
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结束(读取)