系统调用,API,运行库函数和C标准库函数的区别

2023-05-16

1.为什么用户程序不能直接访问系统内核模式提供的服务?

     在linux中,将程序的运行空间分为内核与用户空间(内核态和用户态),在逻辑上它们之间是相互隔离的,因此用户程序不能访问内核数据,也无法使用内核函数。

2.系统调用:

系统功能调用是操作系统提供给程序设计人员的一种服务,系统调用非常精简,通常有两百多个,现在可能有三百个。

程序设计人员在编写程序时,可以利用系统调用来请求操作系统的服务。

系统调用实际上是内核中的一些函数,他们有各自对应的响应函数

响应函数sys_xxx


响应函数名以“sys_”开头,后跟该系统调用的名字。

例如

系统调用fork()的响应函数是sys_fork()(见Kernel/fork.c),

exit()的响应函数是sys_exit()(见kernel/fork.)。

实际上,Linux中每个系统调用都有相应的系统调用号作为唯一的标识,内核维护一张系统调用表,sys_call_table,表中的元素是系统调用函数的起始地址,而系统调用号就是系统调用在调用表的偏移量。

系统调用就是一种特殊的接口。通过这个接口,用户可以访问内核空间。系统调用规定了用户进程进入内核的具体位置。

       具体步骤:用户进程-->系统调用-->内核-->返回用户空间。

详细参考:https://blog.csdn.net/gatieme/article/details/50779184

 

3.API

api 就是应用程序接口,是一些预定义的函数。跟内核没有必然的联系。API(Application Programming Interface)应用程序接口,是一些预先定义的函数,提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

  一个单独的API可能调用几个系统调用;
  不同的API可能调用了同一个系统调用。

 

4.库函数

 顾名思义是把函数放到库里,是把一些常用到的函数编完放到一个文件里,供别人用。别人用的时候把所在的文件名用#include<>加到里面就可以了,一般放到lib文件里。

库函数一般分为两类:

一种是C语言标准规定的库函数

一类是编译器特定的库函数

libc就是一个C标准库,里面放着一些基本的函数,这些函数都被标准化了。

 事实上,系统调用所提供给用户的是直接而纯碎的高级服务,如果想要更加人性化,具有更符合特定情况的功能,那么就要我们用户自己定义,因此衍生了库函数,它把部分系统调用包装起来。

 

4.系统调用和库函数之间的联系与区别?

系统调用是应用程序与内核交互的接口。人们在长期的编程中发现使用系统函数有个重大的缺点,那就是程序的移植性。例如linux提供的系统调用的函数和windows就不一样。但是大部分的系统调用函数的速度库函数调用的速度要快。

      库函数调用则是面向应用开发的,相当于应用程序的api,采用这样的方式有很多原因:
     (1):双缓冲技术;
     (2):移植性;
     (3):底层调用本身存在的一些缺陷;
     (4):让api也可以有了级别和专门的工作面向;

5.API和系统调用的区别?

API分为两种:

第一:用户级API

替用户写好函数,方便调用,使程序员可以将焦点放在设计程序逻辑上面,而不必再编写繁琐、重复的程序,不必关注技术的细节。例如VC++,MFC,VB等都是类库和各种控件,它代替了API的神秘功能,它不涉及硬件相关的操作。

第二:系统级API

如果应用程序想要和硬件交互,必须调用此类函数。程序员调用的是API(api函数),然后通过与系统调用共同完成函数的功能。因此,API是一个提供给应用程序的接口,一组函数,是与程序猿直接进行交互的。系统调用则不与程序员进行交互,它是根据API函数,通过一个软件中断机制向内核提交请求(trap指令类似于一个系统中断,系统也会有一个特殊的中断处理函数(interrupt handler)来处理用户的请求),以获得内核服务的接口。

并不是所有的API函数都一一对应一个系统的调用,有时,一个API函数会需要几个系统调用共同来完成函数的功能,甚至一些API函数不需要调用相应的系统调用,不需要内核提供的服务。

6.API和C标准库函数有什么区别?

由于内核中也有库函数,所以这里指的是用户空间的库函数

