2004年07月29日

时间限定在1.5个月内!

希望各位朋友提供点思路

“Datatypes is basically an extension of normal shared libraries (or DLLs) to provide generic data handling capabilities. With this facility, any datatypes-aware program–whether viewer, web browser, or image editor–can be extended after the fact, simply by adding the appropriate datatype for whatever new format comes along.”

2004年07月28日

gdb中的信号(signal)相关调试技巧

标  题: 【转贴】gdb中的信号(signal)相关调试技巧

一篇不错的帖子,讲的是gdb中的信号(signal)相关调试技巧

转自Magic C++论坛
http://www.magicunix.com/index_ch.html
http://www.magicunix.com/cgi-bin1/forum_cn/ultimatebb.cgi?ubb=get_topic&f=1&t=00
0060#000003

引用:
——————————————————————————–

原发贴者 Couger:
我写了一个INT信号的处理函数,在处理函数里设置断点后go,但是在console下按Ctrl-C
后MC并没有进入处理函数,而console下的程序也直接退出,没有给出希望的输出。
——————————————————————————–

在console下按Ctrl-C后确实发送了SIGINT信号,但是gdb里的缺省设置将会导致由GDB截获
的该信息,调试的应用程序无法接受到该信号。

有两种方法可以使调试的应用程序接受到信号:

(1)改变gdb信号处理的设置
比如,以下设置会告诉gdb在接收到SIGINT时不要停止、打印出来、传递给调试目标程序
=====================================
(gdb) handle SIGINT nostop print pass
SIGINT is used by the debugger.
Are you sure you want to change it? (y or n) y

Signal Stop Print Pass to program Description
SIGINT No Yes Yes Interrupt
(gdb)
=====================================

(2)使用gdb命令直接向调试的应用程序发送信号
首先在你希望发送信号的语句处设置断点,然后运行程序,当停止到断点所在位置后,用gd
b的signal命令发送信号给调试目标程序
====================================
(gdb) signal SIGINT
Continuing with signal SIGINT.

Breakpoint 1, handler (signal=2) at main.cpp:15
15 printf(“Signal handler…\n”);
====================================

