【正点原子】Linux应用编程入门~概念及环境介绍

在这里插入图片描述

应用编程概念

应用编程(也可称为系统编程)与驱动编程、裸机编程有何不同?

  • 系统调用;

  • 何为库函数;

  • 应用程序的 main()函数;

  • 应用程序开发环境的介绍;

系统调用
定义
  • 系统调用(system call)是 Linux 内核给应用层的应用编程接口(API),是 Linux 应用层到内核的入口;

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

功能

通过系统调用,通过系统调用 API,应用层可以实现与内核的交互;

Linux 应用程序可以请求内核以自己的名义执行某些事情,譬如打开磁盘中的文件、读写文件、关闭文件以及控制其它硬件外设;

在这里插入图片描述

  • 操作系统下有两种不同的状态:内核态和用户态

  • 应用程序运行在用户态、而内核则运行在内核态。

应用编程与裸机编程、驱动编程区别

裸机编程:无操作系统支持的编程环境称为裸机编程环境,例:单片机编程开发,直接在硬件运行程序,无操作系统支持;

Linux 驱动编程:是基于内核驱动框架开发驱动程序,驱动开发工程师通过调用 Linux 内核提供的接口完成设备驱动的注册,驱动程序负责底层硬件操作相关逻辑;

Linux 应用编程(系统编程):基于 Linux 操作系统的应用编程,在应用程序中通过调用系统调用 API 完成应用程序的功能和逻辑,应用程序运行于操作系统之上;

总结
  • LED 应用程序与 LED 驱动程序是分隔、分离的,它们单独编译,它们并不是整合在一起的;

  • 应用程序运行在操作系统之上,有操作系统支持,应用程序处于用户态,而驱动程序处于内核态,与纯粹的裸机程序存在着质的区别;

  • Linux 应用开发与驱动开发是两个不同的方向;

库函数

分辨调用的函数是系统调用还是库函数即可

发展历程
  • 系统调用使用起来并不是很方便,提供比底层系统调用更为方便、更为好用、且更具有可移植性的调用接口;

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

  • C 语言库函数构建于系统调用之上,库函数绝大部分由系统调用封装而来;

库函数和系统调用区别
  • 编写应用程序除使用系统调用API接口,如 open、write、read、close之外,还使用库函数(C语言库函数);

  • 有些库函数不调用任何系统调用,譬如一些字符串处理函数 strlen()、strcat()、memcpy()、memset();

  • 有些库函数则会使用系统调用来完成实际操作,譬如库函数 fopen 内部调用了系统调用 open()来帮它打开文件、库函数 fread()利用系统调用 read()来完成读文件操作、fwrite()就利用了系统调用 write()来完成写文件操作;

在这里插入图片描述

实现者的角度来看,系统调用与库函数之间有根本的区别;

在实际应用编程中,直接把它们当做是 C 函数即可,知道调用的函数是系统调用还是库函数即可

标准 C 语言函数库

Linux系统使用的C语言库为GNU C 语言函数库,作为标准 C 语言函数库;

