17611538698
webmaster@21cto.com

Linux下服务器端开发流程及相关工具介绍(C++)

资讯 0 13427 2017-04-17 12:00:57
去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路线图,帮助新人尽快上手。

本文介绍的我所在小组的一些开发流程及相关工具。做为新人入门手册,其中某些工具可能只有我们这边在用,但对于其他公司的新人来说,一样是具有指导意义的。

2015.4.11 更新:

  1. 增加构建工具 Bazel, CMake介绍
  2. 增加Linux下任务管理相关命令
  3. 增加正则表达式调试的网址

简单介绍一下我们组的开发背景:

我们的业务对外是一个http的服务,开发主要是服务器端开发。

编程语言:基本以C++/Java为主,有少量的perl, shell的脚本

程序发布,部署方式:通过ABS 来打出rpm包,放到公司内部yum 源,然后通过金字塔 来进行自动化发布的

[h2]熟悉Linux操作[/h2]
[h3]任务管理[/h3]
有时候你在命令行里执行拷贝大文件的命令,这个命令很耗时,会独占终端,此时可以先使用Ctrl+z 命令让当前任务(job)挂起,此时可以输入命令了,然后使用bg 命令让当前挂起的任务去后台(background)运行。

利用jobs 命令可以查看当前在后台运行的程序及job-id,然后想让它到前台来运行,可以执行fg [%job-id] 来让它恢复到前台执行

如果想kill掉当前在后台运行的某个任务怎么办?使用kill %job-id

[h2]开发环境搭建[/h2]
我们这边操作系统都是*address@len__ 以16进制方式显示address开头的len个元素
[*]通过gdb启动程序后,如何调试fork出来的子进程:set follow-fork-mode child

直通车这边的服务基本都是多进程的模型,首先启动一个daemon父进程,然后再fork出多个执行业务逻辑的子进程。如果子进程挂掉,父进程会重启一个子进程。
[/*]
[/list]
进阶读物:

陈皓的 用GDB调试程序系列, 介绍的非常详细,全面

[/list]
[h2]多线程支持[/h2]
目前直通车这边多线程机制使用的都是POSIX Theads

对于POSIX Theads,需要了解:

  1. What:什么是thread,pthread
  2. How: 如何使用pthread
      如何编译多线程程序
    • 如何创建/结束线程
    • 如何等待子线程返回(join/detach)
    • 多线程之间如何使用互斥锁(Mutex)来同步、加锁、避免竞争条件的出现?
  3. Why: 为什么使用pthread,而不是其他

以上问题,都可以在这个美国劳伦斯利弗莫尔国家实验室的pthead教程里面找到答案

[h2]查找/替换字符串/查找文件/文本处理[/h2]
  • 想查找某个宏/函数的定义怎么办?grep -r --include=*.{cpp,h} NGX_HTTP_VAR_INDEXED src/本命令的意思是在src目录下,以递归的方式在.cpp或者.h结尾的文件里查找NGX_HTTP_VAR_INDEXED这个字符串
  • 想找某个模糊记得名字的文件怎么办?__find ./ -iname "*util.h"__本命令意思是在当前目录下,基于忽略大小写的文件名称来查找文件,文件名称是正则表达式 *util.h关于正则表达式,我只看deerchao的这个文章:正则表达式30分钟入门教程另外有一个web应用regexr特别好使,可以帮助我们调试正则表达式
  • 文本处理流式编辑器 sed例如替换某字符串:sed -i 's/oldvalue/newvalue/g'关于sed,可以看酷壳上的sed 简明教程文本处理语言 awk关于sed,可以看酷壳上的AWK 简明教程

进阶读物:

  1. 应该知道的Linux技巧
  2. 28个Unix/Linux的命令行神器

[h2]关于单测(unit test)[/h2]
单测十分重要,它能够让你对你的代码更加有底气和信心,而且能够帮助你更早的发现问题,解决问题。在开发的各个阶段,问题发现的越晚,解决问题的成本就越大。这边C++的单测都用的Google的gtest框架,即使之前不了解gtest框架,看着别人的代码照猫画虎也可以写出单测来,但是最好去看一下gtest官方文档,去全面了解一下gtest,去拓展一下自己的思维。

写着写着代码,就发现自己的代码越来越复杂,不容易阅读,设计混乱怎么办?可以参考这本巨著:

<<代码大全第二版>>

[h2]编译(compile),构建(build)[/h2]
  1. 编译之前的准备工作需要把编译依赖环境搞定,基本就是装好编译依赖的包就可以了。可以在rpm目录下找到对应的spec文件,然后使用t-abs 命令[用于本地调试spec文件和自动部署编译环境],来帮助我们装好编译依赖的包,即spec文件中的BuildRequire 部分指定的包关于rpm和spec文件,可以通过阅读这篇来了解:How to create an RPM package
  2. 编译找到对应工程的Makefile,然后执行make命令,就可以编译构建工程了由于make本身的灵活性,而Makefile的可读性又不强,是以文件为单元,抽象层次不够,Google开发了分布式的构建系统Bazel,能够把程序员从make的语法和文件级别的构建上解放出来。Bazel相关资料有:Google Blaze原理及 Bazel的使用方法介绍

目前我们这边目前还在用RPM来进行包的管理

  • 平常需要用到的rpm命令有:
      rpm -qf file-name 来查看某个文件到底是哪个rpm包里面的
    1. rpm -qi package-name 来查看这个rpm包相关的信息,比如打包时间,svn地址等
    2. rpm -ql package-name 来查看这个rpm包中到底有哪些文件
    3. rpm -qV package-name 来验证这个rpm包安装后的文件有没有被修改过, 在怀疑rpm包的配置/脚本被人修改过的时候非常有用

[h2]代码review[/h2]
UI界面:reviewboard,提交的时候使用 rbt命令
rbt post r1 r2 来提交r1和r2这两个版本之间的diff做为code review

提交之后可以得到一个reviewboard地址,然后需要在这个地址里填上codereview的人员和相关的描述等

[h2]持续集成CISE[/h2]
CISE为用户提供自动化的环境部署和测试服务

这块儿每个公司使用的都是不同各地

[h2]安装包[/h2]
对于构建出来的rpm包,使用yum来安装。

淘宝rpm包查询UI 这里可以查看到淘宝yum源里面现存的各个包版本 可以从里面看到对应包的abs地址

使用如下命令安装:

sudo yum install -b test t-imatch-kgb-updated

-b 参数用来指定当前安装包t-imatch-kgb-updated在test分支还是current分支里面

上线时候的包必须转成current


如果您看了本篇博客,觉得对您有所收获,请点击右下角的“推荐”,让更多人看到!

资助Jack47写作,打赏一个鸡蛋灌饼钱吧

微信打赏

支付宝打赏

评论