;-( 但是这两种方法目前MC都还不支持,所以需要等新版本的MC才可以方便的支持你这种调
试情况,呵呵。临时先手工调试一下吧。

新版本将会增加
(1)调试器的信号处理设置
(2)支持发送信号命令

调试用例:
============
/*
* This program is uninterruptable with
* Ctrl+C, uses signal handler
*/

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

/* The signal handler function */
void handler( int signal ) {
printf(“Signal handler…\n”);
psignal( signal, “Signal: “);
} /*handler*/

main() {
/* Registering the handler, catching
SIGINT signals */
signal( SIGINT, handler );

/* Do nothing */
while( 1 ) {
printf(“Running…\n”);
sleep(10);
} /*while*/
} /*main*/

============

改变gdb的信号处理设置
============
5.3 Signals
A signal is an asynchronous event that can happen in a program. The operating sy
stem defines the possible kinds of signals, and gives each kind a name and a num
ber. For example, in Unix SIGINT is the signal a program gets when you type an i
nterrupt character (often C-c); SIGSEGV is the signal a program gets from refere
ncing a place in memory far away from all the areas in use; SIGALRM occurs when
the alarm clock timer goes off (which happens only if your program has requested
 an alarm).

Some signals, including SIGALRM, are a normal part of the functioning of your pr
ogram. Others, such as SIGSEGV, indicate errors; these signals are fatal (they k
ill your program immediately) if the program has not specified in advance some o
ther way to handle the signal. SIGINT does not indicate an error in your program
, but it is normally fatal so it can carry out the purpose of the interrupt: to
kill the program.

GDB has the ability to detect any occurrence of a signal in your program. You ca
n tell GDB in advance what to do for each kind of signal.

Normally, GDB is set up to let the non-erroneous signals like SIGALRM be silentl
y passed to your program (so as not to interfere with their role in the program’
s functioning) but to stop your program immediately whenever an error signal hap
pens. You can change these settings with the handle command.

info signals
info handle
Print a table of all the kinds of signals and how GDB has been told to handle ea
ch one. You can use this to see the signal numbers of all the defined types of s
ignals.
info handle is an alias for info signals.

handle signal keywords…
Change the way GDB handles signal signal. signal can be the number of a signal o
r its name (with or without the `SIG’ at the beginning); a list of signal number
s of the form `low-high’; or the word `all’, meaning all the known signals. The
keywords say what change to make.
The keywords allowed by the handle command can be abbreviated. Their full names
are:

nostop
GDB should not stop your program when this signal happens. It may still print a
message telling you that the signal has come in.

stop
GDB should stop your program when this signal happens. This implies the print ke
yword as well.

print
GDB should print a message when this signal happens.

noprint
GDB should not mention the occurrence of the signal at all. This implies the nos
top keyword as well.

pass
noignore
GDB should allow your program to see this signal; your program can handle the si
gnal, or else it may terminate if the signal is fatal and not handled. pass and
noignore are synonyms.

nopass
ignore
GDB should not allow your program to see this signal. nopass and ignore are syno
nyms.
When a signal stops your program, the signal is not visible to the program until
 you continue. Your program sees the signal then, if pass is in effect for the s
ignal in question at that time. In other words, after GDB reports a signal, you
can use the handle command with pass or nopass to control whether your program s
ees that signal when you continue.

The default is set to nostop, noprint, pass for non-erroneous signals such as SI
GALRM, SIGWINCH and SIGCHLD, and to stop, print, pass for the erroneous signals.

You can also use the signal command to prevent your program from seeing a signal
, or cause it to see a signal it normally would not see, or to give it any signa
l at any time. For example, if your program stopped due to some sort of memory r
eference error, you might store correct values into the erroneous variables and
continue, hoping to see more execution; but your program would probably terminat
e immediately as a result of the fatal signal once it saw the signal. To prevent
 this, you can continue with `signal 0′. See section Giving your program a signa
l.
============

直接使用gdb signal命令发送信号给调试目标程序
================
三、产生信号

使用singal命令,可以产生一个信号给被调试的程序。如:中断信号Ctrl+C。这非常方便于
程序的调试,可以在程序运行的任意位置设置断点,并在该断点用GDB产生一个信号,这种
精确地在某处产生信号非常有利程序的调试。

语法是:signal <singal>,UNIX的系统信号通常从1到15。所以<singal>取值也在这个范围

single命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由GDB截获
的,而single命令所发出一信号则是直接发给被调试程序的。
====================

2004年07月27日

从windows到linux — 编程篇 — cygwin,在win中开发linux程序

从windows到linux — 编程篇 — cygwin,在win中开发linux程序
    乾坤一笑[smileonce]    smileonce@126.com   2004-7-23
    版权所有 转载请注明出处  http://blog.csdn.net/smileonce

    很多用windows的朋友不习惯于用linux的开发环境。虽然很乐意尝试一下,但是往往怕linux系统
打乱了自己的正常生活:1〉装linux系统把windows系统给搞坏了,导致自己无法正常生活;2>linux开
发上手太难,写出第一个helloworld不亚于java的难度,环境配置摸不着头脑。 对于此,我的看法是:
路不管平还是陡,终归你要走的,如果你愿意投入到linux开发的社群中来,不会安装linux系统,不会配
置工作环境是不能想象的。(事实上,确实要了解很多东西的原理,不然很难排错:诸如,硬盘引导器的引
导原理、分区结构原理及linux分区结构和文件系统、环境变量的设置、种类繁多的压缩包安装包的解压安
装方法、用户管理权限管理等常用命令、以至于驱动安装系统中文化等等异常琐碎的东东)。

本文试图跳过这个难走的步骤,启用一个win环境下的linux仿真器(和linux下面的命令行开发环境基本
一致),用短短的20分钟的时间,教你做出一个纯正的linux下gcc编译的helloworld。就象是买点心前
先尝尝味道,不也是一件很愉快的事情么?(注:cygwin事实上不仅有此模拟功能,它也是移植unix<–>
win程序的一个很有效的工具,也有人用它来做嵌入式系统开发)

一、cygwin是什么?
   这个问题你最好google一下”cygwin的历史”,或许能够获得更为详尽的答案。简而言之,cygwin是一
个在windows平台上运行的linux模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了
很多好东西,著名的还有eCos,不过现已被Redhat收购)。插一句废话,很多朋友不明白linux和unix的
区别和联系,在此也简要介绍一下。UNIX是一个注册商标,是要满足一大堆条件并且支付可观费用才能够
被授权使用的一个操作系统;linux是unix的克隆版本,是由其创始人Linus和诸多世界知名的黑客手工打
造的一个操作系统。为什么linux和unix之间有很多软件可以很轻松的移植?因为linux也满足POSIX规
范,所以在运行机制上跟unix相近。  
   以下引用网上的一段话(出处:http://blog.csdn.net/glock18/archive/2004/07/10/38275.aspx),
用于说明cygwin的工作机制:cygnus当初首先把gcc,gdb,gas等开发工具进行了改进,使他们能够生成
并解释win32的目标文件。然后,他们要把这些工具移植到windows平台上去。一种方案是基于win32 api
对这些工具的源代码进行大幅修改,这样做显然需要大量工作。因此,他们采取了一种不同的方法——他们写
了一个共享库(就是cygwin dll),把win32 api中没有的unix风格的调用(如fork,spawn,signals,
select,sockets等)封装在里面,也就是说,他们基于win32 api写了一个unix系统库的模拟层。这样,
只要把这些工具的源代码和这个共享库连接到一起,就可以使用unix主机上的交叉编译器来生成可以在
windows平台上运行的工具集。以这些移植到windows平台上的开发工具为基础,cygnus又逐步把其他的
工具(几乎不需要对源代码进行修改,只需要修改他们的配置脚本)软件移植到windows上来。这样,在
windows平台上运行bash和开发工具、用户工具,感觉好像在unix上工作。关于cygwin实现的更详细描述,
请参考http://cygwin.com/cygwin-ug-net/highlights.html

二、cygwin的安装。
  cygwin的安装文件很容易通过google找到。目前国内的网站上有“网络安装版”和”本地安装版”两种。
标准的发行版应该是  网络安装版。两者并无大不同,下面介绍一下安装的过程。

  step1. 下载后,点击安装文件(setup.exe)进行安装,第一个画面是GNU版权说明,点”下一步(N)—>”,
进入安装模式选择画面。

  step2. 安装模式有”Install from Internet”、”Download form Internet”、
“Install from Local Directory” 三种。”Install form Internet”就是直接从internet上装,
适用于网速较快的情况。如果你和我一样网速不是很快,或者说装过之后想把下载的安装文件保存起来,
下次不再下载了直接安装,就应该选择”Download form Internet”,下载安装的文件(大约40M左右)。
事实上,所谓的”本地安装版”,也是别人从网上下载全部文件后打的包(适用于中国国情嘛^_^)
 
  step3. 接下来是选择安装目的路径和安装源文件所在的路径,之后就进入了选择安装包所在的路径。
注意了阿,这里可是重头戏。我第一安装的时候就是没有看清这一步,结果没有把gcc装进去,导致没法编
译文件。
   + All  Default
      + Admin Default
       ….
      + Devel   Default
      + Editors Default
      ….
如上图所示,你在这个TreeView的某个节点上双击,就可以改变它的状态,如Default、Install、
Uninstall、Reinstall四种状态。默认的都是Default状态,很多工具的默认状态都是不安装。
在这里我选择了在All上点Install,全部安装,以免后患。(全部安装大概不到200M的空间)

  step4. 点下一步,安装成功。它会自动在你的桌面上建立一个快捷方式。

 

  好了,下面就开始我的linux旅程了。双击cygwin的快捷方式进入系统。
首先介绍几个简单的linux命令。
pwd   显示当前的路径
cd    改变当前路径,无参数时进入对应用户的home目录
ls    列出当前目录下的文件。此命令有N多参数,比如ls -al
ps    列出当前系统进程
kill  杀死某个进程
mkdir 建立目录
rmdir 删除目录
rm    删除文件
mv    文件改名或目录改名
man   联机帮助
less  显示文件的最末几行

由于linux下面的命令大多都有很多参数,可以组合使用。所以,每当你不会或者记不清楚改用那个参数,
那个开关的时候,可以用man来查找,比如,我想查找ls怎么使用,可以键入
$  man ls
系统回显信息如下:
LS(1)                          FSF                          LS(1)
NAME
       ls – list directory contents
SYNOPSIS
       ls [OPTION]… [FILE]…
DESCRIPTION
       List information about the FILEs (the current directory by
       default).  Sort entries alphabetically if none of -cftuSUX
       nor –sort.
       -a, –all
             do not hide entries starting with .
       -A, –almost-all
             do not list implied . and ..
       -b, –escape
             print octal escapes for nongraphic characters
       –block-size=SIZE
             use SIZE-byte blocks
:
很全是吧,嘿嘿。

好了,多说无意,让我们来写一个hello world程序。
# cd
  进入了/home/administrator目录,我当前的登陆帐号是administrator

# mkdir source
  建立一个叫做source的子目录

# cd source
  进入 /home/administrator/source

# vim hello.c

   启动vim编辑器,来编写程序。好了,现在有必要简要介绍一下vim。
在linux界,有两大编辑器最有历史。其一是vi,其二是emacs。vi现在已经演化成了vim,比当前的vi
更为强大。vim和emacs是两种截然不同的东西,vim强调用简洁的命令来完成功能,无论是查找、替换、
正则表达式匹配、编译、链接、排错、函数间跳转等等等等都在命令行中完成,并且它把方向键也集成在
了hjkl四个键之上,可以说,用了vim基本上可以不用鼠标了:p  emacs则是在功能强大上做文章,版本
控制、模拟多种编辑环境、对文本进行各种操作,可谓之一个强大的文本处理系统。emacs是用诸如
Ctrl+Alt+K 之类的组合键来控制的;vim则是用se(set 的缩写)等简洁命令来控制的。
   由于cygwin中只提供了vim(能不能自己装emacs我还没有试过),我们就先体验一下vim吧:p
vim加载文本文件后分为命令模式和插入模式两种。插入模式,顾名思义就是输入编辑文本;命令模式,则
是输入各种控制命令,常用的有:
   i  进入编辑模式
   h  左移
   j  下移
   k  上移
   l  右移
   w  存盘
   q  退出
   ! 强调执行

有些命令是可以组合使用的,如果你修改了某个文件,想存盘退出,则可以使用wq;如果你想放弃存盘,
直接退出则可以使用q!  好了大家体验一下吧,记住:从编辑模式退回命令模式按”Esc”,再按”:”,在输入指
令,从命令模式进入编辑模式用i,初次使用vim肯定很难受,嘿嘿,不过用多了就习惯了,确实很省劲。

我们编辑hello.c文件,输入:
#include <stdio.h>

int main(void) {
  printf( “Hello World!”);
}
然后,输入wq命令退到命令行。
输入编译指令:
# gcc hello.c -o hello
编译成功后可以看一下
# ls
看到hello.exe了吧,嘿嘿。
好,让我们运行看看。
# ./hello
效果如何?不错吧? :)

okey,现在玩一个C++的hello world,
# vim world.cpp
输入:
#include <iostream>
using namespace std;

void main() {
  cout << “Hello World!”;
}
编译C++程序要用g++
# g++ world.cpp -o world
运行一下哈,
# ./world

如何,效果不错吧?诸位都是高手,走到这步应该编些简单程序都不成问题了吧:p
好了,关于如何编写makefile文件,如何用gdb下次再说了。

《火影忍者》片尾曲WIND

NARUTO-ナルト-(火影忍者)TV版片尾曲(完整版)
名称:Wind
词/曲/歌:Akeboshi
Cultivate your hunger before you idealize.
Motivate your anger to make them all realize.
Climbing the mountain, never coming down.
Break into the contents, never falling down.

My knee is still shaking, like I was twelve,
Sneaking out of the classroom, by the back door.
A man railed at me twice though, but I didn’t care.
Waiting is wasting for people like me.

*Don’t try to live so wise.
Don’t cry ’cause you’re so right.
Don’t dry with fakes or fears,
’Cause you will hate yourself in the end.*

(Repeats*)

You say, “Dreams are dreams.
“I ain’t gonna play the fool anymore.”
You say, “’Cause I still got my soul.”

Take your time, baby, your blood needs slowing down.
Breach your soul to reach yourself before you gloom.
Reflection of fear makes shadows of nothing, shadows of nothing.

You still are blind, if you see a winding road,
’Cause there’s always a straight way to the point you see.

*Don’t try to live so wise.
Don’t cry ’cause you’re so right.
Don’t dry with fakes or fears,
’Cause you will hate yourself in the end.*

(Repeats*)

中文:
在幻想前激发你的渴望
刺激你的愤怒让它们变为现实
攀上山峰  永不退缩
进入新的世界 永不落后

膝盖还在发抖,如同十二岁时的我
从教室后门偷溜出去
我不在乎被责备两次
等待对我这种人来说是浪费时间

不要企图活的那么明白
不要哭泣 因为你是对的
不要用假话或恐惧拭干泪水
那样最终你会厌恶自己

(反复*)

你说,“梦就是梦”
“我不会再扮演傻瓜了。”
你说,“因为我还有灵魂。”

慢慢来,宝贝,你不要血气上涌
在你失望前突破灵魂 触到自己
比起恐惧的回忆 不完全的黑暗根本算不了什么,不完全的黑暗根本算不了什么

如果看到一条蜿蜒小路,你还是那么盲目
其实总有一条笔直的路指向你所见的地方

不要企图活的那么明白
不要哭泣 因为你是对的
不要用假话或恐惧拭干泪水
那样最终你会厌恶自己

http://music.51355.com/soft/music/1/2/3/火影忍者/22-wind.mp3

2004年07月14日

     7月12日的一场雨将我击倒!———不知道有多少程序员的朋友还有着刚毕业时的强健的体魄?所谓的高薪的背后带给我们的将是我们下半生的无尽的痛苦!

     仅仅是发烧(39.5),挂了2瓶水,就用掉了200多!

    房子贵我可以不买,但是病却必须看!

2004年07月13日

 第一部分  CVS服务器的配置(以1.10版)
       作者:吴炎溪  Email:Yanxi-Wu@21cn.com
1、CVS简述与CVS服务器的安装:
CVS是目前比较流行与优秀的版本管理与控制工具,它深受大多数开发人员与系统管理的喜爱,同时也是用来管理其它日常文档(如word工作文档之类)的一个强有力的工具。这一部分将对CVS服务器的安装、配置与使用方法进行简单、扼要的介绍,以帮助大家尽快的使用CVS来进行一些版本的管理与控制工作。
2、CVS服务器的安装
CVS服务器版可以从网上的很多地方下载到,也可以到CVS的官方网站进行下载。根据你所使用的系统,下载相应的版本,然后进行安装。因为当前大部分人是在Linux下使用CVS服务器进行版本管理,并且Redhat Linux是目前最流行的一个Linux发行版之一,所以本文将主要基于Redhat Linux进行介绍。首先下载CVS服务器的rpm包,当然也可以下载其它方式的包如源程序包,这也就是Linux的一个优点之一。然后采用以下命令进行安装:
rpm -ivh cvs-1.10.8-3.i386.rpm
3、配置/etc/services文件:
   安装完之后的第一件事就是要配置CVS服务器的配置文件,使其能正常的工作。首先在services文件中添加cvspserver,使其成为Linux的一种服务也就是cvs服务器例程的入口,配置如下:
cvspserver 2401/tcp # cvs client/server operations  
cvspserver 2401/udp # cvs client/server operations  
4、配置xinetd,用xinetd来启动CVS服务器:
进入到/etc/xinetd.d/目录,然后编辑一个文本文件,名字一定要与/etc/services中的入口名字cvspserver一致,所以这里用cvspserver作为文件名,文件的内容如下所示:  
service cvspserver
{
disable = no
socket_type = stream
wait = no
user = root
env = HOME=
server = /usr/bin/cvs
server_args = -f  –allow -root=/home/cvsroot pserver //指定认证方式为pserver,注意:-f
}
注意:a、service后面的名称一定要和你在/etc/service文件中的cvs服务名称一样;
b、env = HOME=这一行的目的就是为了解决在执行一些cvs操作时产生的读取/root/.cvsignore文件的错误,上面env那行的意思就是在运行cvs服务的时候将环境变量HOME置空,这样虽然执行cvs的用户是root,但是由于没有了HOME这个环境变量,所以cvs就不会在去读取/root/.cvsignore文件了。  
5、配置CVS用户与cvsroot的属主与属组:
首先建立一个用户组cvs,可以使用groupadd或者addgroup命名,也可以直接编辑/etc/group文件添加这个组,然后添加一个用户cvsroot, 然后修改/etc/passwd文件使cvsroot用户的缺省组是cvs组,而不是cvsroot组(也就是修改)。在/home目录下建立cvsroot目录(也可以在其它你喜欢的目录下建),然后修改/home/cvsroot的属主及属性:  
 #chown cvsroot.cvs /home/cvsroot  
 #chmod 771 /home/cvsroot
6、vs进行初始化:
安装完CVS服务器之后的另一件重要的事情就是要初始化CVS服务器的根目录,以后创建的CVS项目都将建立在这个目录下,采用的命令如下:
#cvs -d /home/cvsroot init
这样目录/home/cvsroot就成为CVS服务器的根目录,以后创建的目录都将默认的存放在这个目录下。
7、登录cvs服务器(在Linux或其它Unix系统下进行登录的情况):
a、如果是远程登录,采用以下语法:
#cvs -d :pserver:cvsroot@host:/home/cvsroot login
CVS password://输入用户cvsroot的口令;
如果没有出现其它的任何提示就表示登录成功了,否则要根据提示进行相应的修改。 下面对登录命令的语法进行说明:
其中,:pserver表示采用pserver方式进行用户登录认证,一般的CVS服务器都采用这
种方式,当然也可以采用其它方式,具体参考相应的资料;
    :cvsroot表示要登录的用户名,只要是cvs组的成员都可以,如:cather;
    @host表示要登录的服务器,可以是DNS名,也可以是IP地址,如:10.104.1.204;
:/home/cvsroot表示CVS在服务器上的目录,也可以是其它目录(由第6中你所
指定的用来做init初始化的目录决定);
提示:也可以把export CVSROOT=:pserver:jchuang@192.168.0.8:/home/cvsroot这一句直
接写在用户的初始化文件中(如:.bash_profile),这样用户每次登录时,只需输入:
#cvs login
   然后输入相应的口令就可以登录到cvs服务器上。
b、如果是本地登录,可以直接把export CVSROOT=/home/cvsroot这一句写在用户的初
始化文件如:.bash_profile中;然后直接
8、向CVS添加新的项目模块
一般我们都已经有一个或多个项目了,这样我们可以用下面步骤生成一个新的CVS项目。将一个工程文件置于CVs中进行版本控制,在CVS 术语中称作导入(import)。从名字上就可以看出,在导入前需要为此作些准备工作。
输入操作的基本要求是有个”干净”的目录结构。”干净”的意思是不需要版本控制的文件都被移走了(如编译生成的文件,备份文件等等)。如果工程已经开始一段时间了,这就显得很重要。在目录中也许有些是不打算将其置于版本控制下的文件,但是又想将他们放在这里,这种情况下,你要在输入之前将它们移走,然后再移回来。
  注意的是CVS 认为空目录是不存在的。如果想增加一个既不包含文件又不包含子目录的目录,需要在其下创建一个哑文件。建议你创建一个名为 README.txt 的文件,其内容为对目录的简要说明。
  进入到已有项目的目录,比如叫 cvstest:
  $cd cvstest
  运行命令将项目文件导入到cvs仓库中:
  $cvs import -m “this is a cvstest project” cvstest v_0_0_1 start
  说明:import 是cvs的命令之一,表示向cvs仓库输入项目文件.
  -m参数后面的字串是描述文本,对项目进行描述,如果不加 -m 参数,那么cvs会自动运行一个编辑器(一般是vi,但是可以通过修改环境变量EDITOR来改成你喜欢用的编辑器)让你输入信息,cvstest 是项目名称(实际上是仓库名,在CVS服务器上会存储在以这个名字命名的仓库里)
  v_0_0_1是这个分支的总标记.没啥用(或曰不常用)
  start 是每次 import 标识文件的输入层次的标记,没啥用。
  这样我们就在用户指定进行初始化的目录/home/cvsroot下建立了一个名字叫cvstest的CVS模块了,然后,我们可以把这个测试项目的文件删除,试验如何从仓库获取文件这会在后面的客户端文章进行说明。
(注:本小节主要引用自http://linuxaid.com.cn何伟平的“CVS服务器快速指南”)
9、从cvs本地服务器上checkout相应的模块:
  a、如果是在CVS服务器所在计算机上,可以直接采用如下命令:
     #cvs checkout stw
     这样将把stw项目模块checkout到当前目录下。
  b、如果是在远程运行Linux或其它Unix系统上,在第7中登录之后也可以用上边的命
令把相应的项目模块checkout到当前目录下。
  另外,如果是在windows端进行checkout,可以采用WinCVS,那么还要对WinCVS进行其它的一些配置,下一部分将具体介绍它的配置方法。

第二部分  WinCVS的配置与使用方法
1、WinCVS简介:
WinCVS是CVS的一个客户端软件,它运行在Windows上,用来在Windows上登录CVS服务器,然后进行一些CVS相关的操作与管理。由于当前很多的企业内部都采用Linux/Unix做服务器,而用Windows做客户端,所以,WinCVS与CVS服务器配合使用将组成最强有力的版本控制与管理的系统之一。
2、WinCVS的下载与安装;
  最新的WinCVS可以从http://sourceforge.net/project/showfiles.php?group_id=10072地址下载到,也可以在http://sourceforge.net/project 上下载到最新的或其它版本的WinCVS。
  下载到相应的版本后根据向导进行安装,已经要使用CVS的用户,安装这个WinCVS应该没什么问题吧!
3、配置WinCVS:
a、一般选项的设置,选择Admin->Preferences…,出现如下界面:
   
第一、Authentication:用来配置cvs服务器的认证方式,可以从下拉框中选择其它的认证方式,不过一般只要选择默认的pserver方式就可以,要注意的是必须与cvs服务器配置时所指定的认证方式一致;
第二、Path:用来配置cvs在服务器上的主目录路径,也就是服务器上用进行cvs初始化的目录,如:/home/cvsroot;
第三、Host Address:用来配置cvs服务器所在服务器的地址,可以是IP地址,也可以是DNS名,如:10.104.1.204;
第四、User name:用来配置要使用些WinCVS来登录CVS服务器的用户名,如:cvsyxwu,用户的登录必须由管理员把其添加cvs用户组中;
第五、CVSROOT:此项一般都不需要用户进行修改,用户在输入上边的几个选项时,系统将自动根据用户的输入生成此项的相应内容。
b、全局选项的设置,在上一个界面上选择“Globals”:
   
  此项的配置主要是要注意这几选项:
第一,Checkout read-only不要选上,否则,checkout出来的源代码将不允许用户进行
修改,并且此选项默认是选中的;
第二,Prune (remove) empty directories也不要选上,否则,会自动删除空目录;
第三,对一般配置没有特殊要求的,把Dirty files support、Supply control when adding
与TCP/IP compression选项选中;
4、登录服务器:
选择Admin->login,将出现如下对话框要求用户输入登录口令

输入口令后,选择“OK”按钮,如果CVS服务器与WinCVS的配置都没出错的话,将在CVS的状态栏中提示:
cvs -z9 -d :pserver:cvsyxwu@10.104.1.204:/home/cvsroot login
Logging in to :pserver:cvsyxwu@10.104.1.204:2401/home/cvsroot
***** CVS exited normally with code 0 *****
code 0表示正确的登录;而如果出错的话,将是code 1,那么要根据错误的提示进行相应的修改。
5、从CVS服务器上check out相应的模块:
第一,在workspace中的Modules选中要存放checkout模块的目录;
第二,选择Create->Checkout Modeles,将出现如下对话框:

其中,Module name and path on the server就是要存放checkout 内容的目录,由用户输入;而Local folder to checkout to就是第一中用户所选择的目录。
6、修改之后把文件提交到CVS服务器
a)、只有一个用户对文件进行修改的情况
用自己喜欢的编辑器对checkout出来的文件进行修改,修改之后的文件在没有提交之前会是红色的,如下图example.h文件:
    选中红色的文件example.h后右击选择“Commit Selection”选项,如果没有其它用户也对其进行修改并已经提交到CVS服务器上,一切正常的话将把example.h文件提交到CVS服务器并把图标恢复成原来的颜色。
  b)、两个或两个以上的用户对同一文件的不同部分进行修改的情况
