linux编程实践?linux课程主要学啥了
今天给各位分享linux编程实践的知识,其中也会对linux课程主要学啥了进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
新手如何自学linux
新手自学linux,需要制定详细的学习路线和学习内容,可以按照以下思路学习:
第一阶段:linux基础入门
Linux基础入门主要包括: Linux硬件基础、Linux发展历史、Linux系统安装、xshell连接、xshell优化、SSH远程连接故障问题排查、L inux基础优化、Linux目录结构知识、Linux文件属性、Linux通配符、正则表达式、Linux系统权限等
第二阶段:linux系统管理进阶
linux系统管理进阶包括:Linux定时任务、Linux用户管理、Linux磁盘与文件系统、Linux三剑客之sed命令等。
第三阶段:Linux Shell基础
Linux Shell基础包括:Shell编程基础、Linux三剑客之awk命令等。
第四阶段:Linux网络基础
第五阶段:Linux网络服务
Linux网络服务包括:集群实战架构开始及环境准备、rsync数据同步服务、Linux全网备份项目、nfs网络存储服务精讲、inotify/sersync实时数据同步/nfs存储实时备份项目等。
第六阶段:Linux重要网络服务
Linux重要网络服务包括:http协议/www服务基础、nginx web介绍及基础实践、nginx web、lnmp环境部署/数据库异机迁移/共享数据异机迁移到NFS系统、nginx负载均衡、keepalived高可用等。
第七阶段:Ansible自动化运维与Zabbix监控
Ansible自动化运维与Zabbix监控包括: SSH服务秘钥认证、ansible批量自动化管理集群、 zabbix监控等。
第九阶段:大规模集群高可用服务(Lvs、Keepalived)
第十阶段:Java Tomcat服务及防火墙Iptables
第十一阶段:MySQL DBA高级应用实践
MySQL DBA高级应用实践包括:MySQL数据库入门基础命令、MySQL数据库进阶备份恢复、MySQL数据库深入事务引擎、MySQL数据库优化SQL语句优化、MySQL数据库集群主从复制/读写分离、MySQL数据库高可用/mha/keepalved等。
第十二阶段:高性能数据库Redis和Memcached课程
第十三阶段:Linux大规模集群架构构建(200台)
第十四阶段:Linux Shell编程企业案例实战
第十五阶段:企业级代码发布上线方案(SVN和Git)
第十六阶段企业级Kvm虚拟化与OpenStack云计算
第十七阶段公有云阿里云8大组件构建集群实战
第十八阶段:Docker技术企业应用实践
第十九阶段:Python自动化入门及进阶
第二十阶段:职业规划与高薪就业指导
Linux学习周期因人而异,如果您有比较好的学习规划,每天坚持学习4至5个小时,坚持3至6个月,应该可以熟练掌握Linux基本操作,但是,如果只有计划,没有实施,那就另当别论了,如果想更深入、更节省时间的学习Linux操作系统,建议报班学习,效果会更加明显!
嵌入式Linux上的C语言编程实践的目录
第一部分基础知识
第1章 Linux环境下C语言的开发 2
1.1 Linux下的C语言开发环境 2
1.2在Linux中使用C语言开发 3
1.2.1开发流程和开发工具 3
1.2.2 Linux中程序的运行原理 4
第2章嵌入式环境中的C语言开发 7
2.1嵌入式C语言的开发环境 7
2.2嵌入式开发中C语言编程要点 9
第二部分 Linux环境中
C语言的开发环境和工具
第3章 Linux的文本编辑工具VI 12
3.1 VI编辑器概述 12
3.1.1 VI简介 12
3.1.2 VI的工作模式和使用
3.1.2之前的准备 12
3.1.3进入和退出VI 13
3.2 VI的增强版VIM 16
3.3 VI编辑器的基本使用方法 17
3.3.1在屏幕上移动光标 17
3.3.2插入文本 20
3.3.3删除文本 22
3.3.4修改文本内容 25
3.3.5替换文本内容 27
3.3.6合并文本内容 30
3.3.7移动文本内容 30
3.4 VI编辑器的命令和高级操作 32
3.4.1 VI常用命令的列表 32
3.4.2 VI的一些高级的操作和
3.1.2使用技巧 35
第4章 GCC程序开发工具 39
4.1 GNU工具综述 39
4.2 GCC的编译和连接 43
4.2.1工程示例 43
4.2.2编译、汇编和连接 46
4.2.3动态库 48
4.3 GCC的二进制工具 49
4.3.1 ar(归档工具) 49
4.3.2 readelf(读取ELF格式
3.1.2文件信息) 51
4.3.3 strings(查看字符串) 54
4.3.4 nm(显示符号信息) 55
4.3.5 strip(删除符号) 57
4.3.6 objdump(显示目标
3.1.2文件信息) 58
4.3.7 objcopy(复制目标文件) 63
第5章 make工程管理工具 67
5.1 make和Makefile 67
5.1.1 make机制概述 67
5.1.2 make和Makefile的使用 68
5.2 Makefile使用示例 69
5.2.1简单的Makefile 69
5.2.2 Makefile中的依赖关系 71
5.2.3 Makefile中使用隐含规则
3.1.2来编译程序 73
5.2.4 Makefile中指定依赖关系的
3.1.2编译 76
5.3自动生成Makefile 78
5.3.1自动生成Makefile的意义和
3.1.2相关工具 78
5.3.2自动生成Makefile的流程 79
第6章 GDB调试工具 85
6.1 GDB简介 85
6.2使用GDB调试程序 86
6.2.1基本操作 88
6.2.2查看命令 90
6.2.3高级命令 92
6.2.4 attach命令的使用 94
6.3远程GDB调试 95
6.3.1本地GDB调试和远程GDB
3.1.2调试的比较 95
6.3.2远程GDB调试流程 97
6.3.3远程GDB调试示例 98
第三部分库函数
第7章 C语言标准库函数 106
7.1 ISO的C语言标准库函数
7.1分类 106
7.2标准格式化输入/输出类函数 107
7.2.1 scanf函数:格式化输入
3.1.2字符串 107
7.2.2 printf函数:格式化输出
3.1.2字符串 109
7.2.3 putchar函数:输出字符到
3.1.2标准输出 111
7.2.4 getchar函数:从标准输入
3.1.2获取字符 111
7.2.5 putc函数:向文件输出字符 112
7.2.6 getc函数:从文件输入字符 112
7.2.7 gets函数:获得字符串 112
7.2.8 puts函数:输出指定字符串 113
7.2.9 ungetc函数:把字符
3.1.2写回流中 113
7.3字符处理类函数 114
7.4字符串处理及转换函数 116
7.4.1 sprintf函数:格式化输出
3.1.2字符串到一个缓冲区 116
7.4.2 strcat和strncat函数:
3.1.2字符串连接 119
7.4.3 strcpy和strncpy函数:
3.1.2字符串复制 120
7.4.4 strcmp和strncmp函数:
3.1.2字符串比较 121
7.4.5 strlen函数:获取字符串
3.1.2长度 122
7.4.6 strchr和strrchr函数:字符/
3.1.2字符串定位 122
7.4.7 strstr函数:字符串查找 123
7.4.8 strrev函数:字符串逆序 124
7.4.9 strupr和strlwr函数:字母
3.1.2形式转换 125
7.4.10 strdup和strndup函数:
3.1.2字符串复制 125
7.4.11 memset函数:内存设置 126
7.4.12 memmove函数:内存移动 126
7.4.13 memcmp函数:内存比较 127
7.4.14 memcpy函数:内存复制 128
7.5数学计算类函数 128
7.6数据结构和算法类函数 133
7.6.1 bsearch函数:二元搜索 133
7.6.2 lfind函数:线性搜索 134
7.6.3 lsearch函数:线性搜索 135
7.6.4 qsort函数:利用快速排序法
3.1.2排列数组 136
7.6.5 rand函数:产生随机数 136
7.6.6 srand函数:设置随机
3.1.2数种子 137
7.7文件I/O操作类相关函数 137
7.7.1 fopen函数:打开文件 138
7.7.2 fclose函数:关闭文件 139
7.7.3 fgetc函数:从文件中读取
3.1.2一个字符 139
7.7.4 fputc函数:将一指定字符
3.1.2写入文件流中 139
7.7.5 fgets函数:从文件中读取
3.1.2一字符串 140
7.7.6 fputs函数:将一指定的
3.1.2字符串写入文件内 140
7.7.7 rewind函数:重设文件流的
3.1.2读写位置为文件开头 141
7.7.8 ftell函数:取得文件流的
3.1.2读取位置 141
7.7.9 fseek函数:移动文件流的
3.1.2读写位置 141
7.7.10 fwrite函数:将数据写至
7.7.10文件流 142
7.7.11 fread函数:从文件流读取
7.7.10数据 142
7.7.12 remove函数:删除文件 143
7.7.13 rename函数:更改文件
7.7.10名称或位置 143
7.7.14 freopen函数:重新打开
7.7.10文件 144
7.7.15 fflush函数:同步缓冲区 144
7.7.16 fgetpos函数:获得文件
7.7.10位置 145
7.7.17 fsetpos函数:设置文件
7.7.10位置 145
7.7.18 mktemp函数:建立临时
7.7.10文件 146
7.7.19 tmpfile函数:临时文件 146
7.7.20 tmpnam:得到临时文件名 147
7.8日期时间类函数 147
7.8.1 clock函数:获得CPU时间 148
7.8.2 time函数:获得当前日历
7.8.2时间 148
7.8.3 difftime函数:获得时间
7.8.2差值 148
7.8.4 gmtime函数:将日历时间
7.8.2转换成UTC时间 149
7.8.5 mktime函数:将UTC时间
7.8.2转换成日历时间 149
7.8.6 asctime函数:将UTC时间
7.8.2转换成字符串 149
7.8.7 ctime函数:将日历时间转换
7.8.2成当地时间的字符串 150
7.8.8 localtime函数:将日历时间
7.8.2转换成本地时间 150
7.8.9 strftime函数:转换日期和
7.8.2时间格式 151
7.9国际化和本地化函数 152
7.9.1 setlocale函数:本地化控制
7.8.2函数 153
7.9.2 localeconv函数:本地化
7.8.2转换 154
7.10错误处理类函数 155
7.10.1 clearerr函数:清除流中的
7.10.1结束指示符和错误指示符 155
7.10.2 feof函数:指示文件结束 155
7.10.3 ferror函数:指示文件出错 156
7.10.4 perror函数:输出出错信息 156
7.10.5 errno函数:错误编号记录 156
7.11其他一些工具函数 157
7.11.1 assert函数:程序诊断 157
7.11.2长跳转函数 157
7.11.3可变长的参数控制函数 160
7.11.4获取结构体成员函数
7.10.1(宏) 161
7.12一些标准库中有用的宏 161
第8章 Linux中C语言的扩展库
函数 163
8.1文件I/O操作函数 163
8.1.1 open函数:打开文件 163
8.1.2 close函数:关闭文件 164
8.1.3 read函数:读文件 165
8.1.4 write函数:写文件 165
8.1.5 lseek函数:文件定位 167
8.1.6 ioctl函数:文件控制 167
8.1.7 flock函数:锁定文件 167
8.1.8 mmap函数和munmap函数:
8.1.8内存映射 168
8.1.9 create函数:创建新文件 170
8.1.10 dup函数和dup2函数:
8.1.10复制文件描述符 171
8.1.11 fcntl函数:改变已打开的
8.1.10文件的属性 171
8.2文件权限相关的操作函数 172
8.2.1 access函数:判断是否
8.2.1具有存取文件的权限 172
8.2.2 chown函数和fchown函数:
8.2.1改变文件的所有者 173
8.2.3 chmod函数和fchmod函数:
8.2.1改变权限 173
8.2.4 unlink函数:删除文件 173
8.2.5 utime函数和utimes函数:
8.2.1改变文件时间 174
8.2.6 umask函数:设置建立
8.2.1新文件时的权限掩码 175
8.2.7 link函数:建立文件连接 175
8.2.8 stat函数、fstat函数和lstat
8.2.1函数:获取文件信息 175
8.3用户组操作函数 176
8.3.1 getgid函数和setgid函数:
8.2.1获得/设置组识别码 176
8.3.2 getegid函数和setegid函数:
8.2.1获得/设置有效的组识别码 177
8.3.3 getuid函数和setuid函数:
8.2.1获得/设置真实的用户识别码 177
8.3.4 geteuid函数和seteuid函数:
8.2.1获得/设置有效的用户识别码 178
8.3.5 getgroups函数和setgroups
8.2.1函数:获得/设置组代码 178
8.4信号类函数 179
8.4.1 kill函数:传送信号给指定的
8.2.1进程 181
8.4.2 raise函数:信号发送函数 181
8.4.3 alarm函数:设置超时函数 182
8.4.4 signal函数:信号安装函数 182
8.5进程处理函数 183
8.5.1 getpid函数和getppid函数:
8.2.1获得进程ID和父进程ID 183
8.5.2 fork函数:建立子进程 183
8.5.3 sleep函数和usleep函数:
8.2.1让进程暂停执行一段时间 185
8.5.4 exec函数族:找到可执行
8.2.1文件 185
8.5.5 _ exit函数和_Exit函数:
8.2.1结束进程执行 188
第四部分 C语言高级编程
第9章动态内存的堆与栈 190
9.1程序内存区域的使用 190
9.1.1静态内存与动态内存 190
9.1.2 C语言中的动态内存 191
9.2 C程序中栈空间的使用 196
9.2.1参数使用栈空间 196
9.2.2自动变量使用栈空间 199
9.2.3程序中较大的栈 201
9.2.4栈空间的特性 202
9.3 C程序中的堆空间使用 203
9.3.1分配和释放堆内存的库函数 203
9.3.2库函数使用 204
9.3.3堆内存的特性 218
9.4堆内存和栈内存使用的比较 222
9.4.1利用返回值传递信息 222
9.4.2利用参数传递信息 226
9.4.3堆与栈内存管理的区别 231
第10章函数指针的使用 232
10.1函数指针的概念 232
10.1.1 C语言函数的本质 232
10.1.2函数指针在C语言中的
10.1.2意义 234
10.2函数指针的使用 237
10.2.1函数指针使用初步 237
10.2.2函数指针的类型定义 240
10.2.3函数指针作为结构体成员 242
10.2.4函数指针作为函数的参数 243
10.2.5函数指针作为函数的
10.2.5返回值 244
10.2.6函数指针数组 246
10.3函数指针使用示例 248
第11章回调函数的使用 252
11.1回调函数的概念与作用 252
11.1.1程序调用的方式 252
11.1.2回调函数的作用 254
11.2回调函数的语法 254
11.2.1简单的回调函数 254
11.2.2完全形式的回调函数 256
11.3回调函数的使用 259
11.3.1 qsort中的回调函数 259
11.3.2 atexit和on_exit函数的
10.2.5注册退出函数 263
第12章 C语言实现对象编程 268
12.1 C语言实现基于对象编程的
12.1概念与作用 268
12.2 C语言基于对象编程实现
12.1封装 269
12.2.1简单的程序示例 269
12.2.2 C语言基于对象编程的
10.2.5详解 272
12.2.3 C语言基于对象编程与
10.2.5 C++面向对象编程的对比 275
12.3 C语言基于对象编程实现
12.3部分继承功能 278
12.3.1利用数据结构的包含实现
10.2.5继承功能 279
12.3.2利用私有指针实现继承
10.2.5功能 282
12.3.3 C语言实现继承的总结 287
12.4 C语言基于对象编程实现
12.4部分多态功能 288
12.4.1利用操作指针组的包含
10.2.5实现多态功能 288
12.4.2 C语言实现多态功能的总结 292
12.5对C语言实现基于对象
12.5编程的思考 292
12.5.1 C语言基于对象编程的
10.2.5特性 292
12.5.2 C语言基于对象编程中接口、
10.2.5实现和调用者的关系 293
第五部分在嵌入式
环境下的C语言编程
第13章 C语言程序的内存布局 295
13.1 C语言程序的存储区域 295
13.2 C语言程序的段 297
13.2.1段的分类 297
13.2.2程序中段的使用 298
13.3可执行程序的连接 301
13.3.1可执行程序的组成 301
13.3.2各个目标文件的关系 303
13.3.3连接错误示例 304
13.4 C语言程序的运行 309
13.4.1 RAM调试运行 311
13.4.2固化程序的XIP运行 312
13.4.3固化程序的加载运行 313
13.4.4 C语言程序的运行总结 315
第14章嵌入式C语言常用语法 317
14.1内存指针操作 317
14.1.1内存操作的意义 317
14.1.2使用指针操作内存 319
14.1.3 volatile的使用 324
14.1.4嵌入式系统指针的实际
10.2.5应用 325
14.2位操作 327
14.2.1位操作的意义 327
14.2.2位操作的语法 328
14.3大小端与对齐问题 330
14.3.1大小端问题 331
14.3.2内存对齐问题 335
14.3.3结构体成员的对齐问题 338
14.4程序的跳转 344
14.4.1嵌入式系统程序跳转的
10.2.5类型 344
14.4.2 C语言中实现程序的跳转 345
第15章嵌入式C语言编程的技巧 348
15.1程序的优化技巧 348
15.1.1循环缓冲区 348
15.1.2查表法 350
15.1.3针对循环执行效率的
10.2.5优化 353
15.2关于小数运算 355
15.3函数参数和返回值的传递 357
15.4变量的初始化技巧 360
15.4.1数组的初始化 360
15.4.2结构体的初始化 362
15.4.3变量的初始化总结 362
15.5程序的调试和宏使用的技巧 363
15.5.1打印文件、函数和程序行 363
15.5.2#:字符串化操作符 364
15.5.3##:连接操作符 366
15.5.4调试宏的第一种定义方式 367
15.5.5调试宏的第二种定义方式 368
15.5.6对调试语句进行分级审查 369
15.5.7条件编译调试语句 370
15.5.8使用do…while的宏定义 372
15.6代码剖析 373
参考文献 378
Linux Shell 脚本编程最佳实践
IT路边社
前言
与其它的编码规范一样,这里所讨论的不仅仅是编码格式美不美观的问题,同时也讨论一些约定及编码标准。这份文档主要侧重于我们所普遍遵循的规则,对于那些不是明确强制要求的,我们尽量避免提供意见。
编码规范对于程序员而言尤为重要,有以下几个原因:
本文档中的准则致力于最大限度达到以下原则:
尽管本文档涵盖了许多基础知识,但应注意的是,没有编码规范可以为我们回答所有问题,开发人员始终需要再编写完代码后,对上述原则做出正确的判断。
注:未明确指明的则默认为必须(Mandatory)
主要参考如下文档:
仅建议Shell用作相对简单的实用工具或者包装脚本。因此单个shell脚本内容不宜太过复杂。
在选择何时使用shell脚本时时应遵循以下原则:
可执行文件不建议有扩展名,库文件必须使用.sh作为扩展名,且应是不可执行的。
执行一个程序时,无需知道其编写语言,且shell脚本并不要求具有扩展名,所以更倾向可执行文件没有扩展名。
而库文件知道其编写语言十分重要,使用.sh作为特定语言后缀的扩展名,可以和其他语言编写的库文件加以区分。
文件名要求全部小写,可以包含下划线 _或连字符-,建议可执行文件使用连字符,库文件使用下划线。
正例:
反例:
源文件编码格式为UTF-8。避免不同操作系统对文件换行处理的方式不同,一律使用 LF。
每行最多不超过120个字符。每行代码最大长度限制的根本原因是过长的行会导致阅读障碍,使得缩进失效。
除了以下两种情况例外:
如出现长度必须超过120个字符的字符串,应尽量使用here document或者嵌入的换行符等合适的方法使其变短。
示例:
除了在行结束使用换行符,空格是源文件中唯一允许出现的空白字符。
对从来没有用到的或者被注释的方法、变量等要坚决从代码中清理出去,避免过多垃圾造成干扰。
Bash是唯一被允许使用的可执行脚本shell。
可执行文件必须以#!/bin/bash开始。请使用 set来设置shell的选项,使得用 bash echo"Process$: Done making$$$."
#示例7:命令参数及路径不需要引号 grep-li Hugo/dev/"$1"
#示例8:常规变量用双引号,ccs可能为空的特殊情况可不用引号 git send-email--to"${reviewers}"${ccs:+"--cc""${ccs}"}
#示例9:正则用单引号,$1可能为空的特殊情况可不用引号 grep-cP'([Ss]pecial||?characters*)${1:+"$1"}
#示例10:位置参数传递推荐带引号的"$@",所有参数作为单字符串传递用带引号的"$*"# content of t.sh func_t{ echo num:$# echo args: 1:$1 2:$2 3:$3}
func_t"$@" func_t"$*"#当执行./t.sh a b c时输出如下: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3:
使用$(command)而不是反引号。
因反引号如果要嵌套则要求用反斜杠转义内部的反引号。而$(command)形式的嵌套无需转义,且可读性更高。
正例:
反例:
条件测试
使用 [[... ]],而不是 [, test,和/usr/bin/[。
因为在 [[和 ]]之间不会出现路径扩展或单词切分,所以使用 [[... ]]能够减少犯错。且 [[... ]]支持正则表达式匹配,而 [... ]不支持。参考以下示例:
尽可能使用变量引用,而非字符串过滤。
Bash可以很好的处理空字符串测试,请使用空/非空字符串测试方法,而不是过滤字符,让代码具有更高的可读性。正例:
反例:
正例:
反例:
正例:
反例:
文件名扩展
当进行文件名的通配符扩展时,请指定明确的路径。
当目录中有特殊文件名如以-开头的文件时,使用带路径的扩展通配符./*比不带路径的*要安全很多。
应该避免使用eval。
Eval在用于分配变量时会修改输入内容,但设置变量的同时并不能检查这些变量是什么。反例:
请使用进程替换或者for循环,而不是通过管道连接while循环。
这是因为在管道之后的while循环中,命令是在一个子shell中运行的,因此对变量的修改是不能传递给父shell的。
这种管道连接while循环中的隐式子shell使得bug定位非常困难。反例:
如果你确定输入中不包含空格或者其他特殊符号(通常不是来自用户输入),则可以用for循环代替。例如:
使用进程替换可实现重定向输出,但是请将命令放入显式子 shell,而非 while循环创建的隐式子 shell。例如:
总是检查返回值,且提供有用的返回值。
对于非管道命令,使用$?或直接通过 if语句来检查以保持其简洁。
例如:
当内建命令可以完成相同的任务时,在shell内建命令和调用外部命令之间,应尽量选择内建命令。
因内建命令相比外部命令而言会产生更少的依赖,且多数情况调用内建命令比调用外部命令可以获得更好的性能(通常外部命令会产生额外的进程开销)。
正例:
反例:
加载外部库文件不建议用使用.,建议使用source,已提升可阅读性。正例:
反例:
除非必要情况,尽量使用单个命令及其参数组合来完成一项任务,而非多个命令加上管道的不必要组合。常见的不建议的用法例如:cat和grep连用过滤字符串; cat和wc连用统计行数; grep和wc连用统计行数等。
正例:
除特殊情况外,几乎所有函数都不应该使用exit直接退出脚本,而应该使用return进行返回,以便后续逻辑中可以对错误进行处理。正例:
反例:
推荐以下工具帮助我们进行代码的规范:
原文链接:
获取更多的面试题、脚本等运维资料点击:运维知识社区获取
脚本之---短信轰炸机
脚本之---QQ微信轰炸机
ansible---一键搭建redis5.0.5集群
elk7.9真集群docker部署文档
全球最全loki部署及配置文档
最强安全加固脚本2.0
一键设置iptbales脚本