一文搞懂Linux系统开发
先列一下Linux系统开发要掌握的知识,以后有时间再一一介绍。
欢迎关注我的微信公众号:fensnote
文章目录
Linux系统开发会用到什么?
C语言基础
Linux系统内核是C语言编写的,所以,Linux系统开发可能会和很多系统API打交道,需要掌握C语言基础,C语言是Linux最基础的开发语言,当然也可以用C++。一般做与系统交互的模块时,用C语言多一些,做上层业务应用时,为了开发效率,会使用C++来开发,毕竟C++是面向对象的开发语言,适合大型项目的开发,方便模块化,代码复用率高。
shell脚本
shell脚本,也就是使用Linux系统下的一系列命令,有机组合在一起,而完成预期的功能。Linux设计思想是“小即是美”,这一思想是shell脚本编程的完美体现。每个命令只完成一种功能,不同的命令组合在一起,却可以实现复杂的功能。做Linux下开发,免不了要与脚本打交道(比如测试、分析数据等)。
学会使用Makefile
Makefile是Linux程序开发时必不可少的编译管理脚本,这个里面东西也很多,不过刚开始可以简单看看,够用就行,随着项目的越做越大,代码文件与目录越来越复杂,这时候的Makefile可能就会复杂一些,牵扯到不同目录的Makefile的相互调用或者协调。
比如嵌入式系统中,一般不止一个应用程序,可能会有多个程序,在整体编译时,会包括如下内容:
- 各个应用程序模块的编译(需要判断是否编译成功,出现编译失败的情况停下来,抛出错误信息)
- 应用程序打包(做成压缩包或者分区镜像)
- 默认配置文件打包
- uboot、内核、文件系统、应用程序整体打包成一个镜像文件,大小对应flash分区的大小(大小不足需要填充空数据,保证与分区对应)。
- 自动版本管理,在编译完成,打包完成后,可以通过脚本来自动根据时间生成版本号。
这些东西做起来其实挺复杂的,需要Makefile与shell脚本搭配完成。
常规Linux系统编程知识都有什么?哪些常用?哪些不常用?
常规Linux编程知识
文件IO
比较常用
Linux系统下,所有的资源都是以文件的形式访问的,设备被抽象为设备文件,放于/dev目录下。
基本的访问函数:
| 函数名 | 简介 | 一般怎么用 |
|---|---|---|
| open | 打开设备文件 | 访问设备文件,首先要先打开设备 |
| close | 关闭设备文件 | 文件访问结束后,需要调用该接口,如果不关闭,会造fb耗尽 |
| read | 读取数据 | 读取数据,可以是文本文件内容,也可以是摄像头数据等 |
| write | 写入数据 | 向设备写数据,比如串口通信时,可以用write发送数据 |
| ioctl | IO操作函数 | 该函数功能比较多,被称作杂物箱~,可以读、写数据,做驱动的同学应该很了解 |
| fcntl | 属性设置函数 | 对已经打开的设备,设置属性,比如可以设置串口读数据的阻塞和非阻塞属性 |
| lseek | 改变偏移量 | 一般用于对已打开的文件读写位置的偏移量修改 |
文件与目录操作
常用
系统编程少不了文件与目录的访问,比如你要读取某个目录下的所有文件名字,或者修改文件名、修改目录,移动文件等等。
| 函数名 | 简介 | 一般怎么用 |
|---|---|---|
| stat、 fstat 、lstat | 获取文件状态 | 可以获取到文件的创建、访问时间,文件大小等 |
| access | 检测文件属性 | 常用于判断文件是否存在 |
| chmod | 修改文件权限 | 一般涉及到文件访问权限修改时,会用到,比如增加可执行权限 |
| mkdir | 创建目录 | 一般在程序里判断到需要用到的目录不存在时,用此函数创建 |
| rmdir | 删除目录 | 需要删除目录时使用,一般很少用到 |
| opendir | 打开目录 | 在读取目录信息之前,需要先打开目录(类中与文件访问) |
| readdir | 读取目录内容 | 在检索文件时,会用到,读取目录下文件列表 |
| closedir | 关闭目录 | 在读取完成后,记得关闭目录 |
| sync | 同步数据到磁盘 | 这个函数一般在修改文件,写入数据后调用,让系统把数据同步到磁盘 |
标准IO库
比较常用
所谓标准IO库,其实是C语言里的文件IO,另外这里面的IO与前面提到的“文件IO”在文件的读写上有个区别,标准IO是有缓存的,而Linux系统的文件IO函数是无缓存的。
主要是文件操作函数:
| 函数名 | 简介 | 一般怎么用 |
|---|---|---|
| fopen | 打开文件 | 放文件文件前先调用fopen获取文件句柄 |
| fclose | 关闭文件 | 文件访问结束后,记得关闭文件,否则造成内存泄露 |
| fread | 读取文件 | 读取文件数据 |
| fseek | 修改文件读写位置 | 用于修改文件读写的位置偏移量 |
进程控制
一般
如果你不使用多进程编程的话,这一项可能就用的不多,我的代码里用的也不是太多。
这个知识点主要是进程的创建、子进程管理、进程退出资源释放等等。
线程编程
比较常用
上了系统,一般跑的任务就会比较多,线程是比较常用的,一般可以分为两种,一种是长时间运行的任务,一种是执行完任务自行退出。现在C++11已经支持了线程,使用起来非常方便。之前没有C++11时,为了方便使用,都是对pthrea_簇函数进行了二次封装。
高级IO
常用
可能你会比较奇怪,为什么这么多“IO”相关的东西:文件IO、标准文件IO、高级IO!
是的,这里的IO比较多,前两个“IO”还有点相似,这个高级IO和前面两个有点不太一样。
高级IO里主要是讲的IO操作的方式:阻塞、非阻塞控制,最主要的是通过select和poll实现IO多路复用,这样可以实现程序的异步执行。现在用的比较多的Nginx,就是使用的epoll模型,实现的高并发。
进程间通信
非常常用
一般在linux系统下面,既然是系统,就不止一个应用程序在运行,那多个应用程序,就会需要数据交互,那么,就用到了进程间通信,进程间通信有许多开源的工具(比如DBUS),这里简单介绍一下系统里提供的通信方式:
| 名称 | 简介 |
|---|---|
| 管道 | 一般用于父子进程间通信,有名管道可以跨程序 |
| 消息队列 | 消息队列可以分类型,适用于数据量小的,简单通信 |
| 信号量 | PV操作,用于同步,可以与共享内存搭配用,写完数据,告诉另一个线程可以读取了 |
| 共享内存 | 适用于大数据量的传输 |
| socket | socke不仅是网络通信的接口,也可以是本地进程间通信(UNIX socke),这种方式很常用 |
数据库
常用
如果是存储配置参数,我不太推荐用数据库,用json就挺好。数据一般用于存储比较规则的数据,这样方便数据的管理。在嵌入式系统,用的比较多的是sqlite数据库。
串口编程
比较常用
在Linux下,特别是做嵌入式系统,这个可能是少不了的,比较常用。其实串口编程也很简单,可能200行代码就可以把串口通信建立起来了。应用层的数据通信,就是使用write、和read函数操作,但是如果想做的比较好一些,就需要花点时间去做个软件框架,比如利用前面提到的select实现异步操作(后面文章会介绍实现方式以及串口的封装)。
网络编程
超级常用
相信现在的嵌入式设备基本上都需要网络通信功能,所以,网络编程自然是非常常用的。特备是现在物联网的发展,万物互联。Linux下的网络编程,有一系列的API函数,挺多的,参数配置也比较多,刚开始会让人很头疼,不知道哪个参数设置个什么值合适(我们都是慢慢试错试出来的)。这个也不用担心,我后面会给大家分享出来我用C++封装好的网络通信库,包括TCP、UPD、UDP组播、域套接字(本地)等的封装。
结束语
以后有时间再介绍,欢迎大家关注。
微信公众号:

