`
webcenterol
  • 浏览: 913727 次
文章分类
社区版块
存档分类
最新评论

将 Win32 程序移植到 Linux

 
阅读更多

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

首先声明开发环境。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

<!--EndFragment--><!--EndFragment-->

在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

<!--EndFragment--><!--EndFragment-->

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

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

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

<!--EndFragment-->

6. 进程锁:是指多个进程同步的机制。多进程同步的方法有很多,比如共享内存,命名信号量等。这里只说明一下命名信号量的机制,共享内存的方法可以查阅相关手册。Win32比较简单,在CreateMutex的参数中输入相应名称即可,Linux中,则可使用System V IPC的semget/semctl/semop操作,具体步骤直接man之。

7. 线程:线程同步、等待函数、线程本地存储以及初始化和终止抽象是线程模型的重要部分。主要对应函数列表如下:

Win32

Linux

_beginthreadex

pthread_create

_endthreadex

pthread_exit

TerminateThread

pthread_cancel

GetCurrentThreadId

pthread_self

<!--EndFragment--><!--EndFragment-->

8. 线程锁:对应函数列表如下。另外,特别注意的是,Win32的mutex在缺省情况下是可以递归加锁和解锁的,但是pthread的mutex在缺省情况下则不能,需要在pthread_mutex_init时设置pthread_mutexattr_t参数。

Win32

Linux

CreateMutex

pthread_mutex_init

CloseHandle

pthread_mutex_destroy

WaitForSingleObject

pthread_mutex_lock

ReleaseMutex

pthread_mutex_unlock

<!--EndFragment-->

9. 信号量/事件锁/条件锁:这三个同步机制功能比较相似,甚至可以相互实现。除了这三种同步机制外,各个平台上还有一些专有的同步机制。Windows平台上有信号量和事件锁,但是没有条件锁,直到Windows 2008 Server上才会有。Linux平台上有信号量和条件锁,但是没有事件锁。在一些特定场合下,没有的同步机制只能通过已有的同步机制去实现:

Common

Win32

Linux

Semaphore

CreateSemaphore

pthread_mutex_init
pthread_cond_init
(implement)
orsem_init

Event

CreateEvent

pthread_mutex_init
(implement)

Condition

CreateSemaphore
(implement)

pthread_cond_init

<!--EndFragment-->

10. 系统服务:在Windows中,系统服务叫service,可以通过管理工具,或者运行services.msc进入管理界面,可以安装,卸载,启动,停止和重启。在Linux中,系统服务叫daemon,一般通过命令service ??? start/stop/restart来启动,停止和重启,同样也可以安装和卸载。Windows服务可以通过SCM(Service Control Management)架构来实现,Linux服务则需要编写chkconfig相关的脚本来实现。注意,不同的Linux发行版,比如RHEL和SLES,实现脚本是不一样的。

转载声明: 本文转自 http://csynine.blog.51cto.com/1388509/310927

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

Linux下定义windows常用数据类型

分享到:
评论

相关推荐

    win32 程序移植到linux上

    将 Win32 C_C++ 应用程序迁移到 POWER 上的 Linux,第 1 部分_ 进程、线程和共享内存服务。对比windows、linux进程、线程、共享内存的API。

    linux pthread 库在移植到win32和测试程序

    linux pthread 库在移植到win32和测试程序 pthread的函数使用正常

    将Linux代码移植到Windows的简单方法

    Linux拥有丰富各种源代码资源,但是大部分...本文将以一个实际的例子(Tar)来说明如何把Linux代码移植到 Windows平台上。移植过程将尽量少修改代码,以便代码的运行逻辑不会发生任何变动。保留绝大部分软件主要功能。

    将Windows动态链接库移植到Linux-C/C++开发

    将Windows Dynamic Link库移植到Linux简介此存储库包含一个库,该库允许本机Linux程序从Windows DLL加载和调用函数。 作为演示,我已将Windows移植Windows动态链接库移植到Linux简介此存储库包含一个库,该库允许本...

    商业编程-源码-一个可移植的(Win32 Linux)邮件接收(支持POP3协议)程序.zip

    商业编程-源码-一个可移植的(Win32 Linux)邮件接收(支持POP3协议)程序.zip

    libusb 源码(win32 & linux USB开发)

     2 当我们要把linux移植到嵌入平台上,你会发现原先linux自 带的驱动移过去还挺大的,我的内核当然是越小越好拉,这样有必要么。这还不是最郁闷的地方,如果嵌入平台是客户的,客户要购买你的产品,你突然发现客户...

    FFmpeg_win32开发库和头文件

    FFmpeg win32开发库和头文件  FFmpeg是一套可以用来录制、转码音视频,并能将其转化为流的开源流媒体程序。采用LGPL或GPL许可证。它包含了非常先进的音频/视频编解码库,为了保证高可移植性和编解码质量,里面的很...

    一个可移植的(Win32/Linux)邮件接收(支持POP3协议)程序VC源代码

    本程序是一个可移植的(Win32/Linux)邮件接收(支持POP3协议)程序,并编写了可移植SOCKET和POP3封装类,希望能为初学者提供一些帮助。编译:Win32: 在VC++6.0下编译通过,并运行良好。Linux: 在G++下编译通过,请查看...

    windows环境下32位汇编语言程序设计

    只不过使用的方式不再是中断方式而已,这不是Win32汇编语言“高级化”了,而是高级语言因为使用Windows的API接口而“低级化”了,其代价就是无法移植到其他系统,用Visual C++写的程序是无法移植到其他操作系统平台...

    windows向linux移植中可能会遇到的3个问题

    在路径中斜杠/和反斜杠/的使用,在WIN下,系统和编译器都能识别正反斜杠,所以怎么用都无所谓;但是在LINUX下,只能识别斜杠/,所以在写代码时,路径分隔符请不要使用反斜杠/,而都应当用斜杠/. 2.字符串结尾符 3.大小端问题

    soem主站源码纯C代码编写,方便移植

    SOEM最新源码。支持多种操作系统(包含Linux,win32,以及各种实时系统等),可供下载

    pthread-win32.rar

    window平台可以使用和linux环境下一样的poisx接口编程,适用于使用linux开发的程序,移植到windows超级方便,posix下标准pthread接口如pthread_create,pthread_mutex_lock,pthread_rwlock,sem_post等接口直接支持,跨...

    基于Microwindow的嵌入式应用程序开发.pdf

    GUI系统概述 Linux平台下GUI系统X-Windows Microwindows整体架构分析 Microwindows开发环境配置 基于Nano-X API应用程序开发 基于Win32 API 应用程序开发

    yasm-1.1.0-win32

    程序移植时必不可少的组件,例如ffmpeg由linux移植到window上

    AirCrack-NG-1.2-win

    Aircrack-ng是一个与802.11标准的无线网络分析有关的安全软件,主要功能有:网络侦测,数据包嗅探,WEP和WPA/WPA2-PSK破解。...Linux版本已经被移植到了Zaurus和Maemo系统平台, 并概念验证可移植到iPhone。

    mingw-w64-v11.0.0.zip

    它实际上是将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下,并且包含了 Win32API ,因此可以将源代码编译为可在 Windows 中运行的可执行程序。而且还可以使用一些 Windows 不具备的,Linux平台下的开发工具...

    GCC编译器mingw版本v10.0.0

    MinGW(Minimalist GNU on Windows),将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下,并且包含了 Win32API ,因此可以将源代码编译为可在 Windows 中运行的可执行程序。而且还可以使用一些 Windows 不...

    mingw64 Minimalist GNU on Windows

    它实际上是将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下,并且包含了 Win32API ,因此可以将源代码编译为可在 Windows 中运行的可执行程序。而且还可以使用一些 Windows 不具备的,Linux平台下的开发工具...

    cygwin 桌面unix

    它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌入式系统开发,非常有用。随着嵌入式系统开发在国内日渐流行,越来越多的...

    mingw64安装包(gcc/g++...)

    MinGW,全称Minimalist GNU for Windows,是一个可自由使用和自由发布的Windows特定...MinGW又称mingw32,是将GCC编译器和GNU Binutils移植到Win32平台下的产物,包括一系列头文件(Win32 API)、库和可执行文件。

Global site tag (gtag.js) - Google Analytics