Linux 系统调用和库函数的区别_linux库函数和系统函数的区别-程序员宅基地

技术标签: Linux 系统编程  

从实现着的角度来看,系统调用和库函数之间有根本的区别,但从用户的角度来看,其区别并不重要。系统调用和库函数都以C函数的形式出现,两者都是为应用程序提供服务。

什么是系统调用和库函数?

系统调用

系统调用(system call)是操作系统内核提供的函数,在内核态运行(kernel mode),是操作系统为用户提供的一些接口。它通过软中断向内核态发出一个明确的请求。有一些任务需要进程跑在内核态才能执行,比如和硬件打交道。所以进程调用系统调用就能让自己运行在内核态从而执行这些类似的任务。

例如,printf()需要调用write()系统调用来完成输出。

#include <stdio.h>

int main(int argc, char const *argv[])
{
    
	
	printf("hello,world\n");

	return 0;
}

实际上是调用的write()来实现的,而这个write()就是系统提供的接口函数。

在Linux man命令,用来查看系统中自带的各种参考手册。

1 Executable programs or shell commands
2 System calls (functions provided by the kernel)
3 Library calls (functions wiroutinesthin program libraries)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd
6 Games
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]

翻译:

1、可执行程序或者shell命令
2、系统调用(内核可以调用的函数,运行在核心态,内核空间,系统核心可直接呼叫的函数与工具等,通过这个,可以很方便的查到调用某个函数,需要加什么头文件,例如open,write函数)
3、库函数(运行在用户态,用户空间,一些常用的函数与函数库,大部分为c的函数库,例如print,fread)
4、特殊设备(一般是/dev下的各种设备,例如硬盘设备,光盘等)
5、文件格式(说明这个文件中的各个字段的含义,例如/etc/passwd)
6、游戏(保留给游戏使用,由各个游戏自己定义)
7、杂项,例如Linux文件系统,网络协议等,变量说明等
8、系统管路员命令(只有管理员才能使用的命令,例如ifconfig,reboot等)
9、跟kernel内核有关的文件

而通过 man 2 和查看系统调用。

man 2 write

在这里插入图片描述
man 用法请查看这一篇Linux 如何查看帮助信息

那么系统调用的意义是什么?

提高系统安全性

系统调用是内核代码,内核代码能访问系统上的所有地址空间,而我们执行的代码是用户空间的代码,用户空间的代码在对系统进行操作时是有限制的,(作为一个新手程序员,系统如果不对你写的代码进行限制,万一把系统搞蹦了呢)。因此系统调用的另一个功能就是维护了系统的安全性,你要用就直接调用我这个接口就行了,不用你自己写。

常见系统调用

open, close, read, write, ioctl,fork,clone,exit,
getpid,access,chdir,chmod,stat,brk,mmap等
需要包含unistd.h等头文件。

库函数

库函数是高层的,是在系统调用上的一层包装,运行在用户态(user mode),为程序员提供调用真正的在幕后完成实际事务的系统调用的更为方便的接口。 比如一些字符串处理函数(strcmp,strlen)等。

库函数类型

可分为两类:没有调用系统调用,以及调用了系统调用。

有一些库函数没有调用系统调用,比如strlen。有一些则会调用,比如库函数fopen内部调用了open系统调用。

常见库函数

printf,scanf,fopen,fclose,fgetc,fgets,fprintf,fsacnf,fputc,
calloc,free,malloc,realloc,strcat,strchr,strcmp,strcpy,strlen,strstr等
需要包含stdio.h,string.h,alloc.h,stdlib.h等头文件。

应用程序可以调用系统调用或库函数,同时我们还应注意到许多库函数也涉及了系统调用,它们之间的关系如下图:

在这里插入图片描述

上图显示了应用程序可以同时和库函数或者系统调用交互。同样的,一个库函数内部也可以再调用系统调用。但是,只有系统调用有权限访问硬件。

系统调用和库函数的区别

系统调用通常不可替换,而库函数通常可替换

普通的库函数调用由函数库或用户自己提供,因此库函数是可以替换的。例如,对于存储空间分配函数malloc,如果不习惯它的操作方式,我们完全可以定义自己的malloc函数。

