文档章节

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

清风伴月
 清风伴月
发布于 2017/06/01 08:20
字数 3314
阅读 20
收藏 0
点赞 0
评论 0

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

简单介绍一下开发背景:

我们的业务对外是一个http的服务,开发主要是服务器端开发。
编程语言:基本以C++/Java为主,有少量的perl, shell的脚本
程序发布,部署方式:通过 ABS 来打出rpm包,放到公司内部 yum 源,然后通过 金字塔 来进行自动化发布的

熟悉Linux操作

任务管理

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

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

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

开发环境搭建

我们这边操作系统都是Red Hat Enterprise Linux 5,机器都是X86架构64位机器。这边代码文件默认都用GBK的编码

  1. 登录机器的配置
    集团的跳板机,ssh的配置是会在一段时间不操作之后自动断掉的,而且每次登录上去都需要输入密码+token,利用ssh的ControlMaster,就可以解决,方法见我的ssh配置

    在linux下,有很多窗口管理器,可以在一个窗口里进行多个独立的会话[不需要开多个终端],进行会话恢复[即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制],推荐screen

    默认的screen配置有些蹩脚,而且跟shell快捷键有些冲突。配置好了之后界面显示就很强大了,可以参考我的screen配置
    对应上述配置的screen快捷键:
    Ctrl+j,c 创建新会话
    Ctrl+j,d detach

  2. GNU工具链

    在刻的操作系统里已经有了,常用的是:
    * GNU make: 编译(compile)和构建(build)的自动化工具
    * GNU 编译器集合:GCC
    * GNU 二进制工具:包含链接器(linker),汇编器(assembler)和其他工具

  3. 代码编辑

    我一开始使用的vim,基本不安装什么插件,后来投入了emacs的怀抱,主要是emacs,eshell和gdb搭配起来,不仅能够满足我的日常需求,而且让我感觉效率大大提升,而且emacs环境安装也比较简单。但是在咋们公司的服务器上,vim是标配,emacs需要自己装。用习惯了emacs,再切回到vim时,好多快捷键都忘了,十分痛苦!

    Vim新手入门资料和一些Vim实用小技巧

    Linux环境下shell和vim中乱码原因及消除办法 新手经常被乱码问题困扰,这篇文章探究了一下shell和vim中乱码原因及解决办法

    emacs安装及使用 ,现在这里挖个坑吧,后续有时间再写

    如果在Windows下看代码,推荐Source Insight,非常好用,谁用谁知道。

代码版本管理

目前直通车这边代码版本管理使用svn
常用命令:

  • 查看本地代码做了哪些改动
    svn st -q

  • 提交代码
    svn ci filepath/ -m "svn comments"

  • 查看另个版本之间的改动有哪些
    svn diff -r r1:r2
    svn diff -r r1:r1 --summarize #此命令是摘要模式,只展示哪些文件改动,不展示具体的文件内容diff

  • 创建分支
    svn cp http://destpath/trunk http://destpath/branches/my-branch/ -m "create branche for xxx"

  • 合并分支代码到主干
    __svn merge -r 14829:HEAD my/branch http://path/to/trunk__

    上述命令表示把本地的my/branch所代表的svn路径的14829到最新版本的代码,merge到http://path/to/trunk路径下。如果是正常拉出来的分支,也可以不加版本参数,svn能自动计算出分支的起始版本号
    新人合并代码的时候一定要注意一下,提交之前再确认下合并的代码是否OK,如果有不明白的地方,多请教师兄

  • 查看某段代码最后是谁改的
    svn blame filename

  • 更新指定文件到某个指定的版本
    svn up -r rev file

  • 撤销某文件本地的改动
    svn revert file #这条命令要谨慎使用,使用之后自己的改动就找不回来了

  • 解决冲突的命令
    如果svn merger后提示:
    local add, incoming add upon merge
    用如下命令来采纳本地的修改来解决:
    svn resolve --accept working -R [--recursive]

在Mac下,推荐使用图形界面的Meld来作为svn的merge工具,可以很方便的处理冲突,减少合错代码的可能性

开发[被测试戏谑为写bug的阶段]

开发之前,最好了解如下这些东东:

  • Makefile 用来完成自动化编译的东东

    相关资料可以参考陈皓写的跟我一起写 Makefile系列,网上可以搜到热心网友整理的pdf版本。看完前面4章就够用了,后面的章节可以在遇到疑惑的时候再去查阅。
    可以通过以下几个常见问题来检验自己有没有理解整个工程的Makefile
    1. 如何修改Makefile来编译出带/不带gdb调试信息的版本
    2. 如何去掉/加上编译器优化选项,如-O2参数
    3. 新加入头文件(一般都是.h结尾的),源文件(一般都是.cpp结尾)后,如何在Makefile中加入相应的规则。新加入的这个文件可能最终是放到静态库.a里面,也可能是放到动态库.so里面,也可能是直接生成可执行程序的

    一般都不直接写makefile,而是使用cmake(cross platform make)来生成makefile,然后再按照make的方式构建软件。

    进阶读物:
    如何调试Makefile变量

  • 关于静态库和动态库

    需要了解的东西有
    1. What: 什么是静态库,什么是动态库
    2. How: 如何生成静态库,动态库
    3. Why: 静态库和动态库的差异,什么情况下使用静态库,什么情况下使用动态库
      以上问题都可以在LibraryArchives-StaticAndDynamic,shared libraries里得到解答