这种情况就是如用户A与用户B都checkout了文件example.h,内容如下:
int callby (int count)
{
   printf(“ExcelStor!\n”);
}
void main(int argv,char *argc)
{
//added by my cvs
   printf(“I am Cather\n”);
}
int mainexample()
{
   printf(“OK\n”);
}
然后用户A修改成如下,并提交到CVS服务器(一般将正常提交):
int callby (int count)
{//add
   printf(“ExcelStor!\n”);
}
void main(int argv,char *argc)
{
//added by my cvs
   printf(“I am Cather\n”);
}
int mainexample()
{//add
   printf(“OK\n”);
}
接着用户B修改成如下:
int callby (int count)
{//add
   printf(“ExcelStor!\n”);
}
void main(int argv,char *argc)
{
//modified
   printf(“I am Cather\n”);
}
int mainexample()
{//add
   printf(“OK\n”);
}
当用户B选择“Commit Selection”时将提示:
cvs server: Up-to-date check failed for `example.h’
cvs [server aborted]: correct above errors first!
此时表明已经有用户对同一个文件example.h进行修改并提交到CVS服务器,这时
要先选择“Update Selection”对本地example.h与CVS服务器上的example.h文件进行
同步与合并,不用选中出现的任何选项,直接选择“OK”,这时将显示如下:
 cvs -z9 update example.h (in directory C:\my cvs\STW\src\)
RCS file: /home/cvsroot/STW/src/example.h,v
retrieving revision 1.5
retrieving revision 1.6
Merging differences between 1.5 and 1.6 into example.h
M example.h  

***** CVS exited normally with code 0 *****
     表明用户B与用户A的修改已经合并成功,同时文件example.h的图标也将变成红色,合并后的文件是存放在用户B的本地机上,为了更新到CVS服务器还必须选中example.h并右击选择“Commit Selection”才能把用户A与用户B的修改合并后的结果提交到CVS服务器上。注:M表示此文件已经被修改过。
 c)、两个或两个以上的用户对同一个文件的相同部分进行修改的情况
     这种情况就是如用户A与用户B都下载了文件example.h,内容如下:
void main(int argv,char *argc)
{
   printf(“I am Cather\n”);
}
然后用户A把文件修改成如下,并提交到CVS服务器(一般将正常提交):
void main(int argv,char *argc)
{
   printf(“I am Cather\n”);
   printf(“I am Pat\n”);
}
接着用户B又把文件修改成如下:
void main(int argv,char *argc)
{
   printf(“I am Cather\n”);
   printf(“I love you Cather\n”);
}
如果用户B这时选择“Commit Selection”准备把修改结果提交到CVS服务器,此
时将显示如下的错误提示:
  cvs -z9 commit -m “update in 11:20″ example.h (in directory C:\my cvs\STW\src\)
cvs server: Up-to-date check failed for `example.h’
cvs [server aborted]: correct above errors first!

