先列一下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的相互调用或者协调。

比如嵌入式系统中,一般不止一个应用程序,可能会有多个程序,在整体编译时,会包括如下内容:

  1. 各个应用程序模块的编译(需要判断是否编译成功,出现编译失败的情况停下来,抛出错误信息)
  2. 应用程序打包(做成压缩包或者分区镜像)
  3. 默认配置文件打包
  4. uboot、内核、文件系统、应用程序整体打包成一个镜像文件,大小对应flash分区的大小(大小不足需要填充空数据,保证与分区对应)。
  5. 自动版本管理,在编译完成,打包完成后,可以通过脚本来自动根据时间生成版本号。

这些东西做起来其实挺复杂的,需要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系统开发的更多相关文章

  1. 盘点linux操作系统中的10条性能调优命令,一文搞懂Linux系统调优

    原文链接:猛戳这里 性能调优一直是运维工程师最重要的工作之一,如果您所在的生产环境中遇到了系统响应速度慢,硬盘IO吞吐量异常,数据处理速度低于预期值的情况,又或者如CPU.内存.硬盘.网络等系统资源长 ...

  2. 一文搞懂 Linux 的 inode!

    一个执着于技术的公众号 1.inode 是什么 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于 ...

  3. 一文搞懂 Linux network namespace

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 本文通过 IP ...

  4. Web端即时通讯基础知识补课:一文搞懂跨域的所有问题!

    本文原作者: Wizey,作者博客:http://wenshixin.gitee.io,即时通讯网收录时有改动,感谢原作者的无私分享. 1.引言 典型的Web端即时通讯技术应用场景,主要有以下两种形式 ...

  5. 一文搞懂vim复制粘贴

    转载自本人独立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/ 概述 复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻 ...

  6. 一文搞懂指标采集利器 Telegraf

    作者| 姜闻名 来源|尔达 Erda 公众号 ​ 导读:为了让大家更好的了解 MSP 中 APM 系统的设计实现,我们决定编写一个<详聊微服务观测>系列文章,深入 APM 系统的产品.架构 ...

  7. 一文搞懂RAM、ROM、SDRAM、DRAM、DDR、flash等存储介质

    一文搞懂RAM.ROM.SDRAM.DRAM.DDR.flash等存储介质 存储介质基本分类:ROM和RAM RAM:随机访问存储器(Random Access Memory),易失性.是与CPU直接 ...

  8. 三文搞懂学会Docker容器技术(中)

    接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...

  9. 三文搞懂学会Docker容器技术(下)

    接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...

随机推荐

  1. Oracle表的基本查询

    Oracle 分页 1.rownum分页 Select * from emp; Select a1.*,rownum rn from (Select * from emp) a1; 2.显示rownu ...

  2. Python 字符串改变

    在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...

  3. 静态方法中注入bean

    @Componentpublic class ScriptExecuteContent { @Autowired private static SignRepository signRepositor ...

  4. Spring源码解析——核心类介绍

    前言: Spring用了这么久,虽然Spring的两大核心:IOC和AOP一直在用,但是始终没有搞懂Spring内部是怎么去实现的,于是决定撸一把Spring源码,前前后后也看了有两边,很多东西看了就 ...

  5. java 面向对象(十九):关键字:static

    static:静态的1.可以用来修饰的结构:主要用来修饰类的内部结构属性.方法.代码块.内部类2.static修饰属性:静态变量(或类变量) 2.1 属性,是否使用static修饰,又分为:静态属性 ...

  6. python 装饰器(八):装饰器基础(四)types.MethodType的作用

    1 types.MethodType的作用—添加实例方法 import types class cla(object): def __init__(self, name, age): self.nam ...

  7. 1731: [Usaco2005 dec]Layout 排队布局*

    1731: [Usaco2005 dec]Layout 排队布局 题意: n头奶牛在数轴上,不同奶牛可以在同个位置处,编号小的奶牛必须在前面.m条关系,一种是两头奶牛距离必须超过d,一种是两头奶牛距离 ...

  8. Azure 提供负载均衡(一)Azure Traffic Manager 为我们的Web项目提供负载均衡

    一,引言 上一篇讲到我们将自己的Net Core Web 项目部署到 Azure 的 Web App 的一项 pass 服务,假如随着项目的日益增长的访问量,之前部署到单节点的应用可能无法保证其稳定性 ...

  9. LESS实战::not与:hover混合使用

    举个例子,有个HTML是这样的. <div class="item light">A</div> <div class="item" ...

  10. MySQL(一)简介与入门

    一.数据库简介 这个博客详细介绍:http://www.cnblogs.com/progor/p/8729798.html 二.MySQL的安装 这个博客详细介绍:https://blog.csdn. ...