UNIX/Linux C 程序员需要掌握的七种武器

  • 时间:
  • 浏览:1
  • 来源:大发时时彩代理—大发大发彩票app

(五)操作系统及CPU体系型态

作为一名C系统程序运行运行员,熟练掌握C语言是最基本的一项技能。关于如何学好C语言,以及C语言话题的讨论,网上有没法来不多没法来不多没法来不多没法来不多经典的文章,让我不一一列举了。在这里,我只想谈或多或少我此人 的体会:刚毕业时,我来到一家比较大的软件公司工作,而公司的工作模式是每此人 只负责另有一一还还有一个小模块。原来工作两年后,我自认为我的C语言水平可能很高了。但是,我来到现在这家公司。可能工作才能,接触的东西也多了,开源项目也了解或多或少,才发现此人 的C语言能力太一般了:原来宏才能原来写,指针才能原来用…等等。现在我在写代码时,常常会想:这一 行为是C语言规范定义的吗?可能是,是C89还是C99?我现在用的编译器支持吗?可能也有C语言规范定义的,没法在系统程序运行运行运行的这一 平台,行为是选折 的吗?没法来不多没法来不多没法来不多没法来不多我建议朋友 平时才能多想想哪些地方地方间题,查查资料,相信也有对C语言有更深的理解。

DTrace是由Sun的几位才华横溢的工程师开发的,最开始英文英文只支持Solaris操作系统,现在FreeBSD和Mac OS X也都支持了。Linux上这类的工具有SystemTap,也一帮人把DTrace移植到Linux上,不过效果似乎无须好。简单地说,DTrace才能几乎不让在对整个系统有任何性能影响下,让我了解你的系统程序运行运行所指在的一切。这对分析系统程序运行运行的热点(“Hot spot”),了解系统程序运行运行的执行流程,定位系统程序运行运行bug也有很大的帮助。或多或少但是,DTrace可能是你唯一的工具。举例来说,有个系统程序运行运行只指在在生产环境,而在实验室环境无法复现(当然,理论上任何bug才能复现,但是朋友 没法找到复现条件。)。你可能在你怀疑的代码打上断点,而且用gdb去调试。这时你才能借有利于DTrace,通过它去了解系统程序运行运行到底是如何运行的,当时的变量值是哪些地方。此外,DTrace才能帮你了解操作系统的kernel,这会满足没法来不多没法来不多没法来不多没法来不多geek的好奇心。

a)网络协议。在日常的工作中,朋友 接触和使用最多的无疑是TCP/IP协议族。此外,可能工作领域不同,也可能用到其它的协议。比方说,我主要做电信相关的系统程序运行运行开发,平时可能接触SCTP协议会更多或多或少。对于哪些地方地方协议,觉得掌握最基本的知识是才能的,其它的边边角角知识才能等到用时再查。举例来说,TCP协议的“三次握手”,“四次挥手”,“TIME-WAIT请况”哪些地方地方基本的知识点要弄明白,其它的边角知识学完老不让忘得也快,还是用时google一下速度更高。

(七)DTrace/SystemTap

(三)网络编程及相关知识

以上但是我总结的UNIX/Linux C 系统程序运行运行员才能掌握的“七种武器”,一齐也很感谢你能耐心地读完这篇文章。可能这篇小文没法让觉得浪费时间,但是对你有哪怕或多或少小小的帮助,我的目的也就达到了。可能你有或多或少好的观点,也非常欢迎你能分享出来。谢谢! 

(一)C语言

除了操作系统,了解CPU的体系型态也是一门必修课。比方说,SPARC CPU要求字节对齐,而X86 CPU则没法这一 要求。又比如SPARC CPU是大端模式,而X86 CPU是小端模式,这就要求你对像位域原来的定义要格外小心。你才能了解你使用的CPU的汇编语言,大慨 能大慨 看懂。可能或多或少但是,当你从C代码中找没法了bug的愿因时,就才能你“透过间题看本质”,从汇编代码层面看看得人底指在了哪些地方。

“工欲善其事,必先利其器”。编译器负责把源代码生成可执行文件,而调试器则是在系统程序运行运行老要再次出现bug时,用来“降妖除魔”的不二神器。我会以我最熟悉的gcc和gdb为例子,来谈一下此人 体会。

gcc有没法来不多没法来不多没法来不多没法来不多编译选项,除了要熟悉像-O,-g哪些地方地方最基本的选项,我建议朋友 才能多了解或多或少其它不常见的选项。可能哪些地方地方选项很可能帮助朋友 找到系统程序运行运行的或多或少bug。举个例子,在比较新的gcc版本里,增加了-fstack-protector这一 选项,而它才能帮助朋友 检查到缓冲区溢出这一 bug。此外,你还可能碰到这一 请况,另有一一还还有一个bug老要指在在系统程序运行运行优化后的版本,而不让老要再次出现在没经过优化的版本。没法来不多没法来不多没法来不多没法来不多,多了解你的编译器,你就才能更好地了解你的系统程序运行运行是如何生成的。