***** CVS exited normally with code 1 *****
 表明用户B的修改与其它用户的修改冲突,这时要先选择“Update Selection”,将显示如下提示:
 cvs -z9 update example.h (in directory C:\my cvs\STW\src\)
RCS file: /home/cvsroot/STW/src/example.h,v
retrieving revision 1.9
retrieving revision 1.10
Merging differences between 1.9 and 1.10 into example.h
rcsmerge: warning: conflicts during merge
cvs server: conflicts found in example.h
C example.h
 
***** CVS exited normally with code 0 *****
 example.h前面的C表示与其它用户的修改有冲突,并且文件的图标会加显示一个“C”,如下所示:
 
双击example.h将显示example.h的内容,如下:
  void main(int argv,char *argc)
{
   printf(“I am Yanxi\n”);
   printf(“I am Cather\n”);
<<<<<<< example.h
   printf(“I love you Yanxi,too!\n”); //这部分为你的修改
=======
   printf(“I love you Cather!\n”); //这部分为其它用户的修改
>>>>>>> 1.10
}
这时你应该与用户A进行协商以决定最终要怎样修改。比如,可以修改成:
void main(int argv,char *argc)
{
       printf(“I am Yanxi\n”);
   printf(“I am Cather\n”);
   printf(“I love you Yanxi,too!\n”); //这部分为你的修改
   printf(“I love you Cather!\n”); //这部分为其它用户的修改
}
然后选择“Commit Selection”进行提交,将显示如下的提示信息:
cvs -z9 commit -m “update in 11:20″ example.h (in directory C:\my cvs\STW\src\)
Checking in example.h;
/home/cvsroot/STW/src/example.h,v  <–  example.h
new revision: 1.11; previous revision: 1.10
done

