P3 Linux应用编程:系统调用与库函数

news2025/1/23 23:17:10

前言

                               

🎬 个人主页:@ChenPi

🐻推荐专栏1: 《C++_@ChenPi的博客-CSDN博客》✨✨✨ 

🔥 推荐专栏2: 《Linux C应用编程(概念类)_@ChenPi的博客-CSDN博客》✨✨✨

🛸推荐专栏3: ​​​​​​《 链表_@ChenPi的博客-CSDN博客 》 ✨✨✨
🌺本篇简介  :  在上一章中我学习了Linux系统目录结构,这章我们来认识一下什么是系统调用和库函数

在第一章的时候我们说过我们应用开发是在应用层的,但是应用层是不能直接控制内核的,所以我们要经过系统调用或者库函数来操作内核,如果对这些概念不是很了解,可以看看我前面两章

说了这么多,那什么是系统调用呢? 

一 何为系统调用


系统调用(system call)其实是 Linux 内核提供给应用层的应用编程接口(API),

是 Linux 应用层进入内核的入口。

不止 Linux 系统,所有的操作系统都会向应用层提供系统调用,

应用程序通过系统调用来使用 操作系统提供的各种服务。

通过系统调用,Linux 应用程序可以请求内核以自己的名义执行某些事情,

  1. 譬如打开磁盘中的文件、
  2. 读 写文件、关闭文件
  3. 以及控制其它硬件外设。

系统调用是内核直接向应用层提供的应用编程接口,譬如 open、write、read、close 等

通过系统调用 API,应用层可以实现与内核的交互,其关系可通过下图简单描述: 

二 何为库函数


1.概念

库函数也就是 C 语言库函数,C 语言库是应用层使用的一套函数库,在 Linux 下,通常以动态(.so) 库文件的形式提供,存放在根文件系统/lib 目录下

2.库函数部分函数是由系统调用封装

C 语言库函数构建于系统调用之上,

也就是说库函数其 实是由系统调用封装而来的,

当然也不能完全这么说,原因在于有些库函数并不调用任何系统调用,譬如一 些字符串处理函数 strlen()、strcat()、memcpy()、memset()、strchr()等等;

而有些库函数则会使用系统调用来

帮它完成实际的操作,譬如

  1. 库函数 fopen 内部调用了系统调用 open()来帮它打开文件、
  2. 库函数 fread()就利用 了系统调用 read()来完成读文件操作、
  3. fwrite()就利用了系统调用 write()来完成写文件操作。

3.为啥要使用库函数


Linux 系统内核提供了一系列的系统调用供应用层使用,

我们直接使用系统调用就可以了呀,那为何还 要设计出库函数呢?

事实上,有些系统调用使用起来并不是很方便,于是就出现了 C 语言库,

这些 C 语言 库函数的设计是为了提供给底层系统调用

  • 更为方便
  • 且更具有可移植性的调用接口。
  • 更为好用

 库函数和系统调用的区别

  1. 库函数是属于应用层,而系统调用是内核提供给应用层的编程接口,属于系统内核的一部分;
  2. 库函数运行在用户空间,调用系统调用会由用户空间(用户态)陷入到内核空间(内核态);
  3. 库函数通常是有缓存的,而系统调用是无缓存的,所以在性能、效率上,库函数通常要优于系统调 用;
  4. 可移植性:库函数相比于系统调用具有更好的可移植性

通常对于不同的操作系统,其内核向应用 层提供的系统调用往往都是不同,

  • 譬如系统调用的定义、功能、参数列表、返回值等往往都是不一 样的;
  • 而对于 C 语言库函数来说,由于很多操作系统都实现了 C 语言库,
  • C 语言库在不同的操作系统上可以用同一套API

所以库函数在不同操作系统之间相比于系统调用具有更好的 可移植性。 

所以应用编程简单点来说就是:

开发 Linux 应用程序,通过调用内核提供的系统调用或使用 C 库函数 来开发具有相应功能的应用程序。

三 应用程序的 main()函数


