区分系统调用和库函数(API)

2023-05-16

库函数实际也是调用的系统函数,是否可以理解为库函数也是对系统函数的进一步封装?看下面截图,我理解得没有错,库函数确实就是对系统调用的进一步封装,讲道理我直接用系统调用也是可以的,只不过麻烦点罢了。我们从本质去理解,库函数库函数本质就是一些函数嘛,免得你重复去写,就先写好放在那嘛,你调用嘛,你不想用库函数,直接用系统调用也可以啊,本质就是你自己把库函数自己写了一遍嘛,你这么理解 就通了。但是有了POSIX,就更没必要去直接系统调用,直接用库函数多好,可以直接移植不用改,你要是直接用系统调用,不同系统的系统调用不一样的。

 

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

似乎API就是指那些库函数。是API遵循Posix标准。所以你很多这些细节基础知识没有弄清楚。

你再结合下面这篇文章就可以完全弄清楚弄懂了。整个系统调用 库函数 API  POSIX之间的关系可以理得清清楚楚。

 

 

 

我发现这部分在讲驱动的书里面反而讲得清楚些,讲linux c应用层编程的书反而没有怎么讲或者没有怎么细讲,

我发现我突然有点喜欢内核层面的编程了,因为它真正告诉了你一些原理,真的是这样。

像我之前想深入理解进程这个东西,你会发现Linux c编程的书基本不怎么讲,反而是在linux内核的书里面找到了真正详细讲进程的。

我也觉得就算是弄Linux应用层编程也需要去学内核学驱动开发,我觉得这样才能把应用层弄得更好,这么来看我觉得华清的课程体系还是蛮合理的。就算你将来只想弄应用层开发,也有必要学学内核层面的开发,你以后弄驱动开发也有必要学学应用层的开发,这个华清的老师在视频里面也说过。

我也觉得这样你对linux无论是应用层还是内核层都有了把握,对linux整体有了把握,再去弄应用层编程或者驱动编程可能会更好一些。这样才能打下一个扎实的linux功底。

 

 

 

 

 

 

 

 

经过这样的理解之后,你就真正清楚C语言函数库的作用了,你再去回看为什么用数学库时编译要加个 -ml  用线程库时要加-lpthread

因为他们在C语言的标准函数库里面没有啊。你之前这种细节偏底层的原理没有弄清楚你就会比较乱。理解了一些底层和本质你就可以灵活使用。

 之前你总结的是说什么系统的库,我感觉这个说得很模糊,是否不是GUN库的就得指定链接呢?

看下面的,gcc好像确实是自动链接的标准库,对于非标准库,第三方库得手动指定链接。上面所说的系统的库应该就是指C的标准库。

 好像上面的没理解对,因为GUN的库里面包含了数学库,线程库那些,你看看上面的截图。

下面截图自《linux c与c++一线开发实践》