***** CVS exited normally with code 0 *****
表明用户A与用户的修改已经合并成功。

这样,向CVS服务器提交文件所会遇到的问题也基本上就是这些,用户要根据所遇到的实际问题进行修改。
7、向CVS服务器添加新文件
   在本地添加文件后,要提交到服务端。先选中文件,然后点击“添加按钮”,添加文件后,再在右键菜单中选择提交命令“Commit Selection”即可。
   
如图,选中文件example.h.bak,因为example.h.bak当前不是CVS的文件,此时“添加按钮”将由不可选状态变成可选状态,所以Status中显示为“NonCvs file”,选择“添加按钮”之后example.h.bak图标将变成红色并增加了一个A字母,如下:
   
然后选中example.h.bak,右击,选择“Commit Selection”把文件example.h.bak提交到CVS服务器上而成为CVS的一个文件。
8、结束语
来到这里,你基本上已经能为自己或公司配置一个实用的CVS服务器与WinCVS客户端,配合使用CVS进行系统开发或其它文档的版本管理与控制。 

———————————————————————————

linux下常用CVS命令整理

1.登录:
$export  CVSROOT=:pserver:username@the_server_name:/home/cvsroot  
Note:pserver是访问方式,如果服务器设置的是口令认证,则是 pserver。
      username是  CVS服务器的用户名,可以根据你的设置修改;
      the_server_name是CVS服务器的名称或者IP地址;
      /home/cvsroot是你的CVS服务器的CVSROOT目录,根据你的CVS服务器设置做修改或者询问管理员.
