2010年九月

linux gcc 下使用总结【继续更新】

入门知识

编译器把编译生成目标代码的任务分为以下4步:
a.预处理,把预处理命令扫描处理完毕;
b.编译,把预处理后的结果编译成汇编或者目标模块;
c.汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;
d.连接,把多个目标代码模块连接生成一个大的目标模块;

gcc 下常用参数

-I 指定头文件搜索路径,默认情况下gcc的搜索路径/usr/include /usr/local/include
-L 指定库文件的搜索路径,默认的搜索路径为 /lib/ /usr/lib /usr/local/lib ??
-l 指定需要链接的库名称, 注:正常的库libboost_regex.so 使用-lboost_regex 省略前面的lib和后面的扩展名
-c 只生成目标代码 注:生成库文件时使用,只编译不链接
-shared 生成动态库
-o 指定输出文件名称
-W 显示所有的警告信息 注:建议打开
-w 屏蔽所有的警告信息,默认情况
-g 把调试开关打开,让编译的目标文件有调试信息
-S 把源文件编译成汇编代码,不做汇编和连接的动作
-E 只把源文件进行预处理之后的结果输出来。不做编译,汇编,连接的动作

-Xlinker -rpath=./lib 指定程序运行是动态库的搜索路径

-MM 显示出目标文件所依赖的源文件和头文件,头文件仅包括本地头文件

-M    与-MM类似,但是头文件包括系统头文件,即用”<>”

这两个参数在写makefile时用到

实用方法

1, 生成动态库方法
$ gcc -fPIC -c func.c -o func.o
$ gcc -shared -o libfunc.so.1.0.0 func.o
2, 生成静态库方法
$ gcc -c func.c -o func.o
$ ar rcs libfunc.a func.o
3, ldd 命令
查看动态库和可执行文件的依赖的库

4. -MM参数

[yaronli@sim124 cc]$ gcc -MM transfer/Transfer_server.cpp -I. 
Transfer_server.o: transfer/Transfer_server.cpp transfer/Transfer.h \
  transfer/transfer_types.h transfer/TransferStatus.h \
  transfer/TransferTasks.h common/TaskIf.h transfer/TransferWorker.h \
  common/RingBuffer.h common/TaskIf.h common/FileHandler.h common/log.h \
  common/DbOperator.h transfer/Transfer_server.h

问题总结

1, 静态编译时,被依赖库放到依赖库的后面,否则链接时会出错
2, 在生成动态库…………………



linux下动态库的搜索路径顺序及常用命令

1.编译目标代码时指定的动态库搜索路径;

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4.默认的动态库搜索路径/lib;

5.默认的动态库搜索路径/usr/lib。

注:64位机器自动找lib64库

与动态库相关的命令

1,ldd  查看动态库或者可执行程序依赖的库文件

2,/sbin/ldconfig  在修改/etc/ld.so.conf 后,使用该命令生效ld.so.conf



挣值分析

公司的产品中有种分析方法:挣值分析。

刚听的后感觉真深奥,尤其对我这种懒于学算法的人,看了我组长写的小百科,再查查资料,嗯,还是很好理解的。

挣值分析就是利用金额数字衡量项目的进度和成本的一种方法。

首先介绍涉及到的几个名词:

  1. BCWS: Budgeted Cost of Work Schedule——完成所有计划的工作所需要的预算;
  2. BCWP: Budgeted Cost of Work Performed——目前完成的工作按计划所需的预算;这个也叫挣值。
  3. ACWP: Actual Cost of Work Performed——目前完成的工作实际的支出

现在就可以应用上述三个值来计算项目的进度偏差、成本偏差、进度效率指数和成本效率指数了:

  1. 进度效率指数:SPI=BCWP/BCWS
  2. 成本效率指数:CPI=BCWP/ACWP
  3. 进度差异:SV=BCWP-BCWS
  4. 成本差异:CV=BCWP-ACWP

SPI>1,说明实际完成的比计划的快,项目进度超前

CPI>1,说明完成部分的实际花费比按照预算完成相同工作的花费少,即成本有盈余

举个例子说明:

一项工作分为5个部分,计划每个阶段的成本是200元,到截止时间时完成了3个部分,这三个部分共花费了500元,

  • BCWS=5×200=1000
  • BCWP=3×200=600
  • ACWP=500
  • SPI=BCWP/BCWS=600/1000=0.6——项目进度滞后了
  • CPI=BCWP/ACWP=600/500=1.2——项目预算有剩余
  • SV=BCWP-BCWS=600-1000=-400
  • CV=BCWP-ACWP=600-500=100