一文搞懂Linux系统开发的更多相关文章
- 盘点linux操作系统中的10条性能调优命令,一文搞懂Linux系统调优
原文链接:猛戳这里 性能调优一直是运维工程师最重要的工作之一,如果您所在的生产环境中遇到了系统响应速度慢,硬盘IO吞吐量异常,数据处理速度低于预期值的情况,又或者如CPU.内存.硬盘.网络等系统资源长 ...
- 一文搞懂 Linux 的 inode!
一个执着于技术的公众号 1.inode 是什么 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于 ...
- 一文搞懂 Linux network namespace
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 本文通过 IP ...
- Web端即时通讯基础知识补课:一文搞懂跨域的所有问题!
本文原作者: Wizey,作者博客:http://wenshixin.gitee.io,即时通讯网收录时有改动,感谢原作者的无私分享. 1.引言 典型的Web端即时通讯技术应用场景,主要有以下两种形式 ...
- 一文搞懂vim复制粘贴
转载自本人独立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/ 概述 复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻 ...
- 一文搞懂指标采集利器 Telegraf
作者| 姜闻名 来源|尔达 Erda 公众号 导读:为了让大家更好的了解 MSP 中 APM 系统的设计实现,我们决定编写一个<详聊微服务观测>系列文章,深入 APM 系统的产品.架构 ...
- 一文搞懂RAM、ROM、SDRAM、DRAM、DDR、flash等存储介质
一文搞懂RAM.ROM.SDRAM.DRAM.DDR.flash等存储介质 存储介质基本分类:ROM和RAM RAM:随机访问存储器(Random Access Memory),易失性.是与CPU直接 ...
- 三文搞懂学会Docker容器技术(中)
接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...
- 三文搞懂学会Docker容器技术(下)
接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...
随机推荐
- Video.js随笔记
下载与介绍 Video.js是一款web视频播放器,支持html5和flash两种播放方式.更有自定义皮肤,插件,组件,语言还有丰富的选项配置. 官网下载地址:https://videojs.com/ ...
- C++main函数与命令行参数,退出程序
本文翻译自:https://docs.microsoft.com/en-us/cpp/cpp/main-function-command-line-args?view=vs-2019 (除动态链接库d ...
- MYSQL 之 JDBC(七):增删改查(五) DAO设计模式
Data Access Object,数据访问对象 what:访问数据信息的类.包含了对数据的CRUD(create.read.update.delete,增删改查)操作,而不包含任何业务相关的信息. ...
- 【Python学习笔记六】获取百度搜索结果以及百度返回“百度安全验证”问题解决
1.获取百度搜索结果页面主要是修改百度搜索url中的参数实现,例如查询的关键字为wd: 举例:https://www.baidu.com/s?wd=python",这样就可以查询到‘pyth ...
- 拆招黑客!github代码库大牛们如何应对黑客攻击
2019年05月,<个人电脑杂志>网站报道,GitHub(2018年被微软收购)代码库正遭到一名黑客的入侵(392个资源库受损,约1000名用户受到攻击,真实资料未知).据称,这名黑客先擦 ...
- 微信小程序开发(一)基础知识学习
1.特点: ①无DOM对象(虚拟DOM),一切基于组件化(复用.解耦) ②四个重要文件: *.js.*.wxml --> html..wxss --> css.*.json ③无需下载 ...
- APP自动化 -- 坐标获取和点击
一.获取元素坐标 二.点击坐标 1.driver的点击(这个可以实现多点同时点击) 1)执行 这个coordinate变量必须是一个list coordinate_list = [(0, 0), (1 ...
- DNA Consensus String UVA - 1368
题目链接:https://vjudge.net/problem/UVA-1368 题意:给出一组字符串,求出一组串,使与其他不同的点的和最小 题解:这个题就是一个点一个点求,利用桶排序,求出最多点数目 ...
- RACTF-web C0llide?(js弱类型)
源码: const bodyParser = require("body-parser") const express = require("express") ...
- 修改了数据库文件可以识别是否最新,按数据库文件名20181217.db,日期名作文件名时间戳
修改了数据库文件可以识别是否最新,按数据库文件名20181217.db,日期名作文件名时间戳 压缩包device.rar上传到邮箱