2008年4月

linux-programming-note-1(linux基础,linux开发环境,linux开发工具)

<本笔记基于《LINUX编程技术详解》(人民邮电出版社)>

author:tunpishuang

chapter1 to chapter 3

LSB :linux standard base ,其分支FHS(filesystem hierarchy standard,文件系统分级结构标准)。

Fedora core 支持的体系结构包括x86,x86_64,ppc

Red hat enterprise linux分为advanced server/entry server/workstation/前两个差异再支持内存和CPU大小数量上,
workstation为工作站平台

SUSE分为enterprise desktop(支持X86,X86_64)和enterprise server(支持x86,amd64/emt64t/ppc/ibm power/安腾/ibm zSeries)

vmare--	|vmware esx server,用于大型服务器,包含一个简单LINux,管理硬件,所有OS安装在该LINUX上
	|vmware gsx server 安装在OS上,
	|vmware workstation 和GSX server相似,不带管理工具。

virtual pc(2003 M$收购connectix,删除对非WIN OS的支持)
使用virtual pc安装LINUX? have a try~~

xen
运行在不支持硬件虚拟化的计算机上,必须修改OS内核,因无法修改WINDOWS,3.0版本之前只支持linux.
可以在支持硬件虚拟化的CPU上,在不修改OS kernel的情况下运行。
para-virtualization的采用,xen资源占用是vmware的百分之几。

PAE:Physical Adress extension 物理地址扩展指令集

vmnet0 is bridged to eth0
vmnet8 for NAT
vmnet1 for host-ony
--------------------
bridged networking :客户机和主机再同一个网段内
NAT(网络抵制转换):guest os分配私有IP,vmware实现ip头转换。
Host-only:客户系统与主机系统构成一个私有网络。

有些免费的linux发行版不提供scsi驱动。最好选择ide.
split disk into 2GB files是针对fat32文件系统

id:82 swap
id:83 ext3
mkfs.ext3 /dev/hdb1
mount -t ext3 /dev/hdb1 /mnt/hdb1

root@ubt:/# netstat -an |grep 22  //查看是否开放sshd服务

开放x-window远程访问服务:
/etc/gdm/gdm.conf    
#*#any host 
(xdm==x display manager)
xdm 使用X联盟的X显示管理控制协议,XDMCP,来和X服务器通信 接入端口 177 
[xdmcp]字段中的Enable=True
在windows下用xmanager2连接linux 使用命令/usr/bin/gdm启动gnome桌面管理器

VI:
:1,$s/old/new/g 从文件开口到结尾替换所有old为new
:n,ms/old/new/g  第n行到第m行之间的old替换为new
:s/old/new/g  当前行old替换为new
:X对文件加密 vi -x 解密读取
语法加亮:1:末行模式 syntax on
	  2:/etc/vimrc中去掉syntax on的"(双引号)
:set cindent 设置自动缩进
:se nu 显示行数

