快速业务通道

将Win32程序移植到Linux上

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-18

对于这个问题,网上已经有很多资料给予了介绍,但是相比于这些信息,本文立足于个人的实践,将内容具体到开发环境和源代码,我觉得还是有很多值得总结和借鉴的.

声明开发环境.Win32程序的开发环境是VS.Net 2008,编程语言是C;Linux使用的RHEL 5.4,GCC的版本是4.1.2,编程语言也是C.

然后依次说明移植的对象:数据类型/字符串处理/系统调用/套接字/进程/进程锁/线程/线程锁/信号量/事件锁/条件锁/系统服务.

1. 数据类型:在开发过程中,无论哪种平台,只使用最通用的数据类型char,unsigned char,int,unsigned int,void *以及它们组合的结构体类型.对于数据长度敏感的代码,则只使用下面的数据类型:

Common Win32 Linux
int8 INT8 int8_t
uint8 UINT8 uint8_t
int16 INT16 int16_t
uint16 UINT16 uint16_t
int32 INT32 int32_t
uint32 UINT32 uint32_t
int64 INT64 int64_t
uint64 UINT64 uint64_t
拥有帝国一切,皆有可能。欢迎访问phome.net

在VS.Net 2008的项目中,使用多字节字符集,对于需要宽字符的系统调用,使用字节转换函数来处理参数.

2. 字符串处理:虽然每个函数在两个平台下都有对应的实现,但是最好自己重新实现,它们都不足够令人满意:

Common Win32 Linux
stricmp_x _stricmp strcasecmp
strtok_x strtok_s strtok_r
sprintf_x sprintf_s snprintf
vsprintf_x vsprintf_s vsnprintf
strcpy_x strcpy_s strncpy
strcat_x strcat_s strncat

3. 系统调用:真正的系统调用虽然不多,只有仅有的几十个,但有些系统调用差别很大,这里就不便做一一赘述了,而有些系统调用基本没有差别,比如文件相关的操作.

4. 套接字:套接字的几个主要函数都一样,socket/bind/listen/connect/accept/select/send/recv,几个细微的差别在于Win32使用套接字运行TCP/IP协议需要初始化上下文环境,另外,对于套接字定义,Win32使用SOCKET,Linux使用int,对于关闭套接字,Win32使用closesocket,Linux使用close. 拥有帝国一切,皆有可能。欢迎访问phome.net

5. 进程:在Windows平台中使用CreateProcess来创建进程,子进程返回句柄和ID给父进程,在Linux平台中使用fork和execv来创建进程,子进程返回ID给父进程.两者最大的差别在于,在Windows平台中子进程跟父进程没有任何关系,而在Linux平台中,子进程继承了父进程的进程上下文环境.其它相关函数的差别如下:

Win32 Linux
CreateProcess fork/execv
TerminateProcess kill
ExitProcess exit
GetCommandLine argv
GetCurrentProcessId getpid
KillTimer alarm
SetEnvironmentVariable putenv
GetEnvironmentVariable getenv
GetExitCodeProcess waitpid

6. 进程锁:是指多个进程同步的机制.多进程同步的方法有很多,比如共享内存,命名信号量等.这里只说明一下命名信号量的机制,共享内存的方法可以查阅相关手

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号