terrycpp

C++博客 首页 新随笔 联系 聚合 管理
  13 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

2011年10月3日 #

坏毛病啊,又把这块地荒废了这么久,特回来除除草。
感谢老板的出国,让我有机会在大大小小的公司实习了一年,收获了许多。又到了找工的季节,由于实习公司给了offer,就没怎么折腾了,留广州选择也不多,笑看各大侠数offer哈!
第一份实习是在一个银行相关的单位做后台开发,工资低得可怜,工作强度也不大,收获是熟悉了一些东西。结束后紧接着到了第二家公司做手机客户端开发,这次纯属酱油:测试,写文档,就是接触不了想做的东西。混两个多月后通过了某外企的两轮电面,去了深圳实习半年。虽然不是做开发,却是最锻炼我的一次。不熟悉且广阔的领域,让我半年来都持续地地在接触新东西,感觉解决问题的能力大有提高。
由于个人原因,重新回到了广州实习,做后台开发。由于人手比较紧缺,让我幸运地负责一个模块,导师观察了几天后就放心让我一个人搞定了。一切都很顺利,产品也上线了,小小的成就感也来了。
稍微总结下优缺点。
优点:
1.所关注领域技术还算熟练。
2.解决问题能力不错。
缺点:
1.虽然忙的时候能专注干活,但稍微闲下来就喜欢偷懒。
2.工作之余就没读过书了。
3.不更新博客。
posted @ 2011-10-03 23:39 terrycpp 阅读(176) | 评论 (0)编辑 收藏

2011年1月8日 #

Today I came across a problem about apt-get update.
E: Could not get lock /var/lib/apt/lists/lock - open (11 Resource temporarily unavailable)
E: Unable to lock the list directory

This is because another process like synaptic or update had quit without clean the lock.
So .. There will be two ways to solve the problem.
1.If the process mentioned above quited without reboot,
just $ps -e |grep apt
and then.. kill them.
2.Remove /var/lib/apt/lists/lock directly..

There is no Chinese input method in my PC currently,
so..
Welcome to the English world,and improve my poor English..

posted @ 2011-01-08 23:44 terrycpp 阅读(259) | 评论 (0)编辑 收藏

2010年12月2日 #

决定去一家外企实习,但不是搞开发的。
对自己的一次考验,搞得好大有裨益,搞不好就如无头苍蝇了。
这次实习不管接触什么,要深入研究。
在公司可能锻炼不了编码能力,晚上做毕设的时候好好给力吧!
posted @ 2010-12-02 22:46 terrycpp 阅读(162) | 评论 (0)编辑 收藏

2010年11月8日 #

原文出自javaeye robin,http://robbin.javaeye.com/blog/261176

对大多数不从事Linux平台C语言开发的人来说,GNU gcc的一套工具和Linux平台的共享库的使用还是十分陌生的,其实我也不太熟悉,姑且写点基础知识,权当做备忘吧。

一、GNU gcc的编译工具用法 

我们先来写一个简单的C程序:hello.c

 1#include <stdio.h>   
 2  
 3void print_hello() {   
 4  printf("Hello World\n");   
 5}
   
 6  
 7int main(int argc, char argv[]) {   
 8  print_hello();   
 9  return 0;   
10}
  
11

定义了一个print_hello函数,调用main函数打印Hello World。

如何编译它呢?

1gcc -o hello -O2 hello.c  
2

-o参数指定生成的可执行程序的文件名, -O2是优化级别。该命令会编译生成hello可执行程序,看看这个文件:ls -l hello

-rwxr-xr-x  1 robbin users 11939 2008-11-02 13:48 hello  
有11KB大小。

看看他链接了哪些系统动态链接库,用ldd命令:

1ldd hello  

输出信息为:

1libc.so.6 => /lib64/tls/libc.so.6 (0x0000002a9566d000)   
2/lib64/ld-linux-x86-64.so.2 (0x0000002a95556000)  
3

libc是C语言标准函数库,ld是动态链接器。
 