参考资料:

  1. 菜鸟在C语言编译,链接时可能遇到的两个问题

  2. 编程大牛云风推荐的书 <<程序员的自我修养--链接、装载与库>>

  3. 编程大牛老赵推荐的书 <<深入理解计算机系统>>书很厚,可以挑着看自己关心的章节

  • GNU编译工具GCC

    至少需要知道一些常用的选项参数:
    1. 定义输出文件的名称
    2. 产生gdb调试的信息
    3. 控制代码优化级别
    4. 只进行预处理过程 可以帮助调试一些宏定义/头文件包含产生的问题
    5. 只进行编译过程
    6. 只进行链接过程

    可以通过man gcc来获得上述问题的答案,也可以自行google,google被墙了可以用这个ask

  • GNU调试器gdb
    程序执行结果错误怎么办?单测过不了怎么办?线上出Core了怎么办?别着急,GDB来帮你忙。

    新手如何在gdb中存活 通过一个小例子来让新手快速上手,搞会了里面的内容,就基本够用了

    GDB中应该知道的几个调试方法

    一些我搜刮到的gdb命令[会持续更新进来,欢迎大家回复]:
    • 查看指针数组中的内容 __p /x *address@len__ 以16进制方式显示address开头的len个元素
    • 通过gdb启动程序后,如何调试fork出来的子进程:set follow-fork-mode child

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

    进阶读物:

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

多线程支持

目前直通车这边多线程机制使用的都是POSIX Theads

对于POSIX Theads,需要了解:

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

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

查找/替换字符串/查找文件/文本处理

  • 想查找某个宏/函数的定义怎么办?

    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的命令行神器

关于单测(unit test)

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

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

编译(compile),构建(build)

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

代码review

UI界面:reviewboard,提交的时候使用 rbt命令
rbt post r1 r2 来提交r1和r2这两个版本之间的diff做为code review
提交之后可以得到一个reviewboard地址,然后需要在这个地址里填上codereview的人员和相关的描述等

持续集成CISE

CISE为用户提供自动化的环境部署和测试服务
这块儿每个公司使用的都是不同各地

安装包

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

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

使用如下命令安装:

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

-b 参数用来指定当前安装包t-imatch-kgb-updated在test分支还是current分支里面
上线时候的包必须转成current

本文转载自:

共有 人打赏支持
清风伴月
粉丝 1
博文 129
码字总数 255659
作品 0
海淀
程序员
Linux C++、Boost、ACE ......

Linux/UNIX、C++、Boost、ACE、Shell ...... Linux/UNIX C++高级培训---远程班 培养目标:Linux/UNIX C++高级软件工程师 专注Linux/UNIX服务器端的软件开发(后台开发),培养企业所需的专业...

athxy
2010/04/01
0
1
C语言/C++编程学习强势之处的体现

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/12
0
0
九爷带你了解 zabbix 特点及功能 简写

本篇文章 主要了解 zabbix 特点以及主要功能 Zabbix主要特点 - 安装与配置简单,学习成本低 - 支持多语言(包括中文) - 免费开源 - 自动发现服务器与网络设备 - 分布式监视以及WEB集中管理功能...

李伟铭k
07/09
0
0
C/C++要学什么东西?C/C++学完能干什么?学了又能当饭吃吗?

前言 普遍问题 学校的课程设计不完善,涉及面广,什么都不深入。 老师缺乏实际的工作经验,比如说我经常看到老师经常教学生做数学题之类的小程序,但是,实际工作中,我们并不玩这个。 在我看...

这个人很懒什么都没留下
07/17
0
0
什么是 C 和 C ++ 标准库?

简要介绍编写C/C ++应用程序的领域,标准库的作用以及它是如何在各种操作系统中实现的。 我已经接触C++一段时间了,一开始就让我感到疑惑的是其内部结构:我所使用的内核函数和类从何而来? ...

oschina
04/10
0
0
计算机C语言/C++编程学习:和QT零距离接触的意义是什么

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
06/04
0
0
【Git入门之一】Git是神马?

1.Git是神马? 一个开源的分布式版本控制系统,可以有效的高速的控制管理各种从小到大的项目版本。他的作者就是大名鼎鼎的Linux系统创始人Linus。 2.分布式又是神马? 先看看集中式。简单说来...

yangxiaoxiao
2014/01/05
0
0
C语言/C++编程学习:和QT零距离接触的意义

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你学知识
06/12
0
0
QT平台的手持媒体播放器项目如何去做?

一、本课程是怎么样的一门课程 1.1、课程的背景 Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务...

我是小北
2013/12/31
0
0
在 Linux 平台中调试 C/C++ 内存泄漏方法

由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误。同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的 后果。从历史上看,...

Dicky
2011/09/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway 接口文档聚合实现

在微服务架构下,通常每个微服务都会使用Swagger来管理我们的接口文档,当微服务越来越多,接口查找管理无形中要浪费我们不少时间,毕竟懒是程序员的美德。 由于swagger2暂时不支持webflux 走...

冷冷gg
36分钟前
16
0
流利阅读笔记30-20180719待学习

1.今日导读 2.带着问题听讲解 3.新闻正文(中英文对照) 4.重点词汇 5.拓展内容

aibinxiao
38分钟前
1
0
OSChina 周五乱弹 —— 我们是食物链的最底层

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @温家成 :分享谢安琪的单曲《姿色份子》 《姿色份子》- 谢安琪 手机党少年们想听歌,请使劲儿戳(这里) @贪吃飒:最近p2p怎么了、半个月爆了...

小小编辑
52分钟前
7
1
Android Studio 3.0 之后打包apk出现应用未安装问题

1、废话 出现这个问题的原因,并不是只有一个,而是有多个原因,不懂的估计会被搞得一头雾水,下面我列举的是我遇到的几种问题和网友遇到的几种问题,但不一定是全部,也有可能有些莫名其妙的...

她叫我小渝
今天
0
0
前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
9
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部