不要误解认为malloc是系统系统,这是错的。因为malloc只是个库函数,内部是使用brk或者sbrk系统调用来实现内部分配。

系统调用运行在内核空间,而库函数运行在用户空间

因为系统调用属于内核,和库函数不属于内核。因此,如果当用户态进程调用一个系统调用时,CPU需要将其切换到内核态,并执行一个内核函数。

传统的方式是引发“int $0x8o”中断。内核捕获中断后,会把运行态从用户态切换到内核态。

一些其他的区别

1、库函数可以很方便的调试;而系统调用很麻烦因为运行在内核。

2、一个库函数执行时间是计算用户层次时间(user level time);但是系统调用的运行时间是作为系统时间来计算的;

总结

系统调用是为了方便应用程序使用操作系统的接口,而库函数是为了方便人们编写应用程序而引出的。

我们应当认识到,系统调用是我们无法更改的一种特征,如果我们愿意可以替换库函数,但是却不能替换系统调用。

在这里插入图片描述(微信公众号【程序猿编码】)

在这里插入图片描述

(欢迎添加本人微信号,备注加群,进入程序猿编码交流群,回复:领取学习资料,获取每日干货)

欢迎关注 微信公众号【程序猿编码】,专注于Linux c/c++ 、Python、Go语言、数据结构与算法、网络编程相关知识,常用的程序员工具。还有每日00:10分之前更新 新闻简报,即刻知晓天下事!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chen1415886044/article/details/104971510

智能推荐

单片机原理及应用:中断嵌套_中断嵌套怎么写-程序员宅基地

文章浏览阅读584次,点赞6次,收藏10次。​中断嵌套是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行的过程。在单片机中,中断嵌套的实现通常需要注意中断优先级的设置和中断使能的控制,以确保高优先级中断能够打断正在执行的低优先级中断。_中断嵌套怎么写

闭包详解以及使用场景_闭包的使用场景定时器回调-程序员宅基地