C标准库函数
C 库函数 是指 C 语言本身支持的一些基本函数,通常是汇编直接实现 的。 

API函数
API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的。

区别
他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的。C语言库函数是API的上层!

C库函数更加人性化

 

7.C运行库和C标准库的区别?

C标准库,顾名思义既然是标准,就是由标准组织制定的。是由“美国国家标准协会(American National Standards Institute,ANSI)”为了规范C语言库而制定的标准。在最初,各个大学各个公司使用的C语言库都不尽相同,造成相互移植非常困难,在这个背景下,制定了这个标准。

C运行库,是和平台相关的,即和操作系统相关的。它由不同操作系统不同开发平台提供不同的C运行库。

C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的。

但是C运行库的部分实现是基于C标准库的,即C运行库是各个操作系统各个开发工具根据自身平台开发的库,某种程度上,可以说C运行库是C标准库的一个扩展库,只是加了很多C标准库所没有的与平台相关的或者不相关的库接口函数。

举例子如:c标准库的strcpy函数负责字符串的拷贝,但是由于缺少对目地字符串缓冲区大小的控制,极有可能导致缓冲区溢出(大量的缓冲区溢出攻击都是由于这种漏洞而产生的);相反,Windows提供了能够实现同样功能的安全的字符串拷贝函数,减少了缓冲区攻击的可能,strcpy_s。这些函数是以c运行库的方式提供的,当然,不同的操作系统,c运行时库可能不同,但是对c标准库的支持是完全一致的,也就是说,在不同的操作系统上,使用同一个c标准库的函数必然产生一致的结果。

 

 

 

 

 

 

 

 

 

 

 

 

 

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

系统调用,API,运行库函数和C标准库函数的区别 的相关文章