对学习过 C 语言编程的读者来说,譬如单片机编程、Windows 应用编程等,main 函数想必大家再熟悉 不过了,很多编程开发都是以 main 函数作为程序的入口函数,同样在 Linux 应用程序中,main 函数也是作 为应用程序的入口函数存在,main 函数的形参一般会有两种写法,如果执行应用程序无需传参,则可以写 成如下形式:

示例代码 1.4.1 main 函数写法之无传参
 

int main(void)
 
{ /* 代码 */
 
}

如果在执行应用程序的时候需要向应用程序传递参数,则写法如下:

示例代码 1.4.2 main 函数写法之有传参
 

int main(int argc, char **argv)
 
{ /* 代码 */
 
}

argc 形参表示传入参数的个数,包括应用程序自身路径和程序名,譬如运行当前目录下的 hello 可执行 文件,并且传入参数,如下所示: ./hello 112233

那么此时参数个数为 2,并且这些参数都是作为字符串的形式传递给 main 函数: argv[0]等于"./hello" argv[1]等于"112233
 

好了,这章我们就讲到这里,下一章我们来聊聊系统调用最常见的文件操作

open,read,write,close

🌺对您有帮助的话记得点赞加关注


🌺如果有说的不对的欢迎指正

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

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

相关文章

轻量封装WebGPU渲染系统示例<42>- vsm阴影实现过程(源码)

前向实时渲染vsm阴影实现的主要步骤: 1. 编码深度数据,存到一个rtt中。 2. 纵向和横向执行遮挡信息blur filter sampling, 存到对应的rtt中。 3. 将上一步的结果(rtt)应用到可接收阴影的材质中。 具体代码情况文章最后附上的实现源码。 当前示例源码github地址: …

Azure Machine Learning - 使用 Python 进行语义排名

在 Azure AI 搜索中,语义排名是查询端功能,它使用 Microsoft AI 对搜索结果重新评分,将具有更多语义相关性的结果移动到列表顶部。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&am…

基于单片机的多功能视力保护器(论文+源码)

1.系统设计 多功能视力保护器在设计过程中能够对用户阅读过程中的各项数据信息进行控制,整体设计分为亮种模式,分别是自动模式,手动模式。在自动模式的控制下,当单片机检测当前光照不强且有人时就开启LED灯,并且会根据…

实现跨平台高手必修的课程,玩转Flutter动态化的解决的一些精华部分总结

Flutter作为一种快速、可靠的跨平台移动应用开发框架,在动态化方面也有很多令人兴奋的特性。本文将总结Flutter动态化的一些精华部分,帮助开发者更好地利用这些功能。 正文: 在实现跨平台高手必修的课程中,Flutter动态化是一个不…

kubernetes七层负载Ingress搭建(K8S1.23.5)

首先附上K8S版本及Ingress版本对照 Ingress介绍 NotePort:该方式的缺点是会占用很多集群机器的端口,当集群服务变多时,这个缺点就愈发的明显(srevice变多,需要的端口就需要多) LoadBalancer:该方式的缺点是每个servi…

人工智能学习5(特征抽取)

编译环境:PyCharm 文章目录 编译环境:PyCharm 特征抽取无监督特征抽取(之PCA)代码实现鸢尾花数据集无监督特征抽取 有监督特征抽取(之LDA)代码实现,生成自己的数据集并进行有监督特征抽取(LDA)生成自己的数据集PCA降维和LDA降维对比 代码实现LDA降维对鸢…

mysql服务日志打印,时区不对的问题

查资料发现 原来日志的时区和服务器的时区不是一个参数控制的 log_timestamps 单独控制日志的时区 show global variables like log_timestamps;看到默认的是UTC,只需要修改为和系统一致就行 #数据库中直接修改 set global log_timestampsSYSTEM;#配置文件my.cn…

NacosSync 用户手册

手册目标 理解 NacosSync 组件启动 NacosSync 服务通过一个简单的例子,演示如何将注册到 Zookeeper 的 Dubbo 客户端迁移到 Nacos。 介绍 NacosSync是一个支持多种注册中心的同步组件,基于Spring boot开发框架,数据层采用Spring Data JPA,遵循了标准的JPA访问规范…

