对于初级Linux C软件工程师,要想进阶成为中级甚至高级工程师,需要掌握很多技能和知识,如下:
一、 linux c编程
Linux C编程是linux C软件工程师的核心技能包,也是必备技能,涉及内容比较多,需要在工作中不断学习,熟练掌握Linux C编程,对于工作得心应手。
1.1.1 printf
printf是c语言中最基础的日志输出函数,初学者最早接触到的API。看似简单的函数,但实际应用中很常用,也容易犯错误。
用途和注意事项:
- 通过printf日志打印(结合__FUNCTION__和__LINE__)确认程序问题位置
当程序出现逻辑错误,不能从已有日志和代码分析出原因时,需要增加日志打印信息。一般程序都有用户自己封装的日志函数,但由于其有缓存,在程序crash时不能输出日志,这时可以使用printf代替 - 在使用printf打印日志时,需要注意打印的格式类型,比如%d,%f,%s等,在实际编程中,这个错误也比较常见。
1.1. 2 文件IO操作
fopen/fclose/fwrite/fread/fflush是c语言跨平台的基础API,用于读写文件,实际使用场景如下:
- 记录日志文件
- 读取配置文件
- 记录或导入二进制数据(如音视频数据)
1.1.3 系统IO操作
open/close/read/write是系统IO操作函数,可以读写文件,也可以读写网络IO。一般网络socket读写都使用系统IO操作
1.1.4 IO复用
IO复用是网络编程中重要的机制。IO复用有三种:epoll、select和poll。性能最高的是epoll, 也是必须要掌握的机制。
1.1.5 gcc
熟悉gcc编译选项、和常用链接参数非常重要,可以更快解决编译问题
1.1.6 gdb
遇到棘手的问题或是在增加调试日志不能查到原因时,需要使用gdb调试工具,通过查看内存状态等排查问题
1.1.7 udp通信
UDP通信是常用的传输方式之一,掌握UDP socket编程对于开发Linux网络编程至关重要
1.1.8 tcp通信
TCP通信是常用的传输方式之一,熟悉TCP socket编程非常重要
1.1.9 命令行参数解析(getopt/getopt_long)
一般的程序启动时都有参数, 熟练掌握命令行参数解析在开发新程序时的必备知识
1.1.10 数据结构:链表(单向,双向)增删改查
需要掌握基础的单向及双向链表,并熟悉相应的增删改查操作。有时间需要理解下内核的双向链表,设计的比较好,理解了内核的链表的设计,可以说是掌握了C语言链表精髓。
1.1.11 多进程和多线程
需要掌握多线程和多进程的应用,以及线程间和进程间不同的通信方式。
1.1.12 静态库与动态库生成与使用
在实际编程中,会用到第三方或开源的软件库,也会以库的形式向第三方提供功能模块。对于高级工程师来说,熟练掌握库的生成与使用至关重要。
1.1.13 事件驱动与状态机
作为一个软件来说,无论是客户端、还是服务端,一般都是使用状态机与事件驱动模型来实现的。深入理解状态机与事件驱动的架构是成为高级工程师或软件架构师的必修之课。
二、 常用命令
2.1 scp
-
scp拷贝本地文件到目标机器
-
scp从目标机器拷贝文件到本地
2.2 netstat
查看监听的端口和连接的状态
2.3 ping
判断目的IP是否可以连通,是排查网络问题的重要手段
2.4 ps/kill/killall
查看进程状态及杀死进程
2.5 tcpdump
抓取网络报文,是linux设备或系统调试网络程序的法宝
2.6 cp
拷贝文件
2.7 mv
移动文件
2.8 cat
在不打开文件的情况下,查看文件内容,查看部分内容可以使用more/less。使用cat可以快速查看文件 内容
2.9 wc
用于统计一个文件中的行数、字数、字节数或字符数
2.10 sed
替换文件内容
2.11 awk
文本分析
2.12 ifconfig
查看网卡状态及配置网卡地址等
2.13 find
查找文件(可以按时间、目录等)
2.14 chmod
改变文件权限
2.15 chown
改变文件属主
2.16 rm
删除文件
2.17 tar
将文件/目录归档打包
2.18 grep
在文件中查找指定的字符串
三、 wireshark
用于分析网络报文协议,号称网络工程中的瑞士军刀,是软件工程师必备的技能
四、 man page
manpage是linux /unix 环境下命令与函数的帮助文档。对于没有网络或保密限制无法访问外网查询函数接口和参数使用时,man page是程序员的救命稻草。
五、vim编辑器
在linux终端编程时,vim是最好用的编辑器
六、git版本控制
常用的版本控制工具有git和svn,git使用更方便,管理代码更优秀。现在代码管理基本都转向git了, 掌握git的常用命令对于软件开发会起到有事半功倍的效果。
七、Makefile&&make
Makefile是linux下代码工程管理工具,掌握Makefile的使用是构建大型软件工程的必要工具。
八、sourceinsight
linux c程序一般在linux服务器上编译,使用vim编辑器编写代码效率较低,程序员一般更愿意在windows下编写代码.
九、secureCRT
用来远程连接linux服务器
十、beyond compare
对比文本或二进制,可以协助快速找到代码或文件差异,加快问题定位和分析
十一、bash脚本编程
将重复命令操作写成脚本,提高效率
十二、notepad++
查找或编辑文本
十三、tcp/ip协议
tcp/ip协议包含一系列的协议,熟练掌握对于开发网络程序或分析网络问题尤其重要
十四、算法
算法对于一般的应用程序开发来说,使用的不多。程序员掌握冒泡、选择的基本实现就已经足够。
十五、C++
C++是由C发展而来,对于纯linux c开发来说,使用的不多。但需要掌握C++的基本语法,能够看懂别人写的代码并作相应的扩展。
十六、word&excel
软件工程师在实际工作中,一般需要写设计文档,也需要用表格设计测试用例,掌握基本的word和excel技巧非常有必要
十七、英文文档阅读
能够阅读rfc英文文档或其它英文说明资料即可,要求不高
十八、数据库mysql/sqlite(增删改查)
大多数软件都会涉及到数据库,服务器上mysql使用的比较多,而对于linux嵌入式设备,一般使用sqlite. 无论哪种数据库,程序员都需要掌握基本的数据库操作指令
十九、运程控制软件teamviewer/向日葵
现在远程办公比较多,熟练使用远程控制软件也是重要技能之一
二十、samba
linux服务器或虚拟机开启samba共享供windows用户访问的应用,对于程序员开发也是常用场景
二十一、代码规范
掌握C的编码规范(缩进、对齐等), 可以使程序更具有可读性或美观性。也可以使审查代码更快速,能够在一定程序上减少编码错误
二十二、架构思想
想成为高级工程师,需要有一定的架构思想和软件设计能力。要经常理解开源软件的架构设计来提升架构思想并用于软件开发实践