前言:之前知道在Linux系统中,软件要通过系统调用接口才能进入内核,比如软件使用read函数要读取硬件设备数据时,要通过系统调用进入内核,调用内核的驱动程序,才能访问硬件。大体上是这样,但具体细节仍不明确。
应用程序的函数和系统调用的关系,是所有函数都需要系统调用吗?
Linux系统中自带的函数由glibc提供,glibc是GNU发布的libc库,是标准C的gnu实现,基于GPL的。glibc库提供了系统调用和所要用到的其他函数库,所有动态连接的程序都要用到它。说白了就是它提供了linux用户编程所用到的所有库函数(自己定义的除外)。但它并不直接实现系统调用,而是把标准C库和系统调用全部封装成API提供给用户,比如用户调用read函数的时候,会直接调用glibc的read函数(API),这个read函数里会封装一个同名的read系统调用。它包括linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc,linux下的gcc默认使用glibc。在linux下面可以通过“rpm -q glibc”查看有没有安装glibc以及版本号.
总结一下:应用程序用到的函数都来自glibc库函数(不考虑自定义函数),其中包括:
a、封装好的同名系统调用函数。如open、read函数,这类函数接口也叫做POSIX接口、系统调用的接口,适用于所有类unix平台。
b、标准C函数,其中某些比如fopen、fread函数,是对open、read函数的进一步封装(增添了buffer缓冲区,减少了进入内核的次数),也会触发系统调用,兼容适用于linux,window系统。而某些不操作硬件的标准C库函数则不会触发系统调用,只是用户层的程序实现。例如strcpy函数。
(注:使用系统调用的方式有两种:
- glibc库中封装了系统调用,通过c库间接调用
- 传递系统调用号,通过syscall直接调用
第2种方式存在的意义在于,当kernel提供了新的系统调用,而c库又没有更新时,可以使用syscall调用新的系统调用。)
原文链接:https://blog.csdn.net/weixin_36015213/article/details/112843302