这里面说了glibc是linux的基石之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区分系统调用和库函数(API) 的相关文章

  • 举世无双语音合成系统 VITS 发展历程(2023.03.31 SNAC)

    ITS一键克隆 xff0c 中英日三语 xff0c Plachtaa VITS fast fine tuning VITS歌声转换 xff0c innnky so vits svc xff0c 已删库 xff0c svc develop t
  • C语言实现去畸变,不依赖opencv。

    opencv 仅起读图和显示 去畸变部分是纯c include lt opencv2 opencv hpp gt include lt iostream gt include lt cassert gt include lt cmath g
  • fork()使用详解

    fork xff08 xff09 使用详解 摘自 xff1a https blog csdn net u014082714 article details 45031771 一 fork入门知识 进程的定义 xff1a 进程是一个执行中的程
  • 关于堆栈为什么一起讲,因为这两个都是动态的。

    之前一直奇怪为什么堆和栈放在一起讲 目前看的资料理解为堆和栈都是动态分配的 还有子进程复制了父进程 https blog csdn net myqq1418 article details 81584761 再看下面这个图 xff0c 截图
  • 应用层编程书籍的选择,我推荐《linux c程序设计王者归来》

    我发现这本书讲得非常详细 xff0c 可能是我见过写得最详细的 xff0c 感觉不错 这本书比华清的书 xff0c 比苏嵌的那本 高质量嵌入式Linux C编程 也要详细
  • 进程和文件

    进程和文件还有一个类似的地方就是 xff0c 除了0号进程外 xff0c linux系统中任何一个进程都是由其他进程创建的 感觉就像根文件系统 这也让人感受到一种美感
  • Linux系统中的美

    一切皆文件 xff0c 这种极简普适的思想 进程和文件还有一个类似的地方就是 xff0c 除了0号进程外 xff0c linux系统中任何一个进程都是由其他进程创建的 感觉就像根文件系统 这也让人感受到一种美感 用pstree就可以查看进程
  • 一些实战项目(linux应用层编程,多线程编程,网络编程)

    我觉得这个说得比较好 xff0c 不在于项目有多大 xff0c 有多难 xff0c 在于项目是否是自己真正做的 xff0c 自己是否完全消化了 https blog 51cto com 14419148 2416408 https blog
  • 我觉得专注于去学东西就好了,与世无争。

    我觉得专注于去学东西就好了 xff0c 感觉这样与世无争 xff0c 而不是每天去跟别人比外在的 不要老是想着去如何超过别人 xff0c 而是回过头专心地学东西 xff0c 垒实基础 xff0c 这个可能才是根本的 xff0c 而不是老是被
  • 进程的组成

    我发现我还是喜欢基于物理实体的理解 xff0c 或许我更适合去做驱动 就是真正分析到严谨的内存层面上 像研究进程我就想知道它的实体组成是什么样的 xff0c 而不是单纯的一个空洞的名词 xff0c 我觉得这样会理解得更为透彻一些 让我想起考
  • 浅谈nginx多进程模型

    浅谈nginx多进程模型 摘自 xff1a https zhuanlan zhihu com p 60504120 nginx是一款高性能的Web服务器 xff0c 由于它优秀的性能 成熟的社区 完善的文档 xff0c 受到广大开发者的喜爱
  • 原来k8s docker是用go语言写的,和现在所讲的go是一个东西!

    原来k8s docker是用go语言写的 xff0c 这个我在文思的时候 xff0c 那时东哥问我的时候我那时就知道了 xff0c 只是现在才意识到和他们所讲包括亚军弄的go是一个东西 xff01 xff01 xff01 xff01 xff
  • 有码照片还原成无码:谷歌大脑能让模糊人脸变清晰

    转换成为肉眼可辨识的人物图像 在观看岛国教育片的时候 xff0c 往往在不可描述的部位打上了马赛克 xff0c 固然呈现了朦胧美 xff0c 但部分观众依然希望变得更加清晰 现在 xff0c Google Brain 在提升图片分辨率方面取
  • linux c/应用层编程的书没有深入讲一些东西,可以去看Linux内核的书

    我刚刚想明白了一个东西 xff0c 因为我发现Linux c的书和课程都没有深入讲进程 xff0c 也就是应用层编程 xff0c 他们都是讲一些函数的调用 xff0c 我原以为书会讲一下但我发现我买的Linux c的书里面基本没有深入讲 x
  • 进程的创建分为两步,先fork(),再exec()

    终端其实也是一个进程 shell实际上是先fork xff0c 再exec 前台执行的进程都是终端的子进程 其实看pstree也看得出来
  • 关于守护进程

    很多服务都是通过守护进程来提供的比方说各种网络服务 xff0c 比如http服务 xff0c nfs服务等等 xff0c 它都是以守护进程的形式在运行 xff0c 所以以后要写一个后台服务程序 xff0c 就需要通过守护进程的形式来运行 下
  • 多线程编程似乎是个比较重要的东西

    以上拍自 高质量嵌入式linux c编程 我看 高质量嵌入式linux c编程 和 linux c编程完全解密 这两本书都把多线程编程单独放为一章 xff0c 而不是像华清一样放在进程那章讲了 上面截图自linux c程序设计王者归来 熟练
  • 对进程和线程的理解

    我发现我之前对线程的理解是错误的 xff0c 对 xff0c 是错误的 xff0c 导致之前听课没有很好理解 xff0c 和CPU的流水线作业混淆了起来 xff0c 导致你没有很好地理解进程 xff0c 你是真的弄混了 我看了华清的线程 x
  • 我发现应用层编程里面那些函数很多喜欢用指针作形参

    我发现应用层编程里面那些函数很多喜欢用指针作形参 xff0c 你传递一个函数就会用函数指针 xff0c 你传递一个指针那就会用双重指针 最典型的线程的创建函数 我觉得可能就算你写的实际一个东西 xff0c 实际传的可能还是首地址 xff0c
  • 指向void类型的指针

    malloc好像就是这样 xff0c 所以在用malloc的时候都要进行一个类型转换 linux自带的一些函数里面似乎也是这样 xff0c 注意一下

随机推荐