库函数实际也是调用的系统函数,是否可以理解为库函数也是对系统函数的进一步封装?看下面截图,我理解得没有错,库函数确实就是对系统调用的进一步封装,讲道理我直接用系统调用也是可以的,只不过麻烦点罢了。我们从本质去理解,库函数库函数本质就是一些函数嘛,免得你重复去写,就先写好放在那嘛,你调用嘛,你不想用库函数,直接用系统调用也可以啊,本质就是你自己把库函数自己写了一遍嘛,你这么理解 就通了。但是有了POSIX,就更没必要去直接系统调用,直接用库函数多好,可以直接移植不用改,你要是直接用系统调用,不同系统的系统调用不一样的。
![](https://img-blog.csdnimg.cn/2020051106303717.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200510185127700.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
https://www.cnblogs.com/Robotke1/p/3329612.html
下面这段话也是华清远见教材里的。
Linux系统调用非常精简(只有250个左右),它继承了UNIX系统调用中最基本和最有用的部分。这些系统调用按照功能逻辑大致可分为进程控制、进程间通信、文件系统控制、存储管理、网络管理、套接字控制、用户管理等几类。
(所以怪不得linux系统编程就那几种)
前面讲到的系统调用并不直接与程序员进行交互,它仅仅是一个通过软中断机制向内核提交请求以获取内核服务的接口。实际使用中程序员调用的通常是用户编程接口——API。
例如,创建进程的API函数frok()对应于内核空间的sys_fork()系统调用,但并不是所有的函数都对应一个系统调用。有时,一个API函数会需要几个系统调用来共同完成函数的功能,甚至还有一些API函数不需要调用相应的系统调用(因此它所完成的不是内核提供的服务)。
在Linux中,用户编程接口(API)遵循在UNIX中最流行的应用编程界面标准——Posix标准。Posix标准是由IEEE和ISO/IEC共同开发的标准系统,该标准基于当时现有的UNIX实践和经验,描述了操作系统的系统调用编程接口(实际上就是API),用于保证应用程序可以在源代码一级上、在多种操作系统之间移植运行。这些系统调用编程接口主要是通过C库(libc)实现的。
(看了上面的你得区分API和系统调用)
http://www.hqyj.com/news/emb167.htm
![](https://img-blog.csdnimg.cn/20200510172920223.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
似乎API就是指那些库函数。是API遵循Posix标准。所以你很多这些细节基础知识没有弄清楚。
你再结合下面这篇文章就可以完全弄清楚弄懂了。整个系统调用 库函数 API POSIX之间的关系可以理得清清楚楚。
![](https://img-blog.csdnimg.cn/2020051020314975.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200510182027911.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200510125431308.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200510111316150.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/202005101146457.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
我发现这部分在讲驱动的书里面反而讲得清楚些,讲linux c应用层编程的书反而没有怎么讲或者没有怎么细讲,
我发现我突然有点喜欢内核层面的编程了,因为它真正告诉了你一些原理,真的是这样。
像我之前想深入理解进程这个东西,你会发现Linux c编程的书基本不怎么讲,反而是在linux内核的书里面找到了真正详细讲进程的。
我也觉得就算是弄Linux应用层编程也需要去学内核学驱动开发,我觉得这样才能把应用层弄得更好,这么来看我觉得华清的课程体系还是蛮合理的。就算你将来只想弄应用层开发,也有必要学学内核层面的开发,你以后弄驱动开发也有必要学学应用层的开发,这个华清的老师在视频里面也说过。
我也觉得这样你对linux无论是应用层还是内核层都有了把握,对linux整体有了把握,再去弄应用层编程或者驱动编程可能会更好一些。这样才能打下一个扎实的linux功底。
![](https://img-blog.csdnimg.cn/20200510115836515.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200510115855719.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
经过这样的理解之后,你就真正清楚C语言函数库的作用了,你再去回看为什么用数学库时编译要加个 -ml 用线程库时要加-lpthread
因为他们在C语言的标准函数库里面没有啊。你之前这种细节偏底层的原理没有弄清楚你就会比较乱。理解了一些底层和本质你就可以灵活使用。
![](https://img-blog.csdnimg.cn/20200511065046255.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
之前你总结的是说什么系统的库,我感觉这个说得很模糊,是否不是GUN库的就得指定链接呢?
![](https://img-blog.csdnimg.cn/20200511072656438.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
看下面的,gcc好像确实是自动链接的标准库,对于非标准库,第三方库得手动指定链接。上面所说的系统的库应该就是指C的标准库。
![](https://img-blog.csdnimg.cn/20200511073220835.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200511074811448.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
好像上面的没理解对,因为GUN的库里面包含了数学库,线程库那些,你看看上面的截图。
下面截图自《linux c与c++一线开发实践》
这里面说了glibc是linux的基石之一。
![](https://img-blog.csdnimg.cn/20200511085556266.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzE2NjQzMjIz,size_16,color_FFFFFF,t_70)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)