恩,不错,一目了然,几个数字就把项目的进度和成本表达的清清楚楚,让我这个数学白痴稍微体会到了数学的魅力 \(^o^)/~



应用 memcached 提升站点性能[转载]

简介

memcached 常被用来加速应用程序的处理,在这里,我们将着重于介绍将它部署于应用程序和环境中的最佳实践。这包括应该存储或不应存储哪些、如何处理数据的灵活分布以 及如何调节用来更新 memcached 和所存储数据的方法。我们还将介绍对高可用性的解决方案的支持,比如 IBM WebSphere® eXtreme Scale。

所有的应用程序,特别是很多 web 应用程序都需要优化它们访问客户机和将信息返回至客户机的速度。可是,通常,返回的都是相同的信息。从数据源(数据库或文件系统)加载数据十分低效,若是 每次想要访问该信息时都运行相同的查询,就尤显低效。

虽然很多 web 服务器都可被配置成使用缓存发回信息,但那与大多数应用程序的动态特性无法相适。而这正是 memcached 的用武之地。它提供了一个通用的内存存储器,可保存任何东西,包括本地语言的对象,这就让您可以存储各种各样的信息并可以从诸多的应用程序和环境访问这些 信息。

原文地址



探索 Linux 内核虚拟机[转载]

简介

虚拟化 概念很早就已出现。简单来说,虚拟化就是使用某些程序,并使其看起来类似于其他程序的过程。将这个概念应用到计算机系统中可以让不同用户看到不同的单个系 统(例如,一台计算机可以同时运行 Linux 和 Microsoft® Windows®)。这通常称为全虚拟化(full virtualization)。

KVM 和 kvm

在本文中,我们使用 KVM 引用内核虚拟机,使用 kvm 引用系统管理程序(用来启动一台新虚拟机)。

虚拟化也可以使用更加复杂的格式,其中单个计算机看上去具有多个架构(对于一个用户来说,它是一个标准的 x86 平台;对于另外一个用户来说,它是 IBM Power PC® 平台)。这种虚拟化形式通常被称为 硬件仿真

最后,更加简单的一种虚拟化是操作系统虚拟化,其中一台计算机可以运行相同类型的多个操作系统。这种虚拟化可以将一个操作系统的多个服务器隔 离开来(这意味着全都必须使用相同类型和版本的操作系统)。

………………….

原文地址



计算器实现方法

实现计算器有两种常用的方法:

1,转化为逆波兰表达式,然后对逆波兰表达式进行计算,比较常用,C语言教材中的标准方法

http://en.wikipedia.org/wiki/Shunting-yard_algorithm

2,利用编译原来中的词法分析和递归下降的语法分析方法,扩展性比较好

有时间实现下~~



[译文]程序员能力矩阵 Programmer Competency Matrix

http://static.icybear.net/%5BCN%5DProgrammer%20competency%20matrix.htm



kvm介绍与使用【转载】

一.KVM简介

虚拟化技术已经成为未来计算机技术的一个重要的发展方向.linux在虚拟化方面已经有了很多中解决方案,
如:VMware,VirtualBox,Xen和KVM.
KVM是一个全虚拟化的解决方案.可以在x86架构的计算机上实现虚拟化功能. KVM只可在具有虚拟化支持的CPU上运行,即具有VT功能的Intel CPU和具有AMD-V功能的AMD CPU.
<Xen与KVM的比较>
Xen也是Linux下的一个虚拟化解决方案,也将很快被编入内核中.Xen的实现方法是,运行支持Xen功能的
kernel,这个kernel是工作在Xen的控制之下,叫做Domain0,使用这个kernel启动机器后,你可以在这个机器上
使用qemu软件,虚拟出多个系统.Xen的缺点是,如果你需要更新Xen的版本,你需要重新编译整个内核,
而且,稍有设置不慎,系统就无法启动.
相比较,KVM就简化的多了.它不需要重新编译内核,也不需要对当前kernel做任何修改,它只是几个可以动态加载的.ko模块.
它结构更加精简,代码量更小,所以,出错的可能性更小.并且在某些方面,性能比Xen更胜一筹.

二.KVM的使用

现在以Turbolinux 11版本为基础,介绍KVM的使用方法.
在安装之前,你需要先确认,你的CPU是否支持虚拟化技术,执行:

# egrep '^flags.*(vmx|svm)' /proc/cpuinfo

如果有输出返回,则表示,你的CPU支持虚拟化技术.

1.KVM的安装

从官方网站下载KVM源码包
http://kvm.qumranet.com/ 我们使用KVM-33版本.

