**目录 Linux系统开发会用到什么? C语言基础 shell脚本 慢慢学会使用Makefile 常规Linux系统编程知识都有什么?哪些常用?哪些不常用? 常规Linux编程知识 文件IO 文件与目录操作 标准IO库 进程控制 线程编程 高级IO 进程间通信 数据库 串口编程 网络编程 结束语 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组播、域套接字(本地)等的封装。
|