静态函数设计 ----- 系统调用与库函数的区别
2015-01-17 17:01
176 查看
Linux应用程序需要的外部函数主要由函数库和系统调用来提供。
函数库又分为静态函数库和动态函数库,Linux应用程序使用的主要函数库均放于/lib,/usr/lib目录下;Linux下默认使用动态函数库
静态函数库:*.a方式命名的库
动态函数库:*.so.*方式命名的库
RHEL默认不提供静态C函数库(libc.a)。这样的话在链接C的静态链接库或者程序在其他静态链接时用到C库时会出现错误如下图所示
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/27/0c6b77755beadc7c7bac751c28937337)
![](http://blog.csdn.net/u011467781/article/details/file:/C:/Users/jack%20de/AppData/Local/YNote/data/qq19DD510EC4127917E130C43F788EA87A/29be277cdff3411597a530265b153827/99504aeac793463abd462523653948a6.jpg)
使用静态链接库的缺点,则程序会将所用到的库函数代码在链接时,全部被copy到程序中。---相应的问题:如果多个进程在内存中同时运行,并使用相同的库函数,则造成对空间的浪费。
***静态函数库
1 . gcc –c
mylib.c –o mylib.o
2. ar cqs libmylib. a mylib.o
3. 将***好的 libmylib. a 复制到 /usr/lib
使用静态链接库时:gcc -static my_c.c -lmylib -o
my_c
注意加重颜色部分:虽然库的名字为libmylib.a,在链接时仅仅使用-l选项加上库的名字即可。
![](http://blog.csdn.net/u011467781/article/details/file:/C:/Users/jack%20de/AppData/Local/YNote/data/qq19DD510EC4127917E130C43F788EA87A/32ae827052c449a6b66dc7eed7aa05b0/8bd82a86f31b4c56b0b7475970b52021.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/27/f9aaa4590875a639494474ca04624c20)
![](http://blog.csdn.net/u011467781/article/details/file:/C:/Users/jack%20de/AppData/Local/YNote/data/qq19DD510EC4127917E130C43F788EA87A/ac7785a0350346df92b0c2714ee0c75c/ade0875878ae4bb19ba2e8d9e766e92c.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/27/17710d4aeb69b33436194750f2f3d9d2)
系统调用与库函数的区别
系统调用:所有的操作系统都提供多种服务的入口点,由此程序向内核请求服务。。这些具有良好定义、数量有限、直接进入内核的入口点被称为系统调用----------Linux3.20提供了380个系统调用,,由上知,系统调用是由Linux内核实现的。。
库函数:这些函数可能会调用一个或者多个内核的系统调用,但是它们不是内核的入口点,,例:printf函数调用write系统调用以输出一个字符串,但有的函数并不使用系统调用
两者之间的区别:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/27/0710a9321d9632c91884dd8739153fc5)
从实现的角度,系统调用与库函数有根本的区别;但从应用的角度,其区别不大
1、系统调用时,内核中的系统调用分配一块空间给进程,而库函数则在用户层次管理这一空间。
2、系统调用通常提供一种最小的接口,而库函数通常提供复杂的功能。例:sbrk系统调用和malloc函数的区别。
函数库又分为静态函数库和动态函数库,Linux应用程序使用的主要函数库均放于/lib,/usr/lib目录下;Linux下默认使用动态函数库
静态函数库:*.a方式命名的库
动态函数库:*.so.*方式命名的库
RHEL默认不提供静态C函数库(libc.a)。这样的话在链接C的静态链接库或者程序在其他静态链接时用到C库时会出现错误如下图所示
![](http://blog.csdn.net/u011467781/article/details/file:/C:/Users/jack%20de/AppData/Local/YNote/data/qq19DD510EC4127917E130C43F788EA87A/29be277cdff3411597a530265b153827/99504aeac793463abd462523653948a6.jpg)
使用静态链接库的缺点,则程序会将所用到的库函数代码在链接时,全部被copy到程序中。---相应的问题:如果多个进程在内存中同时运行,并使用相同的库函数,则造成对空间的浪费。
***静态函数库
1 . gcc –c
mylib.c –o mylib.o
2. ar cqs libmylib. a mylib.o
3. 将***好的 libmylib. a 复制到 /usr/lib
使用静态链接库时:gcc -static my_c.c -lmylib -o
my_c
注意加重颜色部分:虽然库的名字为libmylib.a,在链接时仅仅使用-l选项加上库的名字即可。
![](http://blog.csdn.net/u011467781/article/details/file:/C:/Users/jack%20de/AppData/Local/YNote/data/qq19DD510EC4127917E130C43F788EA87A/32ae827052c449a6b66dc7eed7aa05b0/8bd82a86f31b4c56b0b7475970b52021.jpg)
![](http://blog.csdn.net/u011467781/article/details/file:/C:/Users/jack%20de/AppData/Local/YNote/data/qq19DD510EC4127917E130C43F788EA87A/ac7785a0350346df92b0c2714ee0c75c/ade0875878ae4bb19ba2e8d9e766e92c.jpg)
系统调用与库函数的区别
系统调用:所有的操作系统都提供多种服务的入口点,由此程序向内核请求服务。。这些具有良好定义、数量有限、直接进入内核的入口点被称为系统调用----------Linux3.20提供了380个系统调用,,由上知,系统调用是由Linux内核实现的。。
库函数:这些函数可能会调用一个或者多个内核的系统调用,但是它们不是内核的入口点,,例:printf函数调用write系统调用以输出一个字符串,但有的函数并不使用系统调用
两者之间的区别:
从实现的角度,系统调用与库函数有根本的区别;但从应用的角度,其区别不大
1、系统调用时,内核中的系统调用分配一块空间给进程,而库函数则在用户层次管理这一空间。
2、系统调用通常提供一种最小的接口,而库函数通常提供复杂的功能。例:sbrk系统调用和malloc函数的区别。