Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4973222
  • 博文数量: 1696
  • 博客积分: 10870
  • 博客等级: 上将
  • 技术积分: 18357
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-30 15:16
文章分类
文章存档

2017年(1)

2016年(1)

2015年(1)

2013年(1)

2012年(43)

2011年(17)

2010年(828)

2009年(568)

2008年(185)

2007年(51)

分类: LINUX

2010-04-07 22:41:56

作者:金鸽

欢迎访问 sinodragon21.cublog.cn


1、学习使用Linux,先记住一个自助式命令: man
   man -f [command]
   man -k [command]
   man X [command] (其中'X'为数字,代表man -f [command]查询结果中,提示该command处于Mannual的第几部分部分)

2、学习使用DOS,先记住一个自助式命令: ?
   [command] /?  (查询该命令的使用方法)

3、学习使用gdb,先记住一个自助式命令: help
   help [topic]
   比如,你想知道如何打断点breakpoint,就在gdb的提示符后面输入 > help breakpoint;
   还有几个常用的命令: [s]tepinto(相当于VC里的F11),[f]inish(相当于VC里的stepout),
   Linux下gdb调试,还可以在某一个具体的内存打断点:[b]reakpoint *[addr](addr代表你的内存地址),这个在定位内存泄露或者踩内存(coredump)等问题时颇为有用。

4、学习设置VIM的万能命令—— :set all
   :set all 可以列出VIM中可供用户设置的所有选项,你在里面找那个和你想要设置的功能相关,试着设置一下,就OK了。如果还是不起作用,在网上搜索一下:set all中可能有效的选项如何使用,在努力一把。
   今天碰到一个问题,:set noshiftround,不起作用。后来发现是:set cindent在作怪。当你设置了cindent时,从其他地方copy的代码,通过p命令粘贴到你的VIM编辑器时,会不断的indent,搞的代码和楼梯似的,乱成马列。先:set noautoindent,再:set noexpandtab,不起作用;retry,:set shiftwidth=1,起作用了,但还是楼梯状,不过indent=1;tritry,:set noshiftround,还不如:set shiftwidth=1呢,又indent=8了。最终发现是cindent在作怪,关闭之便好,方法:set nocindent。

5. Although the present Windows Sockets specification defines the sockets abstraction for TCP/IP, any network protocol can comply with
Windows Sockets by supplying its own version of the dynamic link library (DLL) that implements Windows Sockets.
   --From: Windows Sockets: Background, MSDN Library
 Window的socket是一个抽象的概念,目前支持TCP/IP协议族,你可以编写新的DLL来满足新的网络协议的需要,比如SCTP等新的通讯协议。(万剑归宗)

6.
  

7. [Student Course]
  

/* sinodragon21 add 2010-7-18 below*/

8. 学习内存管理,就不得不学习malloc和free,那么你知道malloc和free是如何实现的吗?接着问自己:free函数的入参是一块内存的头指针,free怎么知道释放多大的地址范围?释放后这些内存交给了谁管理?有时候明明释放了,可是top看到的内存信息还是没有释放?这是为什么?是内存泄露?还是其他原因?

现在的计算机系统越来越复杂,从硬件到我们运行的程序(进程),内存管理被分为不同的几个层次,不同的操作系统,其设计各有特色。大致上,可以分为以下几 个层次:
[硬件] --> [虚拟内存系统] --> [系统级的Heap管理] --> [进程级的Heap管理(libc)] --> [我们的进程malloc/free]

对于偏左的几个层次,我们可以暂时不了解, 但看看 libc 中 malloc/free 的实现,还是很有意思的,不过现在的系统(硬件/操作系统)都无比复杂,直接阅读最新的代码,一头扎入最复杂的逻辑中,对我们理解其基本原理,实在没有益 处。

去繁就简,我们看看早期 BSD 的一个实现。参看最早的一个版本 v1.1


实 现很漂亮,代码很少,但可以看到一个 allocator 看得见摸得找的"高效"实现,里面的技巧,SGI STL allocator 也在使用。

总结:学习疑难技术的方法:寻找切入点(比如这里的free/malloc),再学习其发展历程,最好从它最简单最原始的阶段开始抽丝剥见。(侯捷解剖MFC时使用的便是此法)

学习本质的利器:FreeBSD的早期实现版本的源代码(学习Revision Tree中的最早版本)
From:

/* sinodragon21 add 2010-7-18 above*/

9. 编译成功,但链接时报错:unreferenced symbol: #####. 说明你链接时使用的静态库不存在,或者该静态库版本不正确。诊断方法:
Windows平台: 使用dumpbin /SYMBOLS XXX.lib /OUT:XXXlibsymbol.txt,生成静态库的符号表,在生成的XXXlibsymbol.txt中查找#####,如果找不到,则您需要拿到正确版本的静态lib库先。
Linux平台: 使用nm/objdump工具,生成静态.a库的符号表,其他同上。

To be continued ...
阅读(1335) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~