随机推荐

  • VS2013与数据库mysql8.0的连接

    1 准备 xff1a vs2013 mysql 8 0 1 1首先我们到官网上下载mysql 下载完成后解压 xff0c 安装 vs2013下载解压安装 2 我们打开安装后的mysql文件夹 我们一会要重点用到 include 和lib 所
  • 用VS2013中MFC开发视频播放器

    1 搭建开发环境 1 1 vs2013网上有许多软件可以自行下载或者 vs2013的安装包 有需要的留言我给发 1 2 搭建DirectShow开发环境 我参考的书上说要自己下一个DriectShow xff0c 但是我下载了好多次 xff
  • 用VS2013中MFC开发视频播放器(2)

    上一个博客我写了做视频播放器的环境搭建 xff0c 没写完这个项目 xff0c 所以今天在把它详细的写一遍流程 xff0c 介绍一下这个项目的编写 1 需求分析 xff1b 要求开发播放器系统能够播放媒体文件 xff0c 而且还可以进行播放
  • 基于正点原子探索者使用STM32CubeMX+FreeRTOS+LWIP

    开发板是使用正点原子的探索者为例 xff0c PHY芯片可以是LAN8720A和IP101GR xff0c 因为有两份代码参考 xff0c 一份是LAN8720A xff0c 一份是IP101GR 首先第一步 xff1a 我们使用移植好的功
  • C++笔试中遇到的问题

    1 sizeof与strlen的区别 xff1f 答 xff1a sizeof是操作符 xff0c 分配的数组实际所占的内存空间大小 xff0c 不受里面存储内容的影响 strlen是函数 xff0c strlen计算字符串的长度 xff0
  • CRC计算的简单原理及代码实现(python)

    目录 多项式的获取 CRC计算的示例图 示例代码 多项式的获取 举例如下 xff08 其余的多项式依次类推即可 xff09 xff1a 故最终多项式获取的参与异或计算的数据为 xff1a 1011 CRC计算的示例图 假设原始数据为 xff
  • 深度学习训练数据中的特征重要性排名

    查看神经网络模型特征重要性的思路 xff1a 依次变动各个特征 xff0c 通过模型最终预测的结果来衡量特征的重要性 神经网络特征重要性的获取步骤如下 xff1a 训练一个神经网络模型 xff1b 每次对一个特征列进行随机shuffle x
  • (笔记)Python import 其他路径下的文件

    一般情况下 xff0c 如果要import的文件和被import的文件位于同一路径下 xff0c 可以使用 xff1a import 文件名 的方式直接进行引用 但如果这两个文件不在同一路径下 xff0c 就需要在被import的文件路径下
  • (Note)Python osgeo&shapefile库的安装

    1 shapefile anaconda xff1a conda install pyshp pip xff1a pip install pyshpe 2 osgeo 进入Link xff1a https www lfd uci edu g
  • (Note)Python 统计列表中各元素出现的次数

    演示列表 xff1a Demo list 61 1 2 3 3 3 5 6 2 2 0 4 5 2 7 8 4 5 1 3 9 8 7 1 统计列表中不同元素的个数 Demo list 61 1 2 3 3 3 5 6 2 2 0 4 5
  • (Note)海韵&海韵代工的电源-风扇智能启停按钮

    海韵是电源四大厂之一 xff0c 旗下有众多型号的电源 其中 xff0c 部分电源的后部会有一个方形的按钮 xff08 在电源开关左侧 xff09 如图所示 xff1a 这是海韵FOCUS 43 电源特有的 34 HYBRIDMOOE 34
  • (Note)七彩虹30系列显卡——《一键超频》按键

    七彩虹部分30系高端显卡提供了一键超频功能 xff0c 通过按下超频按钮可以实现显卡一键超频 七彩虹显卡的一键超频按钮使用方法 xff1a 按下超频 xff0c 弹起默认 切换需要重启电脑 xff01
  • (Note)优化器Adam的学习率设置

    记录一下知乎看到的问题 xff1a Adam的学习率设置 常用的神经网络优化器Adam的自适应学习率并不是真正意义上的自适应 从统计的角度看 xff0c Adam的自适应原理也是根据统计对梯度进行修正 xff0c 但依然离不开前面设置的学习
  • (Note)深度学习与人工提取的特征

    首先 xff0c 深度学习一般 不需要人工提取特征 如果仅仅给网络提供人工提取的特征 xff0c 反而有可能会造成网络性能的下降 xff08 深度学习模型可能提取到一些人类不易察觉的特征 xff0c 这些特征可能对结果的判定有着较大的贡献
  • Linux驱动开发与裸机开发区别

    Linux驱动开发与裸机开发区别 裸机驱动开发回顾Linux驱动开发思维Linux驱动开发分类 裸机驱动开发回顾 1 底层 跟寄存器打交通 xff0c 有些MCU提供了库 Linux驱动开发思维 1 Linux下驱动开发直接操作寄存器不现实
  • Linux下使用U盘

    第一步 xff1a 插入U盘 xff0c 如果能够识别出U盘 xff0c 则会打印出一些信息 xff1b 第二步 xff1a 查看U盘系统分配给U盘的设备名 xff1b 输入如下命令进行查看 xff1a fdisk l dev sda 如果
  • (Deep Learning)交叉验证(Cross Validation)

    交叉验证 xff08 Cross Validation xff09 交叉验证 xff08 Cross Validation xff09 是一种评估模型泛化性能的统计学方法 xff0c 它比单次划分训练集和测试集的方法更加稳定 全面 交叉验证
  • (Linux)在Ubuntu系统中添加新用户并授予root权限

    向Ubuntu系统中添加新用户并为其授予root权限的步骤如下 打开终端Terminal 输入命令 sudo su 以 root 身份登录 注 sudo su 切换root身份 不携带当前用户环境变量 sudo su 切换root身份 携带
  • (深度学习)类别不平衡数据集中IOU和mIOU的选择

    测试集上的mIOU很高 xff0c 但是实际的分割结果很差 xff0c 几乎没有分割出前景 xff0c 主要是因为要分割的目标占总面积之比太少 xff0c 即出现样本不均衡的问题 此时 xff0c 前景所占的比例太小 xff0c 背景所占的
  • 系统调用,API,运行库函数和C标准库函数的区别

    1 为什么用户程序不能直接访问系统内核模式提供的服务 xff1f 在linux中 xff0c 将程序的运行空间分为内核与用户空间 xff08 内核态和用户态 xff09 xff0c 在逻辑上它们之间是相互隔离的 xff0c 因此用户程序不能