Linux系统开发基础知识

2021-09-18 13:44:09 浏览数 (1)

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系统编程知识

文件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函数,挺多的,参数配置也比较多,刚开始会让人很头疼,不知道哪个参数设置个什么值合适,可以使用封装好的网络通信开源库,包括TCP、UPD、UDP组播、域套接字(本地)等。

0 人点赞