UNIX系统调用和库函数(详细讲解)

news2024/9/22 15:43:05

什么是系统调用?

所有的操作系统都提供多种服务的入口点,由此程序向内核请求服务。各种版本的 UNIX 实现都提供良好定义、数量有限、直接进入内核的入口点,这些入口点被称为系统调用(system call,见图1-1)

Research UNX 系统第7版提供了约50个系统调用

4.4BSD 提供了约110个系统调用

SVR4 则提供了约 120个系统调用

具体数字在不同操作系统版本中会不同,新近的大多数系统大大增加了支持的系统调用的个数。Linux 3.2.0提供了380个系统调用FreeBSD8.0提供的系统调用超过450个。

系统调用接口总是在《UNX 程序员手册》的第2部分中说明,是用C语言定义的,与具体系统如何调用一个系统调用的实现技术无关。这与很多早期的操作系统不同,那些系统按传统方式用机器的汇编语言定义内核入口点。UNIX 所使用的技术是为每个系统调用在标准 C 库中设置一个具有同样名字的函数。用户进程用标准 C 调用序列来调用这些函数,然后,函数又用系统所要求的技术调用相应的内核服务。例如,函数可将一个或多个 C 参数送入通用寄存器,然后执行某个产生软中断进入内核的机器指令。从应用角度考虑,可将系统调用视为 C 函数。

 什么是库函数?

《UNIX 程序员手册》的第3 部分定义了程序员可以使用的通用库函数。虽然这些函数可能会调用一个或多个内核的系统调用,但是它们并不是内核的入口点。例如,printf 函数会调用write 系统调用以输出一个字符串,但函 strcpy(复制一个字符串)和 atoi(将ASCI转换为整数)并不使用任何内核的系统调用。

系统调用和库函数之间的区别?

从实现者的角度来看,系统调用和库函数之间有根本的区别,但从用户角度来看,其区别并不重要。

系统调用和库函数都以C函数的形式出现,两者都为应用程序提供服务。

但是,我们应当理解,如果希望的话,我们可以替换库函数,但是系统调用通常是不能被替换的。以存储空间分配函数 malloc为例。有多种方法可以进行存储空间分配及与其相关的无用空间回收操作(最佳适应、首次适应等),并不存在对所有程序都最优的一种技术。UNIX 系统调用中处理存储空间分配的是 sbrk(2),它不是一个通用的存储器管理器。它按指定字节数增加或减少进程地址空间。如何管理该地址空间却取决于进程。存储空间分配函数 malloc(3)实现一种特定类型的分配。如果我们不喜欢其操作方式,则可以定义自己的 malloc函数,它很可能将使用sbrk 系统调用。

事实上,有很多软件包,它们使用 brk 系统调用实现自己的存储空间分配算法。

图 1-11 显示了应用程序、malloc 函数以及 sbrk 系统调用之间的关系。

从中可见,两者职责不同,内核中的系统调用分配一块空间给进程,而库函数 malloc 则在用户层次管理这一空间。

另一个可说明系统调用和库函数之间差别的例子是,UNIX 系统提供的判断当前时间和日期的接口。一些操作系统分别提供了一个返回时间的系统调用和另一个返回日期的系统调用。

任何特殊的处理,例如正常时制和夏令时之间的转换,由内核处理或要求人为干预。

UNIX 系统则不同,它只提供一个系统调用,该系统调用返回自协调世界时 1970年1月1日零时这个特定时间以来所经过的秒数。

对该值的任何解释,例如将其变换成人们可读的、适用于本地时区的时间和日期,都留给用户进程进行处理。在标准 C库中,提供了干例程以处理大多数情况。这些库函数处理各种细节,如各种夏令时算法等应用程序既可以调用系统调用也可以调用库函数。很多库函数则会调用系统调用。图 1-12 显示了这种差别。

 系统调用和库函数之间的另一个差别是:系统调用通常提供一种最小接口,而库函数通常提供比较复杂的功能。我们从 sbrk 系统调用和 maloc 库函数之间的差别中可以看到这一点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/494301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

复古视觉大闸蟹创意海报设计

一、新建画布1500*2300像素,分辨率72 二、把文案要求拖入新建的画布中,更改文字颜色,然后打组命名为文案 三、拖入一个大闸蟹到画面当中,点击视图,新建一个居中的参考线,750居中 四、给画面添加一个背景&am…

关于WPA3-H2E的技术讲解

序言 H2E是Hash-To-Element的缩写。 问:虽然使用WPA3 SAE解决了offline dictionary破解密钥的问题,但是原先用于生成PMK的算法在计算时间上和密钥有关联性(这也行?),仍然存在所谓被side-channel方式破解。 解:新的算法,使用hash计算一次即可,堵死这个理论缺口[4]。…

盖雅工场发布数字化转型人效实践案例集

近日,盖雅工场重磅发布《聚集人效,重塑组织:典范企业管理实践案例集》(以下简称案例集)。 过去一年,盖雅工场携旗下盖雅学苑访谈了来自制造业、服务业、连锁零售业、汽车产业的几十家企业后,并…

【喜报】通付盾获评苏州市知识产权优势型企业!

近日,苏州市第二批知识产权强企培育工程成长型、优势型、引领型企业名单公示,江苏通付盾科技有限公司获评“苏州市知识产权强企培育工程-优势型企业”。 *名单发布来源:苏州市工业和信息化局 苏州市知识产权优势型企业 获评优势型企业的主要…

【观察】更懂业务的数智平台,才能应对数智化转型的“千变万化”

毫无疑问,随着数智化转型的加速,越来越多的企业正在把数智化战略提升到一个全新的高度,转型的进程也正从“浅层次”的数智化走向“深层次”数智化的阶段。 这也让企业的数智化转型进入到了一个全新的阶段,其面临的挑战也越来越大&…