# tar zxf kvm-33.tar.gz
# cd kvm-33
# ./configure --prefix=/usr/local/kvm-33
# make
# make install

make install后,kvm的模块会安装到/lib/modules/$KernelVersion/extra/目录下.其他相关文件会安装
到/usr/local/kvm-33/目录下.
将kvm相关目录连接到系统目录中.

# ln -s /usr/local/kvm-33/bin/* /usr/bin/
# ln -s /usr/local/kvm-33/lib/* /usr/lib/
(若为x86_64系统,则执行: ln -s /usr/local/kvm-33/lib64/* /usr/lib64/)
# ln -s /usr/local/kvm-33/include/kvmctl.h /usr/include/
# ln -s /usr/local/kvm-33/include/linux/* /usr/include/linux/
# ln -s /usr/local/kvm-33/share/qemu /usr/share/

2.KVM的使用

a.你 需要先建立一个影像文件,作为虚拟系统的硬盘.

# mkdir /images
# cd /images
# /usr/bin/qemu-img create -f qcow2 gtes11.img 20G
注:对于安装windows  qcow2 比 qcow 快很多

b.创建网络配置脚本

# echo ‘/sbin/ifconfig $1 10.0.1.1 netmask 255.255.255.0’ > /etc/qemu-ifup

c.加载KVM模块

Intel CPU使用:
# modprobe kvm-intel
AMD CPU使用:
# modprobe kvm-amd

d.安装虚拟系统

# /usr/bin/qemu-i386 -m 512 -k en-us -M pc -hda /images/gtes11.img -cdrom /iso/zuma-SP3-rc3-6-\
disc1-20061031.iso -net nic,vlan=1,model=rtl8139,macaddr=00:00:00:00:99:01  -vnc localhost:1 -boot d

在另一个终端执行:
# vncviewer localhost:1

参数分析: 我们为虚拟系统分配512MB内存.使用gtes11.img作为它的第一块硬盘,使用Turbolinux10.5的disc1作为它的光盘, 并从光盘引导.它有一块rtl8139的网卡,MAC地址为:00:00:00:00:99:01,并把这个网卡与主机的tap0接口连接. tap0接口使用/etc/qemu-ifup脚本进行初始化.虚拟系统的输出作为一个vnc服务器,绑定在主机的localhost:1上.

注: 1.若为x86_64系统,则使用/usr/bin/qemu-system-x86_64 代替qemu-i386 2.在64位系统上,可以安装32位和64位的虚拟系统.但在32位系统上,只能安装32位的虚拟系统.

qemu参数介绍:
-hda 影像文件:  使用影像文件作为虚拟系统的第一块硬盘.同样还可以使用hdb,hdc,hdd指定第2,3,4块硬盘.
-cdrom 光盘影像文件:  使用光盘影像文件作为虚拟系统的光盘.
-boot [a|c|d|n]: 设置虚拟系统的引导顺序,a为软驱,c为硬盘,d为光驱,n为网络.
-m 内存大小:    设置虚拟系统使用的内存大小,单位为MB.
-k 语言:        设置虚拟系统键盘类型.
-net nic[,vlan=n][,macaddr=addr][,model=type]
                建立一个虚拟网卡,并把它连接到VLAN的n端口上.
-net tap[,vlan=n][,fd=h][,ifname=name][,script=file]
                把主机的TAP网络接口连接到VLAN的n端口上,并使用script指定的脚本进行初始化.


为VSFTP用户指定登录后的目录

VSFTP用户目录指定

1修改VSFTP配置文件

Vi /etc/vsftpd/vsftp.conf

#启动chroot列表
chroot_list_enable=YES
#指定列表位置

chroot_list_file=/etc/vsftpd/chroot_list #这个配置的制定哪些用户不能使用chroot ,默认为空即可

userlist_enable=yes

#禁止文件/etc/vsftpd/user_list文件中的用户登陆FTP

#添加读取用户配置目录(注:本行配置默认没有需要手动输入)

user_config_dir=/etc/vsftpd/userconf

2.建立用户配置目录

Mkdir /etc/vsftpd/userconf

3.建立用户登陆后的目录

Mkdir /test

4.添加用户配置文件

已知有用户ictftp

注:有很多用户时,需要建每个用户相对应的文件

Vi /etc/vsftpd/userconf/ictftp

local_root=./test

FTP用户登陆后指定的目录

5重启VSFTP

./vsftdp vsftpd.conf &

登陆ictftp用户.FTP将登陆至/test目录



linux下C语言使用在线手册



地址:http://www.yaronspace.cn/manual/linux_c/


欢迎使用~~