接着我们看看hello这个程序里面有哪些符号,用nm命令:
 
1nm hello  

输出:

100000000005008f8 A __bss_start   
2000000000040043c t call_gmon_start   
3   
400000000004004f0 T main   
50000000000500658 d p.0   
600000000004004e0 T print_hello   
7                 U puts@@GLIBC_2.2.5   
80000000000400410 T _start  

中间省略了一些,不过我们还是可以在符号表里面找到函数定义。
hello有11KB,体积偏大,去处符号表可以给它瘦身,我们用strip命令:

1strip hello

然后再ls -l hello,输出为:

1-rwxr-xr-x  1 webuser users 4464 2008-11-02 13:56 hello  

只有4.4KB了,瘦身效果明显! 不过这次符号表再也看不到了,nm hello,输出为:nm: hello: no symbols。
最后如果我们想从可执行程序里面提取出来一点什么文本信息的话,还可以用strings命令:
 
1strings hello 

输出信息为:

1/lib64/ld-linux-x86-64.so.2   
2SuSE   
3libc.so.6   
4puts   
5__libc_start_main   
6__gmon_start__   
7GLIBC_2.2.5   
8t fff   
9Hello World  

友情提醒一下,如果你用Java写一个HelloWorld.java,编译以后你也可以用strings窥探一番。

二、动态共享库怎么使用

这次我们把hello.c拆开成为两个文件:hello.c和main.c。hello.c的代码是:

1#include <stdio.h>   
2  
3void print_hello() {   
4  printf("Hello World\n");   
5}
  
6

而main.c的代码是:

1int main(int argc, char argv[]) {   
2  print_hello();   
3  return 0;   
4}
  

hello.c是我们的动态共享库,在hello.c里面我们声明和实现了各种公用的函数,最后main.c可以去调用这些公用函数。首先我们要把hello.c编译成为动态共享库:

-fPIC参数声明链接库的代码段是可以共享的,-shared参数声明编译为共享库。请注意这次我们编译的共享库的名字叫做libhello.so,这也是Linux共享库的一个命名的惯例了:后缀使用so,而名称使用libxxxx格式。

然后编译main.c的时候,我们需要更多的参数让gcc知道如何寻找共享库:

1gcc -o main -O2 -L . -l hello main.c

-L参数指定到哪个附加路径下面去寻找共享库,现在我们指定在当前目录下面寻找;
-l参数指定链接到哪个共享库上面,我们传的参数hello,那么gcc就会自动链接到libhello.so这个共享库上面(注意我们上面说的libXXXX.so命名规则);
-I参数指定到哪个附加路径下面去寻找h文件,这个我们没有使用。

最后我们成功编译好了main,执行一下,报错:

./main: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory

找不到libhello.so这个共享库,怎么回事?这是因为libhello.so并不在操作系统默认的共享库的路径下面,我们可以临时指定一下链接路径:
 
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

这样就成功了。我们用ldd main看一下:

libhello.so => ./libhello.so (0x0000002a9566d000)   
libc.so.
6 => /lib64/tls/libc.so.6 (0x0000002a9576e000)   
/lib64/ld-linux-x86-64.so.2 (0x0000002a95556000

这次main程序链接到了libhello.so这个共享库上面。

三、关于Linux的动态共享库的设置

可执行程序找不到要链接的动态共享库,这是Linux上面编译和运行程序很容易碰到的问题,通过上面的小例子,我们已经大致了解共享库的一点基本原理,接下来我们要探讨一下怎么设置程序寻找动态共享库的行为。

Linux操作系统上面的动态共享库大致分为三类:

1、操作系统级别的共享库和基础的系统工具库

比方说libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/lib64和/usr/lib64目录。如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有/usr/X11R6/lib64目录。此外还可能有其他特定Linux版本的系统库目录。

这些系统库文件的完整和版本的正确,确保了Linux上面各种程序能够正常的运行。

2、应用程序级别的系统共享库

并非操作系统自带,但是可能被很多应用程序所共享的库,一般会被放在/usr/local/lib和/usr/local/lib64这两个目录下面。很多你自行编译安装的程序都会在编译的时候自动把/usr/local/lib加入gcc的-L参数,而在运行的时候自动到/usr/local/lib下面去寻找共享库。

以上两类的动态共享库,应用程序会自动寻找到他们,并不需要你额外的设置和担心。这是为什么呢? 因为以上这些目录默认就被加入到动态链接程序的搜索路径里面了。Linux的系统共享库搜索路径定义在/etc/ld.so.conf这个配置文件里面。这个文件的内容格式大致如下:
 
1/usr/X11R6/lib64   
2/usr/X11R6/lib   
3/usr/local/lib   
4/lib64   
5/lib   
6/usr/lib64   
7/usr/lib   
8/usr/local/lib64   
9/usr/local/ImageMagick/lib  

假设我们自己编译安装的ImageMagick图形库在/usr/local/ImageMagick目录下面,并且希望其他应用程序都可以使用ImageMagick的动态共享库,那么我们只需要把/usr/local/ImageMagick/lib目录加入/etc/ld.so.conf文件里面,然后执行:ldconfig 命令即可。

ldcofig将搜索以上所有的目录,为共享库建立一个缓存文件/etc/ld.so.cache。为了确认ldconfig已经搜索到ImageMagick的库,我们可以用上面介绍的strings命令从ld.so.cache里面抽取文本信息来检查一下:

strings /etc/ld.so.cache | grep ImageMagick   

输出结果为:

1/usr/local/ImageMagick/lib/libWand.so.10   
2/usr/local/ImageMagick/lib/libWand.so   
3/usr/local/ImageMagick/lib/libMagick.so.10   
4/usr/local/ImageMagick/lib/libMagick.so   
5/usr/local/ImageMagick/lib/libMagick++.so.10   
6/usr/local/ImageMagick/lib/libMagick++.so  

已经成功了!

3、应用程序独享的动态共享库

有很多共享库只被特定的应用程序使用,那么就没有必要加入系统库路径,以免应用程序的共享库之间发生版本冲突。因此Linux还可以通过设置环境变量LD_LIBRARY_PATH来临时指定应用程序的共享库搜索路径,就像我们上面举的那个例子一样,我们可以在应用程序的启动脚本里面预先设置LD_LIBRARY_PATH,指定本应用程序附加的共享库搜索路径,从而让应用程序找到它。
























posted @ 2010-11-08 16:31 terrycpp 阅读(343) | 评论 (0)编辑 收藏

项目里面用到了list_head结构体,出现了问题,该问题与这篇主题无关,而且尚未解决,可能是<linux/list.h>库没被包含吧,要晚上回去再研究。
找问题原因的时候看了看list_head的定义,是下面这样的
1struct list_head {
2    struct list_head *next, *prev;
3}
于是觉得奇怪,这个结构怎么来保存数据呢?
上网查了之后长见识了,原来还可以这样。
list_head在别的结构中是充当“栏位”的角色,即拿到list_head之后,可以根据偏移位数来得到原结构变量的起始地址。
可以使用list_entry来取得入口地址,list_entry定义如下:
1 #define list_entry(ptr, type, member) \
2((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) 
使用例子:
1list_entry( &sb1.s_list, struct super_block, s_list)
上面例子可以用来根据s_list地址来取得sb1这个super_block结构体变量的地址。
posted @ 2010-11-08 11:23 terrycpp 阅读(503) | 评论 (0)编辑 收藏

2010年11月5日 #

11.5
每次都来写几句,这些唠叨的就放一起吧,以月为单位。这个方法不错~呵呵
今天把测试用例写完了,虽然老大还没过目。先自己解放一下吧。
这两天注意力完全给了QQ360大战。我是顶QQ的,因为觉得网友一边倒骂QQ太浮躁,而且很多理由站不住脚。
腾讯还是我很欣赏的一家公司,但愿不要经此一役而走下坡路吧。当然自身也有些地方要反省的。
还是多花心思学东西吧,今晚回去实验室做做防火墙。
公司电脑想装个虚拟机玩玩linux,嗯,先安装。

11.27
今天入手了几本大部头,小激动~~
可惜算了算并没有足够的时间看。要好好安排下了。
诶,突然有辞去实习的想法,但又没钱用。囧。。。
前几天突然接到个电话面试,是好久以前投的简历。内牛满面啊,想死的心都有!!发现基础都丢了。
自勉。

posted @ 2010-11-05 15:47 terrycpp 阅读(191) | 评论 (0)编辑 收藏

2010年11月4日 #

原来用的那个名字不够深刻,老记错,特换了这个。terrycpp,以后多上上!
posted @ 2010-11-04 22:24 terrycpp 阅读(159) | 评论 (0)编辑 收藏

来之家公司实习有两个多星期了,内容是手机客户端开发的。当初还算挺感兴趣的,有自己想要的研究点。但是由于项目需要,一直在写该死的测试文档,接下来估计还要做一段时间的测试工作。郁闷啊,最近感觉白天的时间都浪费了,工作效率也是很低。
为了点微薄的收入而花时间兼职,特别是工作内容没意义的话,可不是我想要的。
当然,都上这来写两句了,主题思想肯定是向上的。
测试也不是学不到东西,软件工程的流程,文档规范这些,最近还是有一些吸收的。
至于测试中一些重复性的劳动,早点干完早点结束吧,拿出效率来!
最近还是要关注一下新的实习招聘,为自己留个后路。

vc-zs 2010-11-04 21:13 发表评论

文章来源:http://www.cppblog.com/vc-zs/archive/2010/11/04/132483.html
posted @ 2010-11-04 22:21 terrycpp 阅读(146) | 评论 (0)编辑 收藏

终于被爱立信鄙视了,心里那个恨啊……虽说有心理准备。还是得抓好基本功,下次面试要一举拿下!
实验室防火墙项目有那么一点点进展,老师没怎么催,没鸭梨。
实习公司那边还在熟悉阶段,也没让我对我要求太高。
所以突然好像闲了起来。
还是要振作!
防火墙那块,深入一点,有linux内核方面的经验也是好事。另外可以顺便加深网络方面的功力,好好干。
公司实习是做mobile开发的,其实就是用mfc。这两天发现mfc也是博大精深,之前没这么强烈感觉。用点心吧,研究下其消息机制,学习一下神奇的COM,加深我C++的功力。
不用回头想我也知道,我现在方向挺乱的,从java到c/c++,从UNIX到Win32,从后台到手机开发,都是停留在表面,无一精通。还有些时间,希望毕业的时候不要一无是处。
现在接触的这些东西,先用心学好,尽量深入。
要有所专注,网络编程,linux。
算法啊算法,明天,不,今晚开始看。



vc-zs 2010-10-25 21:41 发表评论

文章来源:http://www.cppblog.com/vc-zs/archive/2010/10/25/131228.html
posted @ 2010-11-04 22:21 terrycpp 阅读(169) | 评论 (0)编辑 收藏

在做防火墙项目的时候,老出现不可理喻的问题,怒了,换换新的开发包版本吧,然后down下来一个xz文件纠结了我半天。解决方法如下:
先在下面这个站点下载解压工具
http://tukaani.org/xz/xz-4.999.9beta.tar.bz2

$tar -jxvf xz-4.999.9beta.tar.bz2
$./configure --prefix=/opt/gnu/xz

$make

$sudo make install

$ln -s /opt/gnu/xz/bin/xz /bin/xz  (前面那个路径可能有差异,自己进去看看)

$xz -d ***.tar.xz

$tar -xvf  ***.tar

ok!





vc-zs 2010-10-19 19:31 发表评论

文章来源:http://www.cppblog.com/vc-zs/archive/2010/10/19/130485.html
posted @ 2010-11-04 22:21 terrycpp 阅读(2157) | 评论 (0)编辑 收藏

仅列出标题  下一页