面试题:MySQL为什么选择B+树作为索引结构

文章目录 前言二、平衡二叉树(AVL):旋转耗时三、红黑树:树太高四、B树:为磁盘而生五、B树六、感受B树的威力七、总结 前言 在MySQL中,无论是Innodb还是MyIsam,都使用了B树作索引结构(这里不考虑hash等其他索引)。本文…

视频生成的发展史及其原理解析:从Gen2、Emu Video到PixelDance、SVD、Pika 1.0

前言 考虑到文生视频开始爆发,比如11月份就是文生视频最火爆的一个月 11月3日,Runway的Gen-2发布里程碑式更新,支持4K超逼真的清晰度作品(runway是Stable Diffusion最早版本的开发商,Stability AI则开发的SD后续版本)11月16日&a…

wordpress安装之Linux解压缩安装

本次教程是为了让大家少走弯路,可以更直观的去认识我们不懂的知识面。 首先我们安装解压缩的软件 命令如下: yum install -y unzip 上一篇我们讲到传输文件了 这篇我们把传输过来的压缩包解压并进行安装。follow me! 我们输入命令 unzi…

Spring Cloud NetFlix

文章目录 Spring Cloud1 介绍2 Eureka(服务注册与发现)2.1 介绍2.2 服务注册与发现示例2.2.1 Eureka Server:springcloud-eureka2.2.2 Eureka Client:springcloud-provider2.2.3 Eureka Client:springcloud-consumer 2…

前端可滚动分类商品List列表 可用于电商分类列表

前端可滚动分类商品List列表 可用于电商分类列表 引言 在电商应用中,一个高效、用户友好的分类列表是提高用户体验和转化率的关键。本文将探讨如何使用xg-list-item、uni-grid和xg-tab等组件创建一个可滚动的分类商品列表,并处理相关的用户交互事件&…

Python容器——字典

Key——Value 键值对

canvas 轮廓路径提取效果

前言 微信公众号:前端不只是切图 轮廓 对内容做border效果,可以先看下代码运行的效果 内容是黑线构成的五角星,其轮廓就是红线的部分,本文主要介绍如何在canvas中实现这种效果 Marching Square 这里运用到的是marching square算法…

探索 Web API:SpeechSynthesis 与文本语言转换技术

一、引言 随着科技的不断发展,人机交互的方式也在不断演变。语音识别和合成技术在人工智能领域中具有重要地位,它们为残障人士和日常生活中的各种场景提供了便利。Web API 是 Web 应用程序接口的一种,允许开发者构建与浏览器和操作系统集成的…

Kubernetes(K8s)_16_CSI

Kubernetes(K8s)_16_CSI CSICSI实现CSI接口CSI插件 CSI CSI(Container Storage Interface): 实现容器存储的规范 本质: Dynamic Provisioning、Attach/Detach、Mount/Unmount等功能的抽象CSI功能通过3个gRPC暴露服务: IdentityServer、ControllerServe…

微信小程序组件与插件有啥区别?怎么用?

目录 一、微信小程序介绍 二、微信小程序组件 三、微信小程序插件 四、微信小程序组件与插件有啥区别 一、微信小程序介绍 微信小程序是一种基于微信平台的应用程序,它可以在微信客户端内直接运行,无需下载和安装。微信小程序具有轻量、便捷、跨平台…

RT-Thread ADC_DMA

看到这里,相信大家已经尝试过网上各类ADC_DMA传输的文章,且大多都并不能实现,因为在RT-Thread中并没有找到关于ADC的DMA接口,在官方例程中有关DMA的传输也只有一个串口接收的介绍,找遍全网怕也没能找到真正有用的消息。…

PyLMKit(5):基于网页知识库的检索增强生成RAG

基于网页知识库的检索增强生成RAG 0.项目信息 日期: 2023-12-2作者:小知课题: RAG(Retrieval-Augmented Generation,检索增强生成)是一种利用知识库检索的方法,提供与用户查询相关的内容,从而…