intel I2C的速率配置

目录 寄存器篇 修改寄存器 intel I2C 驱动结构 lpss-pci文件 lpss文件 驱动结构 Synopsys DesignWare I2C BIOS配置修改 ACPI表的查看 I2C速率 寄存器篇 修改速率很简单,看到手册里面的寄存器说明,然后将其改掉即可。 寄存器偏移量为0&#x…

1、Flutter使用总结(RichText、Container)

1、创建Flutter项目 flutter create DemoName 2、运行项目 flutter run -d ‘iPhone 14 Pro Max’ 注: 当运用Android Studio时、选择安卓模拟器运行项目、如果项目路径有中文名称: 那么运行报错、如果直接在项目路径下,采用终端运行安卓模拟器、可执行如下命令 flutter ru…

博客系统后端设计(二) - 封装数据库操作

文章目录 封装数据库操作1. 创建一个 db.sql 文件2. 封装数据库的连接操作3. 创建实体类4. 封装数据库的增删改查操作4.1 创建 BlogDao 类中的方法4.2 创建 UserDao 类中的方法 封装数据库操作 这个步骤主要是把一些基本的数据库操作封装好,以后备用。 1. 创建一个…

微信小程序——wxs脚本

WXS目录 一、WXS的概述1、什么是wxs2、应用场景:3. wxs 与JavaScript(1)wxs 支持的数据类型:(2)wxs 不支持类似于 ES6 及以上的语法形式(3)wxs 遵循 CommonJS 规范 二 、WXS基础语法1、 内嵌 wxs 脚本2、外联的 wxs 脚本 三、WXS的特点1. 与 JavaScript 不同2. 不能…

【计算机图形学基础教程】MFC基本绘图函数2

MFC基本绘图函数 绘图工具类 CGdiObject类:GDI绘图工具的基类CBitmap类:封装了GDI画刷,可以选作设备上下文的当前画刷,用于填充图形的内部CFont类:封装了GDI字体,可以选作设备上下文的当前字体CPalette类…

一图看懂 aiohttp 模块:基于 asyncio 的异步HTTP网络库, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 aiohttp 模块:基于 asyncio 的异步HTTP网络库, 资料整理笔记(大全) 摘要模块图类关系图模块全展开【aiohttp】统计常量模块1 aiohttp.hd…

Redis超详细入门手册教程!还不快来看看?

地址: RedisRedis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures …https://redis.io/ 1:NoSQL简介 1.1:数据库应用的演变历程 单…

【Matlab】基于改进的 Hausdorf 距离的DBSCAN船舶航迹聚类

【Matlab】基于改进的 Hausdorff 距离的DBSCAN船舶航迹聚类 一、模型简介1.1问题背景1.2具体内容AIS数据的预处理船舶轨迹分割船舶轨迹相似度度量船舶轨迹表达方式船舶轨迹相似度量方法改进的 Hausdorff 距离船舶轨迹聚类及轨迹提取基于改进DBSCAN算法轨迹聚类船舶典型轨迹的提…

PHP+vue基于web的小区物业管理管理系统1995a

小区物业管理系统主要是对小区物业以及居民信息进行管理,方便用户使用该资源的一种有效手段。能有效地对物业以及用户信息进行管理并为广大用户服务是该管理系统的基本要求,同时用户也可以及时了解最新的物业信息,方便地查询相关物业情况。基…

Django配置WebSocket:django3配置websocket步骤

一、websocket概述 简单可以认为是在web上实现socket功能,在服务器上与浏览器保持socket长连接。 实现websocket是通过magic string 二、环境概述 解释器:python3.9 django3.2 channels3.0.4 #有些时候是channels版本有问题,导致配置不…

linux和window下svn版本控制可视化工具

之前一直用命令行来拉取代码建立分支,推送代码等等 也不是不行,但是用久了,感觉很麻烦,后面就用了svn的版本可视化工具 linux和window下svn版本控制可视化工具 Linux环境下使用图形化界面的SVN客户端软件,那么RabbitVC…

触控笔和电容笔哪个好用?ipad第三方电容笔了解下

和最早出现的那一些触控笔相比,现在电容笔最大的不同之处在于,这些电容笔具备了防误触、倾斜可以随意调整笔迹粗细的特性。苹果的Pencil,现在的价格,也是非常高的。所以,对于预算不足的人群来说,平替电容笔…

SDMTSP:斑马优化算法ZOA求解单仓库多旅行商问题(提供MATLAB代码,可更改起点及旅行商个数)

一、单仓库多旅行商问题 单仓库多旅行商问题(Single-Depot Multiple Travelling Salesman Problem, SD-MTSP):𝑚个推销员从同一座中心城市出发,访问其中一定数量的城市并且每座城市只能被某一个推销员访问一次&#x…

安装java配置

目录 安装JDK ​编辑 环境变量配置 3、检验环境变量配置 二、安装tomcat 验证Tomcat配置是否成功 三、安装Mysql 一、安装 二、卸载 安装JDK 点击更改将C直接给为F即可。 点击确定后进行安装,安装完以后会提示安装JRE; 检测是否已经安装JDK的方法 java命令通…

尚硅谷-宋红康-JVM上中下篇完整笔记-JVM上篇_内存与垃圾回收篇

前言 一.jvm及java体系结构 1. Java及JVM简介 TIOBE语言热度排行榜 https://www.tiobe.com/tiobe-index/ 世界上没有最好的编程语言,只有最适用于具体应用场景的编程语言。 java: 跨平台的语言JVM: 跨语言的平台 随着Java7的正式发布,Java虚拟机的设计者们通过JS…