( 也 叫 作 glibc , 其 网 址 为http://www.gnu.org/software/libc/)

glibc 版本

在这里插入图片描述

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"
有传参时 main 函数的写法并不只有这一种
开发环境推荐

我们的重点是学习应用编程!而不是学习 IDE 怎么用

Eclipse

vscode+ARM gcc(交叉编译工具)

个人:nodepid++、gcc

刚刚下了vscode,很烦这个弄几次了前期配置,之前也是;

c文件运行到底具体咋整好麻烦,幸好只是当编辑工具,后期再学一学吧;

我记得我成功过,好像改两个地方就行(前提是插件装好);

在这里插入图片描述

入门篇

Makefile

提高篇
进阶篇

cmake+vscode

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

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

相关文章

一、HTML 完全指南:从零开始构建网页

文章目录前言一、 HTML 结构认识 HTML 标签HTML 文件基本结构标签层次结构快速生成代码框架二、 HTML 常见标签详解2.1 注释标签2.2 标题标签 (h1 - h6)2.3 段落标签 (p)2.4 换行标签 (br)2.5 格式化标签2.6 图片标签 (img)2.7 超链接标签 (a)2.8 表格标签基本使用合并单元格2.…

基于POI-TL实现动态Word模板的数据填充:【散点图】特殊处理方案

基于POI-TL实现动态Word模板的数据填充:散点图特殊处理方案 在使用POI-TL进行Word模板动态数据填充时,图表生成是一个常见需求。最近在项目中使用POI-TL处理散点图时遇到了一个特殊问题,经过研究后找到了解决方案,特此记录分享。 问题背景 POI-TL作为一款优秀的Java Wor…

使用node-Express框架写一个学校宿舍管理系统练习项目-前后端分离

今天继续分享一个新的练习项目,是使用node做为后端语言,来写的一个前后端分离项目:学校宿舍管理系统。我们如果想掌握一门编程语言,就是需要大量的练习。所以当我们学习到了一些知识,自己想一下 可以拿学到的知识&…

Kafka 运维实战基本操作含命令与最佳实践

1. 基础概览与工具入口 Kafka 发行包的所有 CLI 工具均在 bin/ 目录下。任何工具不带参数运行都会显示所有可用选项。本文命令默认:--bootstrap-server localhost:9092;生产请替换为你的控制面或内网 VIP。 2. 主题管理(创建 / 修改 / 删除 /…

贪心算法应用:航班起降问题详解

Java中的贪心算法应用:航班起降问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致全局最优解的算法策略。在航班起降问题中,贪心算法可以有效地解决机场跑道调度问题,即如何安排航班的起降顺序以最大…

uniapp scroll-view 设置scrollTop无效

当我们使用 scroll-view的scroll-top的时候 默认想让它回到顶部,当我们设置值为0的时候会不生效,在实际运用过程中,发现设置了scroll-top无效,滚动条位置并没有发生变化,是因为微信小程序的官方框架处于性能考虑&#…

网络与通信

1.TCP协议与UDP协议TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)是 TCP/IP 协议族中两种核心的传输层协议,它们在数据传输方式、可靠性、适…

Node.js中package.json详解

1. name(名称) 如果你计划发布你的包,package.json 中最重要的字段是 name 和 version,因为它们是必需的。name 和 version 共同组成一个假定完全唯一的标识符。包的更改应伴随版本号的更新。如果你不打算发布包,那么…

代码随想录第14天| 翻转、对称与深度

226.翻转二叉树 (优先掌握递归) 题目链接/文章讲解/视频讲解:翻转二叉树 交换的是指针,而不是数值,如果用数值做交换,需要交换的节点下面无法很好的操作。 使用递归来实现,但要提前清除是什么顺…

DNS-Windows上使用DNS

DNS-Windows上使用DNS一、查看与修改DNS配置1.1、查看当前DNS服务器设置1.2、临时修改 DNS 服务器(命令行)二、DNS缓存相关操作2.1、查看DNS缓存内容2.2、 刷新 DNS 缓存(清除过期记录)三、测试域名解析(nslookup 工具…

3dsMax 2026 .NET Core 8 转型下的Maxscript脚本开发:动态编译模块的重构策略与兼容性升级路径

3ds Max 长期以来一直提供出色的 .NET 集成,使 Maxscript 能够无缝利用任何 .NET 库的强大功能。部分开发者在工具中广泛使用了 .NET 功能。 之前,3ds Max 依赖于 .NET Framework 4.8 并且最近更新到了 4.8.1,用于 2025 版本的发布。然而,随着 3ds Max 2026 的推出,Autod…

golang 做webrtc开发核心

在Golang中进行WebRTC开发,核心在于理解WebRTC协议的工作原理以及如何利用Go生态中的库来实现关键功能。以下是Golang WebRTC开发的核心要点: WebRTC基础概念 了解ICE(Interactive Connectivity Establishment)协议用于NAT穿越掌握…

RabbitMQ 异步化抗洪实战

说明:本文仅展示架构思路与安全片段,所有敏感字段已用占位符;不含可直接复刻的生产细节。数据与接口均为演示/虚拟。0. 背景与目标长耗时/不确定接口(如对接第三方机器人平台)的同步阻塞,容易造成请求堆积与…

接口返回 2 万条数据,easy-trans导致多了20s耗时排查过程

内网访问排版核料详情功能,用户反馈要等十几秒排查 sql:sql 比较简单排查内存计算:arthus trace 类名 方法名 总耗时2s排查页面渲染是否缓慢:F12 查看接口 等待服务器响应 20s 下载时间 30s, 故不考虑渲染问题排查请求响应日志打…

AIGC入门,手搓大模型客户端与MCP交互

概述 在现代应用开发中,将大语言模型(LLM)与专用工具服务相结合,可以构建出既能理解自然语言,又能准确执行专业任务的智能代理。本文介绍一个基于 MCP(Model Context Protocol)协议和 Ollama 本…

深度学习:从预备知识到未来展望

在当今数字化时代,深度学习正以前所未有的速度改变着我们的生活和工作方式。从智能语音助手到自动驾驶汽车,从精准医疗到个性化推荐系统,深度学习的应用无处不在。本文将从深度学习的预备知识入手,探讨其发展历程、关键技术和未来…

软考高级系统架构设计师之构件与中间件技术篇

一、构件的定义 定义1:软件构件是一种组装单元,它具有规范的接口规约和显式的语境依赖。软件构件可以被独立地部署并由第三方任意地组装。 定义2:构件是某系统中有价值的、几乎独立的并可替换的一个部分,它在良好定义的体系结构语境内满足某清晰的功能。…

Node.js 文件上传中文文件名乱码问题,为什么只有Node会有乱码问题,其他后端框架少见?

问题现象当用户上传包含中文字符的文件时,在服务器端获取到的文件名可能变成类似 ‹•–‡.txt 这样的乱码,而不是预期的中文文件名。为什么只有Node会乱码?很多后端框架(如 Java Spring Boot、Python Django、PHP Laravel&#x…

学习英语音标 (从汉语角度看英语音标发音差异)

仅供参考, 跟着教学视频看不懂时再来看以下引导 以下只写容易出错的音标 发音视频: https://www.jiwake.com/yinbiaofayin/ 音标规则单词ɜː类似汉语e, 饿~urgeə类似汉语e, 饿goɔː类似汉语o, 哦~walkɒ类似汉语o, 哦washɪ/iː/的短语, 不止发声短,舌头不用隆起itʃ类似汉…

论文笔记(九十一)GWM: Towards Scalable Gaussian World Models for Robotic Manipulation

GWM: Towards Scalable Gaussian World Models for Robotic Manipulation文章概括摘要1. 引言2. 相关工作3. 高斯世界模型(Gaussian World Model)3.1. 世界状态编码(World State Encoding)3.2. 基于扩散的动态建模(Dif…