文章浏览阅读621次,点赞2次,收藏3次。a.防抖 (高频率触发的事件,在指定的单位时间内,只响应最后一次,如果在指定的时间内再次触发,则重新计算时间。②.window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次。当我们想要访问闭包内部的变量时,就可以使用return,将内部函数作为返回值。d.用于公共方法或者包的封装,比如数据响应式原理,axios二次封装等。闭包一定会内存泄漏?b.节流(高频率触发的事件,在指定的单位时间内,只响应第一次。①避免变量被污染,②变量私有化,③保存变量,常驻内存。_闭包的使用场景定时器回调

配置iTerm2打开自动执行命令_iterms2-程序员宅基地

文章浏览阅读6.6k次。Send text at start:执行脚本的命令,不想写路径可以把脚本到/usr/local/bin里面(赋予执行权限也要相应修改),此处的脚本地址是在终端到脚本目录下用pwd命令获取的。打开iTerm2,commad+o,打开profies->edit profies,点击+号,创建一个新的profile。回到profiles页面,双击新建的profile即可自动连接到服务器。在新的profile中填写。_iterms2

Vue-ECharts基本使用及Demo_ailed to resolve import "vue-echarts" from-程序员宅基地

文章浏览阅读2.5k次。Vue-ECharts基于EChartsv4.1.0+ 开发,依赖Vue.jsv2.2.6+。安装$ npm install echarts vue-echarts使用方法import Vue from 'vue'import ECharts from 'vue-echarts' // 在 webpack 环境下指向 components/ECharts.vue/..._ailed to resolve import "vue-echarts" from

【矩阵分解】PCA - 主成分分析中的数学原理-程序员宅基地

文章浏览阅读520次。PCA主成分分析属于矩阵分解算法中的入门算法,通过分解特征矩阵来实现降维。前置知识:包括样本方差、协方差、协方差矩阵、散度矩阵的简单介绍特征值分解EVD和奇异值分解EVD的原理和流程分别基于EVD和SVD的PCA实现方法PCA的应用以及对一些应用或说明的补充。

diskMirror-backEnd-spring-boot | diskMirror 后端服务器 SpringBoot 版本!-程序员宅基地

文章浏览阅读1k次,点赞14次,收藏6次。当然,您也可以直接在启动参数中设置配置文件的使用,下面展示的就是使用 Java 命令启动 SpringBoot 包的语法,其中包含两个路径,第一个是配置文件的路径,第二个是 SpringBoot 包的路径,这样就可以实现让。此项目是继承于 diskMirrorBackEnd 项目的,因此所有的服务使用方法与 DiskMirrorBackEnd 中是一样的,您可以。您只需要将此项目源码克隆,然后修改配置文件即可,下面是配置文件的模板。至于需要使用的包和配置文件模板,您可以亲自编译,也可以在。

随便推点

hub设备_「网络安全」网络设备篇(9)——集线器Hub-程序员宅基地

文章浏览阅读2.7k次。什么是集线器?集线器(HUB)是计算机网络中连接多个计算机或其他设备的连接设备,是对网络进行集中管理的最小单元。英文Hub就是中心的意思,像树的主干一样,它是各分支的汇集点。HUB是一个共享设备,主要提供信号放大和中转的功能,它把一个端口接收的所有信号向所有端口分发出去。一些集线器在分发之前将弱信号加强后重新发出,一些集线器则排列信号的时序以提供所有端口间的同步数据通信。集线器工作原理集线器工作于...

java随机百分比_java随机百分比-程序员宅基地

文章浏览阅读1k次。几个答案建议选择随机百分比,并取得差异。正如Nikita Ryback所指出的那样,这不会给所有可能性的统一分配;特别是零将比预期的频率低。为了解决这个问题,想想从100%的百分比开始,并插入分隔线。我会用10:% % % % % % % % % %有十一个地方我们可以插入一个分隔线:任何两个百分点之间,或在开始或结束。所以插入一个:% % % % / % % % % % %这代表选择四和六。现在..._java随机百分之概率

python 制作下雪的情景_下雪的情景主题作文-程序员宅基地

文章浏览阅读179次。凛风中飘飞的雪花伴着瑟缩的枯叶轻扬慢舞,于是有一片脆雪落下了,空荡的街畔便油然多了一份寒冬中蛰伏的缱绻思绪。下面就随小编一起去阅读下雪的情景主题作文,相信能带给大家帮助。第一篇:我从生下来到现在从来没有见到过一场雪。哎,上海这么暖和,怎么会下雪呢?可是这个寒假,我终于第一次看到了雪——不知是星期几,几时几分几秒,窗外便下起纷纷扬扬的雪。不多时,花坛边、小树上、汽车上……都盖上了一层厚厚的雪,这可扰..._python设计情景

maven - 配置指定1.8jdk-程序员宅基地

文章浏览阅读881次。maven - 配置指定1.8jdk

用C语言实现“7-4 BCD解密”,明白十进制、二进制、十六进制的转换过程,基础编程由此开始(第四节)-程序员宅基地

文章浏览阅读920次。今天这道题目呢,与之后要讲到的“龟兔赛跑”都是从PAT的基础编程题目中节选过来的。难度不是很大,但是特别基础,复习到了基础知识,也就是二进制、十进制两者之间的相互转换。我们先来看看这道题目的要求:BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以,如果一个BCD数的十六进制为0x12,那么它的十进制也是12。此时有一位小伙伴并不知道BCD数的运算规则,直接把0x12当作二进制来转换成十进制,那就会得到18。现在呢,我们就期望能把这个错误得到的十进制,转换成我们期望得到

Ubuntu自定义服务(service)并设置开机自启_udcservice要开机启动吗-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏25次。Serviceubuntu配置文件systemd 命令详解ubuntu配置文件每一个服务都对应一个配置文件systemd 是 Linux 下的一种 init 软件,其作用是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动systemd 默认从目录 /etc/systemd/system/ 读取配置文件,但是,里面存放的大部分文件都是符号链接,指向目录 /usr/lib/systemd/system/(即 /lib/systemd/system),真正的配置文件存放在_udcservice要开机启动吗

推荐文章

热门文章

相关标签