登陆CVS服务器:  
$cvs  login
 
这时候cvs会问你口令,请把你在CVS服务器上的口令敲进去:
Passwd:xxxxxxxx
登陆成功***** CVS exited normally with code 0 *****
 
2. 提交项目–import
   cvs import [-options] repository vendortag releasetag…
Note: 该命令将当前目录下的所有文件(包括子目录)导入源代码储存库。
    repository :项目名称,在CVS服务器上会创建以这个名字命名的仓库。
    vendortag :  项目分支的总标记。(不常用)
    releasetag :标识文件的输入层次的标记。 (一般用start)
  使用import提交项目的时候,CVS会要求对项目进行说明。在默认状态下,CVS会弹出文本编辑器。用户也可以用-m “log_message”来输入说明信息。
例如
$cvs import -m “upload the first time as new module” judecvs v_0_0_1 start
 
提示:import 一般在第一次导入module时使用。后期修改文件后可直接使用commit命令提交修改的文件。
  
3. 从CVS导出项目–checkout
   cvs checkout [options] modules…
 
   此命令将源代码储存库中已有的项目导出到当前目录。
    modules :项目名称
例如,从仓库中检索出judecvs项目的源文件. 
$cvs  checkout  judecvs
 
4.CVS 主要命令—update 更新当前工作目录中的文件
  cvs update [-options] [files...]
 
  此命令比较指定CVS源码库中的文件和当前目录下的文件,如果CVS源码库中有更高版本的源文件,则更新当前目录下的文件。此命令只有在checkout命令使用过后才能使用。
   在执行update命令时,CVS并不是简单的将新版本覆盖当前文件,而是试图将新版本所做的修改添加到当前文件中去。如果发生冲突,CVS会以字符串“<<<<<<”和“>>>>>>”来表示冲突发生。这时候你可以修改文件,重新提交。
