C++奇技淫巧之访问private变量

17 Aug 2018 | C/CPP, 奇技淫巧 |

众所周知,C++中private成员只能在类内部访问,就算是继承也无法直接访问到。想在其他类/函数中访问private成员,几乎只能通过友元(friend)实现。由于友元是侵入性的,当你引用了第三方类库,又不能对其修改时,就没法利用友元了。

然而,C++作为世界上拥有特性最多的语言,特别是指针、模板等怪兽级特性,成为了许多人拿来挑战其中条条框框的武器,private禁咒也被各种形式突破。下面盘点一下访问private成员的各种奇技淫巧。

Continue Reading →

记一次时间戳导致的编译失败

16 Aug 2018 | 编译, Bug |

背景

最近接手一个老项目,项目结构大体示意如下:

project
    ├── packaging
    │   ├── Makefile
    │   └── project.spec
    └── src
        ├── knot-2.3.1
        │   ├── aclocal.m4
        │   ├── ar-lib
        │   ├── compile
        │   ├── config.guess
        │   ├── config.sub
        │   ├── configure
        │   ├── configure.ac
        │   ├── depcomp
        │   ├── install-sh
        │   ├── libtap
        │   ├── ltmain.sh
        │   ├── m4
        │   ├── Makefile.am
        │   ├── Makefile.in
        │   └── missing
        └── Makefile

项目目录中包含了第三方的项目knot-2.3.1(knot是什么不重要,重要的是它用了autotools)。src目录下的Makefile中,调用了knot的编译流程:

src/Makefile:

knot:
	cd ${KNOT_DIR}/..; \
	./configure; \
	make

位于packaging下的Makefile是用来生成rpm安装包的,部分内容如下:

packaging/Makefile:

all: rpm

rpm: $(TARBALL)
	@mkdir -p {BUILD,BUILDROOT,SRPMS,SPECS}
	@rpmbuild --define "_topdir ${PWD}" --define "_sourcedir ${PWD}"  \
	--define "buildroot ${PWD}/BUILDROOT" --define "_rpmdir ${PWD}" -ba ${SPECFILE}

$(TARBALL):
	@rm -rf $(PKG_NAME)-$(PKG_VERSION)
	cd ${PROJ_ROOT}/.. && git archive --format=tar --prefix=/ $(TAG) src | gzip >packaging/${TARBALL}
	@rm -rf $(PKG_NAME)-$(PKG_VERSION)

由于项目是通过git进行版本控制,这里通过git对项目的src目录进行打包,然后运行rpmbuild编译成rpm包。

按道理说,在packaging目录下编译和在src目录下编译,出了是否打包成rpm之外,都是完全一样的。然而,实际操作后发现,在packaging下可以正常编译,而在src目录下运行make会报一个错误:

/project/src/knotdb/knot-2.3.1/missing: line 81: aclocal-1.15: command not found
WARNING: 'aclocal-1.15' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>

Continue Reading →

记一个asio实现代理功能的设计思路

23 Jul 2018 | C/CPP, asio |

问题描述

最近在设计一个类似shadowsocks的小东西,在写local部分的时候,考虑了一下这个问题。这个设计场景非常简单:local proxy监听本地端口,一旦有client连接,则会创建一个对远端固定server的连接,将client的数据经过加密后,转发到server上;同时,从server上收到的数据,也会经过解密后转发给client。

Continue Reading →

char类型的一个小坑

06 Dec 2017 | C/CPP |

我们知道,在C中,整数类型(short,int,long)分为有符号和无符号两种,以int为例,单纯一个int代表有符号整型signed int,这里signed可以省略;无符号整型需要显示指明unsigned int

然而char是个例外。当然,C语言中,字符类型也分signed charunsigned char,然而单写char的时候,究竟是有没有符号的?答案是不确定。

Continue Reading →

DPDK non-EAL线程环境下的使用

13 Nov 2017 | DPDK |

最近群里有人问,在non-EAL环境下使用DPDK有什么不同。自己对这一部分的实现原理了解的也不多,所以查找、总结了一下DPDK中的lcore实现原理。

首先,关于non-EAL,并不是说整个程序完全不使用EAL(这样的话几乎所有DPDK功能都不可用)。程序本身还是要执行rte_eal_init()来对EAL初始化,通过参数-l-c或者--lcores来指定使用哪些cpu lcore,在每一个管辖的lcore上绑定一个线程待命,这些线程由EAL管理,即为EAL线程。除此之外,也可以手工利用pthread运行新的线程,这些线程不受EAL控制,就是所谓的non-EAL线程。由于EAL线程与lcore的绑定关系,很多地方用lcore指代其上的EAL Thread。

Continue Reading →

博客还是不能丢的

12 Nov 2017 | 生活, 博客, 随笔 |

一年多没更新了,这不是我想要的。

这段时间发生了太多的事,颓废过,也迷茫过。朋友圈基本上没更新,算是在很多人眼里“消失”了;心情最复杂的时候,在微博里写了两个不知所云的打油诗;知乎继续骗赞,收藏夹大小从100长到了500。不得不说,知乎虽然水答案的人越来越多,但是依旧是高质量文本最多的社交网站,可以说是我这两年精神能量的最大来源了。也慢慢的接触到了各种群体,接触到了和自己情况一样的一些人,孤独感减少了很多。有句话深得我心:

祈求上天赐予我平静的心,接受不可改变的事;给我勇气,改变可以改变的事;并赐予我,分辨此两者的智慧。

于是,座右铭改成了:

纵然是个loser,也要做个积极向上的loser!

我也知道了有些仗注定打不赢,敌人强大到全世界没人打得赢。但是还是要亮剑啊……

不过总的来说,生活明朗了许多,临近毕业了,期待第一份工作,期待未来的转机。

荒废这么久,现在域名已经到期,多说已经坚持不住挂掉了。去Godaddy续了费,又用友言代替了多说(感觉uyan还是撑不久的样子,没办法disqus国内被墙,Coding-comments这种又非要注册,我的读者不能全都是程序员吧)。

不知不觉26岁了……开始和朋友讨论中年危机……

努力活下去吧,生活还是挺精彩的

Continue Reading →

1 2 3