Chinaunix首页 | 论坛 | 博客
  • 博客访问: 336307
  • 博文数量: 32
  • 博客积分: 1470
  • 博客等级: 上尉
  • 技术积分: 575
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-31 11:38
个人简介

实践主义者,多行路远胜于多读书。

文章分类

分类: C/C++

2014-09-09 15:22:16

记得这个问题是发生在一个警急的项目上,从发现到解决时间在一个小时左右。
以下是事后追补的说明文档,贴在这:
----------------------------------------------------------------------------------------------------------------------

下午接到一项目现场工程师的电话,说有两台Debian的服务器不能发送短信,但另外有一台服务器CentOS5是正常的。
我们发送短信的方案是将短信猫通过串口接入Linux服务器,然后通过PDU协议发送出去。
在排除了短信猫没接好,或者使用的不是中国移动SIM卡这种非技术故障后,我开始翻查实现代码,
看是否代码中会有特殊的环境和类库上的要求(因为CentOS5在现场是正常的)。

考虑到项目紧急,会马上有演示的需求,所以用QQ协作,连上现场工程师的桌面,然后用SSH连至服务器,跟踪日志。
发现程序确实按需进入到了发短信的代码,但却没有正常执行。
于是,用最笨的办法开搞,通过增加打印日志的方式,重新编译程序传过去运行,
发现最后是 mbstowcs() 系统库函数返回失败,这是中文转换的问题。
我发现程序中是强制指定源为GB18030:


点击(此处)折叠或打开

  1. setlocale(LC_CTYPE,"zh_CN.GB18030");



通过命令行设置语言环境,发现报错。过程大致是:
执行:export LANG='zh_CN.GB18030'
然后运行:locale 
如果输出中有类似这样的行,则表示系统不支持GB18030:
locale: Cannot set LC_CTYPE to default locale: No such file or directory


查看了系统中的中文字符库目录/usr/share/i18n/,发现有GB18030的文件:
奇怪了,于是继续度娘。找到了这样的说明:
修改 /etc/locale.gen 
注: 这个文件在我的CentOS上没有发现。


将GB18030的那行取消注释,保存,再执行 locale-gen 命令。
会有这样的输出:

Generating locales (this might take a while)...
  zh_CN.GB18030... done
  en_US.UTF-8... done
Generation complete.

重新启动程序,问题触决了。

阅读(3077) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~