(六)编译器和调试器

一提到脚本编程,朋友 首先想到的可能但是Bash shell脚本编程了。不错,在Unix/Linux上,Bash shell朋友 说但是用的最广泛的脚本编程语言。我平时主要用Bash shell做另有一一还还有一个方面的工作:a)用于编写监控服务脚本;b)写或多或少简单的单元测试脚本,比如循环发或多或少命令,等等。而且Bash shell的功能远远要比哪些地方地方强大。我见过或多或少高手用Bash shell编程语言写出了很好玩的游戏,也一帮人做出了很cool的网络应用。没法来不多没法来不多没法来不多没法来不多建议朋友 有兴趣才能多了解一下Unix/Linux的这层“壳”。当然,你但是后选折 学习Python、Perl、Ruby等。不过相比哪些地方地方语言,Bash shell大慨 你不让此人 去安装,而且它能做的事同样很强大。

另有一一还还有一个系统程序运行运行员可能不碰到bug,而这一 但是,调试器但是最好的工具。才能说,在遇到bug时调试技巧和手段否是 充裕是衡量另有一一还还有一个系统程序运行运行员的能力和水平的重要参考。除此以外,gdb原来重要用途但是分析系统程序运行运行的core dump文件。我此人 很喜欢看破案和推理的电视节目。觉得系统程序运行运行的core dump文件才能比作“犯罪现场”,而gdb但是公安人员用来在现场提取线索的工具。对gdb越熟悉,就越能从core dump文件提取有价值的信息,也就越有有利于朋友 定位到系统程序运行运行bug的“root cause”。

c)协议分析工具。TCPdump、snoop(Solaris平台工具)、wireshark等哪些地方地方工具不仅能帮助朋友 抓取数据包,还能分析数据包,这对debug网络系统程序运行运行有非常大的帮助。没法来不多没法来不多没法来不多没法来不多,朋友 大慨 要掌握哪些地方地方工具最常用的功能。此外,对于开放源代码的工具,朋友 更是才能从代码中学到没法来不多没法来不多没法来不多没法来不多知识。举例来说,我做短信相关的项目,就从wireshark的分析短信协议的代码里学到了没法来不多没法来不多没法来不多没法来不多东西,这使我对短信协议有了更清晰的理解。

b)Socket编程。Socket编程的经典书籍或多或少不比讲系统编程的书薄,全才能选一本相对薄点,口碑不错的精读一下,原来基本就掌握的百分之五、六十了。另外有时间还是看一下经典的开源代码。这里还拿Redis举例,Redis里关于除理网络连接和通信的代码量不大,而且基本所含了所有常见的UNIX平台,看得人但是一定受益匪浅。

朋友 说有一天,让我碰到原来的情景:你的系统程序运行运行在Solaris上会指在core dump,在Linux上却运行的好好的。经过一番艰苦的debug,最后得到的愿因是有某种操作系统对系统程序运行运行的调度策略不一样,这会使另有一一还还有一个对全局变量没法加锁就访问的bug在Linux上不能自己老要再次出现。没法来不多没法来不多没法来不多没法来不多你才能尽可能地去了解你使用的操作系统,原来无论对写系统程序运行运行还是debug也有有很大的帮助。比如,你才能了解系统程序运行运行的内存布局,原来你就知道栈和堆到底在内存的哪段空间,为哪些地方内存写越界有也有core dump,有时没事。

关于网络方面,我想从以下三点分享一下我的体会:

在UNIX/Linux系统上开发系统程序运行运行,掌握系统编程API是必不可少的技能。而这方面的经典书籍也有或多或少大部头的英文著作,让我望而生畏。在这里,我谈或多或少此人 的建议:觉得才能先找一本口碑不错的中文书先看一下,了解一下也有哪些地方种类的API。原来但是用到时,再去精读经典英文著作里的相关章节,或是查man手册。此外,觉得可能有时间,才能学习一下经典的开源项目,了解哪些地方地方开源项目是如何使用哪些地方地方API的。举个例子,Redis是没法来不多没法来不多没法来不多没法来不多人推荐的另有一一还还有一个很不错的学习C语言的开源项目。我在阅读代码时,看得人保存数据到文件也有用到fsync函数,让我会去深入地了解一下这一 函数的作用。原来比单纯地去看哪些地方地方著作效果要好。

(四)脚本编程能力

我是一名普通的软件工程师,也有哪些地方技术大牛。这篇文章所提到的“七种武器”但是我哪些地方地方年工作经验的或多或少体会和感悟,可能有错误的地方,还请朋友 指正。

(二)UNIX/Linux系统编程