标准库函数和系统调用的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010318270/article/details/81058065
一、标准库函数和系统调用的区别
函数库调用:与用户程序相联系,在用户地址空间执行,属于过程调用,调用开销较小。
系统调用:是操作系统的一个入口点,在内核地址空间执行,需要在用户空间和内核上下文环境间切换,开销较大。一般没有
    库函数对文件的操作实际上是通过系统调用来实现的,因此使用库函数也有系统调用的开销。
为什么不直接使用系统调用呢?
因为读写文件通常是大量的数据(相对于底层驱动的系统调用所实现的数据操作单位),这时,使用库函数可以大大减少系统调用的次数。
这是因为缓冲区技术,在用户空间和内核空间对文件操作都使用了缓冲区。当用户空间缓冲区满或者写操作结束时,才将用户缓冲区的内容写到内核缓存区。同理,内核缓冲区满或写结束时,才将内核缓冲区内容写到文件对应的硬件媒介。
系统调用函数:open, close, read, write, ioctl等,需要包含头文件unistd.h
C库函数:fopen, fread, fwrite, fclose, fflush, fseek等,需要包含头文件stdio.h

二、系统调用、POSIX、C库、系统命令和内核函数
系统调用虽然是内核和用户应用程序之间的沟通桥梁,是用户应用程序访问内核的入口点,但通常情况下,应该程序通过操作系统提供的应用编程接口(API)而不是直接通过系统调用来编程。
UNIX中最通用的操作系统API基于 POSIX标准(Portable Operating System Interface of UNIX 可移植操作系统接口)
操作系统API通常以 C库的方式提供,C库提供了POSIX的绝大部分API,同时内核提供的每个系统调用在C库中都具有相应的封装函数。
系统命令位于C库的更上层,是利用C库实现的可执行程序,比如ls, cd等命令。
系统调用最终必须具有明确的操作,用户应用程序通过系统调用进入内核后,会执行各个系统调用对应的 内核函数,即系统调用服务例程。
例如系统调用getpid的服务例程是内核函数sys_getpid。

三、如何实现一个新的系统调用
(1)编写系统调用服务例程
(2)添加系统调用号
(3)修改系统调用表
(4)重新编译内核并测试新添加的系统调用

猜你喜欢

转载自blog.csdn.net/u010318270/article/details/81058065