提示:如果你已经做过一次checkout了,那么不需要重新checkout,只需要进入cvstest项目的目录,更新一把就行了:
  
例如:
$cd  judecvs  
$cvs  update
 
5.CVS 主要命令—status 如果你不想直接更新,只是想看看有没有更新的东西,那么:  
$cvs  status
会给每个文件有一份状态报告,类似这样:  
==================================================
File:  client.c                    Status:  Up-to-date  
      Working  revision:        1.1.1.1  ‘Some  Date’  
      Repository  revision:  1.2          /home2/cvsroot/judecvs/client.c,v
  
这里最重要的就是  Status  栏,这里总共可能有四种状态:  
Up-to-date:表明你要到的文件是最新的.  
Locally  Modified:表明你曾经修改过该文件,但还没有提交,你的版本比仓库里的新.  
Needing  Patch:表明有人已经修改过该文件并且已经提交了!你的版本比仓库里的旧.  
Needs  Merge:表明你曾经修改国该文件,但是别人也修改了这个文件,而且还提交给仓库了!
 
6.CVS 主要命令—commit 保存修改到CVS中
 
cvs commit  [-lnR]  [-m 'log_message' | -f file] [-r revision] [files...]
   此命令将当前目录下的源代码与CVS中最新版本比较,并进行更新。
   [-m ‘log_message‘ ] :输入修改说明。
   [-r revision] :指定版本。
   [files...] :指定修改文件。
 