Emacs
ctrl+x ctrl+f 文件名:打开文件
ctrl+x ctrl+s保存文件
ctrl+x U:撤销上次一操作
一下写入~/.emacs启用语法高亮
;;启动语法高亮
(global-font-lock-mode t)
(setq font-lock-maximum-decoration t)
;(setq font-lock-support-mode `lazy-lock-mode)

wine的商业版本codeweavers的crossover 支持ms office /lotus notes/ms project/visio /dreamweaver/flash

linux的编程环境构建---------------------vim+ctags+taglist

taglist是vim的源代码浏览插件,功能实现依赖于ctags
http://ctags.sourceforge.net 下载ctags-5.6.tar.gz
http://nchc.dl.sourceforge.net/sourceforge/ctags/ctags-5.7.tar.gz

ctags installation:
tar zxvf ctags-5.6.tar.gz
cd ctags-5.6
./configure
make
./mkinstalldirs
make install

http://vim-taglist.soureforge.net/
http://jaist.dl.sourceforge.net/sourceforge/vim-taglist/taglist_45.zip
taglist installation:
mkdir -p ~/.vim/plugin
mkdir -p ~/.vim/doc
taglist.vim taglist.txt分别放入plugin doc目录
进入vim 命令模式中输入:helptags ~/.vim/doc 
输入Tlist

让ctags和taglist联系起来:
编辑taglist.vim 在if!exists('loaded_taglist')的上面一行加入:
let Tlist_Ctags_Cmd="/usr/local/bin/ctags"

使用vim+taglist+ctags阅读项目代码:
进入项目目录
#ctags -R //对代码建立符号数据库
TlistToggle 切换函数列表开关
ctrl+ww在编辑区和tags区域切换
ctrl+]查看函数的定义 ctrl+o跳回源文件
vim中查看如何安装插件 help add-plugin

------Vim+cscope
Cscope和ctags的区别在于,当代码出现更改是,cscope生成符号数据库的时候,只生成更改的部分,这样速度更快,
http://cscope.sourceforge.net (opensuse自带二进制包)
使用参数:
-R recurse directories for files.
-b build the cross-reference only,只建立符号数据库,不进入cscope
-C Ignore letter case when searching
-c Use only ASCII characters in the cross-ref file (don't compress)
-d Do not update the cross-reference
-h This help screen
-I incdir Look in incdir for any #include files.
-s dir Look in dir for additional source files
-v Be more verbose in line mode.
-V print the version number.
-q:Buid an inverted index for quick symbol searching (cscope.in.ou/cscope.po.out)
-k: Kernel mode -don't use /usr/include for #include files
-i namefile Browse through files listed in namefile,instead of cscope.files
最常用的参数:-Rbkq
用个脚本tag.sh来建立符号数据库
-----------
#!/bin/sh
#查找$1目录下所有.h .c .cc文件
#将文件列表保存到cscope.list
find $1 -name "*.h" -o -name "*.c" -o - name "*.cc" >cscope.list
cscope -Rbkq -i cscope.list
#同时使用ctags建立tags索引
ctags -R
-------------------------------chmod +x, 运行:tag.sh dir
cscope.list 源代码文件列表
cscope.out 符号数据库
cscope.in.out cscope.po.out 为加快索引速度产生的文件

Vim+cscope的使用
vim编译可以加入cscope支持,
:cs show 显示cscope符号数据库连接情况
:cs add /sompath/cscope.out 添加
:cs find 查询函数,变量名称

3.6 源代码阅读工具 slickeidt,
3.7 基于Web的源代码阅读工具:Linux Cross-Reference
3.8 linux c c++编译器
gcc:GNU Compiler Collection
支持的硬件平台:
arm,strongarm,xscale,hitachi sh,Intel i960,x86/IA-32,MIPS,MOtorola ppc,68k,coldfire....------------------

gcc可以编译C,g++用于编译C++
3.8.5 使用gcc控制编译过程
1.预处理 gcc -E -o test.pre.c test.c (preprocess only,don't assemble or link)
2.生成汇编代码 gcc -S test.c (compile only,don't assemble or link)生成test.s
3.生成目标代码 gcc -c test.c (compile and assemble,don't link)生成test.o
4.连接生成最后的可执行代码gcc -o test test.c 

3.9 GNU MAKE
-------------code----------a simple makefile
CC=gcc
CFLAGS=-o
test : test.c
	$(CC) $(CFLAGS) $@ test.c
clean:
	rm test
--------------code end---------

3.9.4 MAKE 工作流程
/*test.part1.c*/
#include <stdio.h>
void part_one()
{printf("in the part one function\n");}

/*test.part2.c*/
#include <stdio.h>
void part_two()
{printf("in the part two function \n");}

/*test.c*/
#include <stdio.h>
extern void part_one();
extern void part_two();
int main(void)
	{
	part_one();
	part_two();
	}
--------------------------所以makefile是这样的:
CC=gcc
CFLAGS=-o
OBJFLAGS=-c
test:test.part1.o test.part2.o test.o
	$(CC) $(CFLAGS) $@ test.o test.part1.o test.part2.o
test.part1.o : test.part1.c
	$(CC) $(OBJFLAGS) test.part1.c
test.part2.o : test.part2.c
	$(CC) $(OBJFLAGS) test.part2.c
test.o : test.c
	$(CC) $(OBJFLAGS) test.c
clean:
	rm test
	rm test.part1.o
	rm test.part2.o
----------------------------------
3.9.5 makefile隐含规则
比如:将后缀为.c的文件编译为.o的文件。
常用以隐含规则:
C程序编译:.o文件自动由同名的.c文件生成,$(CC) -c $(CPPFLAGS)$(CFLAGS)
c++程序编译:.o文件自动由同名的.c/.cc文件生成,$(CXX) -c $(CPPFLAGS)$(CFLAGS)
Pascal程序编译:.o文件自动由同名的.p文件生成,$(PC) -c $(PFLAGS)

3.9.6makefile的模式规则
%.o : %.c
	$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

3.10 linux下的调试工具
GDB:
为了让GDB可以获得程序的信息,需要加入参数g:
gcc -o gdb.debug -g gdb.c

file <tab>自动补齐 加载需要调试的程序
run 运行
list 列出具体代码,带有行号 list line_from,line_to(from到to之间显示)
break 设置断点
watch 设置观察变量
next 单步执行 /运行到一个函数内:step:步进
continue 从断点位置继续执行
shell ls -la 不退出gdb执行外部shell
show args 显示运行参数
set args b 设置运行参数
print variable 查看变量
whatis variable 查看变量类型 /ptype 显示数据结构的定义
info break/function 显示当前设置的断点信息/函数信息
delete breakpoint 断点号:删除指定断点号
disable breakpoint 断点号:禁用指定断点号
enable breakpoint ..................
make 不退出gdb编译程序
quit 推出gdb
help 帮助
--------------------------
3.10.5 DDD (data display debugger)
DDD可以做gdb,dbx,wdb,ladebug,jdb,xdb,perl,bash等命令调试工具的图形前端
DDD要求gdb的版本在4.16以上
3.10.8 gdb远程调试
目标板:#gdbserver 192.168.2.1:8888 program 
宿主机:target remote 192.168.2.2:8888

-------------------end of chapter 1 to chapter 3

c problems series 1

1.老师你好,有个C语言问题请教。

#include <stdio.h>
main()
{
union
{
char ch[2];
int d;
}s;
s.d=0x4321;
printf("%x,%x\n",s.ch[0],s.ch[1]);

}

为什么输出21,43 而不是43,21

这个问题不复杂,考到了数据在内存中如何存储问题。数据在内存中存储是从低位到高位,也
就是说先存储的21,在存储的43.所以按序输出时候就输出这个结果了。

2.
%ns和%.ns
从 Planet Chinese Security Community 作者:void@planetchinesesecuritycommunity.org(void)
这段代码有什么问题?

void func(char *p) {
char buf[10+1];
memset(buf,0,sizeof(buf));

// limit string to 10 chars
sprintf(buf,"%10s",p);
printf("Hello, %s\n",buf);
}

答案:
%10s只是用于宽度对齐,超过10字节,仍然全部拷贝,导致溢出.
%.10s才是限制了拷贝长度为10字节