Archive for June, 2007

Unexpected error while installing Sybase ASE 15.0 for Linux in RHEL AS4

为了方便以后测试程序,昨天开始装RHEL4的虚拟机。
工作中用的服务器环境不是我装的,安装过程中遇到并解决了一点问题也算小有收获。

Red Hat的Enterprise Linux AS4算是比较成熟的商用Linux系统,整个安装过程十分顺利,为了确保以后安装Sybase等其他大型软件的方便,需要给虚拟机分配至少4G的虚拟硬盘空间。

安装Sybase之前,现创建了sybase用户和sybase组,sybase用户的根目录在/home/sybase下。同时在/opt下创建了sybase目录,供sybase程序使用,需设置chown sybase:sybase /opt/sybase

然后用sybase用户登录,安装Sybase ASE 15.0 for Linux。安装的时候最好选择custom方式,默认安装不包括ESQL/C的支持。
接下来的配置都比较简单,可以自己设置,也可以直接选择默认值。由于我只是在虚拟机下供测试用,所以我只装了Adaptive Server服务,其他的服务都没有装。

程序文件复制结束,安装程序会自动配置数据库,就在配置的时候报错了。
“/opt/sybase/ASE-15_0/bin/dataserver: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory”

看来是libstdc++的库文件不兼容,于是就复制RHEL4 disc2中RPMS下的compat-libstdc++-33-3.2.3-47.3.i386.rpm和libstdc++-3.4.3-9.EL4.i386.rpm,并用rpm -Uvh *.rpm安装(我的安装是在X环境下进行的,所以出错之后没有退出),接着重试了配置数据库,就成功了。

手工启动数据库的命令在/opt/sybase/ASE-15_0/install/下,名为RUN_*,*为你的服务器名字。

默认情况下sybase只在127.0.0.1地址下监听TCP端口,所以在其他机器上是不能访问的,需要修改/etc/hosts文件中的域名解析。(如果启用了iptables,还需要开放sybase端口)

Leave a Comment

useful tips about sscanf

大家可能都或多或少在C/C++语言中用过sscanf处理字符串,不过我倒用得不多,上次用这个函数还是半年前了。
这回有同事在用sscanf读取一串字符到一个结构体,以填充结构体的各个项,测试时发现sscanf会过滤掉开头的空白字符。
比如有如下结构体:
typedef struct tagT
{
char a[3+1];
char b[5+1];
char c[3+1];
} T;
还有如下字符串:
char *s = “01 2 “;
用如下方法读取:
T t;
memset(&t, 0×00, sizeof(T));
sscanf(s, “%3s%5s%3s”, &t.a, &t.b, &t.c);
printf(“a=/%s/\tb=/%s/\tc=/%s/\n”, t.a, t.b, t.c);
运行之后,会发现读入的字符串跟想像中的不一样:
a=/01/ b=/2/ c=//
而我想要的结果是:
a=/01 / b=/ / c=/ 2 /

这里的问题解决方法非常简单,只要把”%3s%5s%3s”中的s改成c即可,在sscanf中,%s是遇到非空格字符才开始读取的,直到读取到空格字符结束,而%c会把空格也读进来。

正确的解法是:
sscanf(s, “%3c%5c%3c”, &t.a, &t.b, &t.c);

而通过这个问题,发现了一个使用sscanf函数滤掉字符串首尾空格的方法,即sscanf(str, “%s”, str);

Leave a Comment