$cvs  commit  -m  “add XXX function”   client.c
 
系统会提示
CVS: ———————————————————————-
CVS: Enter Log.  Lines beginning with `CVS:’ are removed automatically
CVS:
CVS: Committing in .
CVS:
CVS: Modified Files:
CVS:    client.c
CVS: ———————————————————————-

 
退出后,系统询问是否continue,输入c,则完成checkin  
Log message unchanged or not specified
a)bort, c)ontinue, e)dit, !)reuse this message unchanged for remaining dirs
Action: (continue) c
Checking in client.c;
/home2/cvsroot/judecvs/client.c,v  <–  client.c
new revision: 1.2; previous revision: 1.1
done

 
如果CVS上文件已经有其他人更新,也就是我当前工作的不是最新版本,系统提示commit失败,这时候需要先update,然后把整合文件再commit.
cvs server: Up-to-date check failed for `client.c’
cvs [server aborted]: correct above errors first!
cvs commit: saving log message in /tmp/cvsCEjA9N
 
提示:修改文件之前先update或者先查看文件状态,确认当前工作版本是最新版本。
 
7.添加文件到项目中—add 
   cvs add [-k kflag] [-m 'message'] files…
    此命令并不真正添加文件,只是将文件注册到项目中,要真正添加文件,还要使用commit命令。
 例如:
$cvs add -m “test add” testadd.c
 
提示:
cvs server: scheduling file `testadd.c’ for addition on branch `v_0_0_2′
cvs server: use ‘cvs commit’ to add this file permanently

 
$cvs commit
同commit过程一样,CVS将testadd.c添加到项目中
 
8.CVS 主要命令—remove 从项目中删除文件
  cvs remove [-k kflag] [-m 'message'] files…
   和add命令一样,此命令并不真正删除文件,只是将文件从项目中取消,要真正删除文件,还要使用commit命令。
  e.g.
  $rm testadd.c
  $cvs rm testadd.c
系统提示
cvs server: scheduling `testadd.c’ for removal
cvs server: use ‘cvs commit’ to remove this file permanently

 
 $cvs  commit testadd.c
 此时,CVS才将testadd.c从项目的最新版本中删除,但是如果它有以前的版本,以前版本依然存在。
 

cvs使用心得

今天开始搭建环境,考虑到clearcase使用起来太繁琐,况且四个人开发也用不到那么复杂的功能,我们决定寻求新的管理工具。

于是开始装sourceSafe,装完了之后一通调,就是不让用户登录,为了不耽误时间,我们决定采用新的版本管理工具—-cvs。

安装过程很简单:点击cvsnt-2.0.34.ex一路下一步就装上了,然后就遇到配置的问题,据我回忆添加cvs的资源是在repositories里边,于是果然就在这里边加上了D:\DVESG_base.

然后是winCVS,装上以后,不管怎么配,就是连不上。其实后来发现,CVSROOT这个路径有点问题,应该写成::pserver:yyh@dvesg:2401:d:\DVESG_base,因为在windows下边搭建的server,又有d:\DVESG_base这样的repository名字,所以才出现这样的问题。这样的连接容易出问题的地方在2401后边那个冒号,因为填好以后那个冒号往往不会被自动生成出来。

后来大家又感觉winCVS不太好用,改了TortoiseCVS,这个东东比较好,用各种颜色显示文件的各种状态,同时执行check out,check in又比较方便。

这让我想起头些天在使用dbf的驱动程序连接dbf文件的时候无论怎么写url就是连不上这件事情,还好今天这个东东试了两下就出来了。

对于这类连接,主要是个符号问题,windows下边用\作路径分隔符,而在linux下边则用/作分隔符,在java里边//和\\作分隔符似乎是一样的效果,又涉及到:、@这样的东东,所以很容易搞错,一定要注意。还有可能就是要注意一些规则,写的时候要尽量猜一下。

好,现在系统的目录也设好了,客户端也能够连接上了,那剩下的工作就主要是版本管理相关的配置了。

首先是上传资源,kesney通过TortoiseCVS将项目文件进行提交,我们分别进行update,然后修改文件,然后提交,然后设定标签,然后是可以查看历史,然后是可以更新某一标签的版本。

呵呵,经过我们四个的一同摸索,终于弄出一个眉目,明天要正式干活了!!!

2004年07月01日

在这样的天气里,想起她的签名来:
记得那年花下深夜初识谢娘时水堂西面画廉垂携手暗相期惆怅晓莺残月相别从此隔音尘如今但是异乡人相见更无因

能知道这句,应是知晓韦庄的吧?因而还是放在这里吧,因为总是有不相干的人来问,为什么?为什么没有断句?

还是因为师太在她的玫瑰阿姨的家中似乎也是这样写着的吧。

*************************************************************
荷叶杯
                      
韦庄

绝代佳人难得,倾国,花下见无期。一双愁黛远山眉,不忍更思惟。
闲掩翠屏金凤,残梦,罗幕画堂空。碧天无路信难通,惆怅旧房栊。
记得那年花下,深夜,初识谢娘时,水堂西面画帘垂,携手暗相期。
惆怅晓莺残月,相别,从此隔音尘。如今俱是异乡人,相见更无因!