`
king_tt
  • 浏览: 2259322 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

将 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++应用程序移植到Linux上时,我们需要注意两个主要操作系统间在进程、线程以及共享内存服务方面的差异。以下详细说明了这些方面的API映射及相关知识点。 首先,关于初始化和终止。在Win2K/NT环境...

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

    然而,Windows系统采用的是不同的线程API,这使得将Linux上的pthread库移植到Win32系统时需要进行一定的适配工作。本文将深入探讨如何进行这一过程,并介绍在Windows环境下测试pthread程序的关键点。 1. Pthread库...

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

    【将Linux代码移植到Windows的简单方法】 在IT领域,跨平台编程是一个常见的需求,特别是当需要将Linux上的代码应用于Windows环境时。由于Linux和Windows操作系统底层架构和库的差异,移植C/C++代码并不简单。然而...

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

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

    win32linux相互移植网络编程需要注意的地方(转).pdf

    在进行跨平台网络编程,尤其是从Win32移植到Linux或者反之,需要注意多个关键差异,以确保代码的兼容性和正确性。以下是一些主要的关注点: 1. **宏定义兼容**: 在不同平台上,数据类型和常量的定义可能不同。...

    win32linux相互移植网络编程需要注意的地方(转)分享.pdf

    "win32linux相互移植网络编程需要注意的地方" 1. 宏兼容代码写法: 在win32和linux平台之间进行网络编程时,需要注意宏的兼容性问题。例如,在win32平台下,需要使用`#ifdef WIN32`来定义`socklen_t`和`ssize_t`...

    win32linux相互移植网络编程需要注意的地方(转)[参考].pdf

    在进行跨平台的网络编程,尤其是在Win32和Linux之间移植代码时,需要注意多个关键差异。以下是这些差异的详细说明: 1. **宏定义和数据类型兼容性**: 在不同平台上,数据类型和宏定义可能不同。例如,Win32使用`...

    linux和win32下通用的互斥锁Mutex封装

    3. `mutex_win32.cpp`:实现了Mutex类在Windows环境下的逻辑,可能使用了CreateMutex或InitializeCriticalSection等API。 4. `test_mutex.cpp`:测试程序,展示了如何在实际应用中使用Mutex类。 使用这个封装库时,...

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

    该压缩包包含的是一个可移植的邮件接收程序,它支持POP3协议,可以在Windows(Win32)和Linux操作系统上运行。这个程序的核心是通过POP3协议与邮件服务器进行通信,实现邮件的下载和管理。POP3(Post Office ...

    基于嵌入式linux的xilinx FPGA的PCIE接口移植与测试

    总之,基于嵌入式Linux的Xilinx FPGA的PCIe接口移植与测试涉及到硬件配置、驱动程序的编写或移植、以及系统的功能验证。通过这两种访问模式,开发者能够实现高效、可靠的CPU与FPGA间的交互,这对于高性能计算和实时...

    pthread-win32演示程序

    然而,为了在Windows上实现跨平台的多线程编程,开发者可以借助pthread-win32库,这是一个移植自Unix/Linux的pthread接口到Windows的实现。"pthread-win32演示程序"就是基于这个库创建的一个示例,旨在帮助开发者...

    windows移植linux总结

    在IT行业中,跨平台开发是一项重要的任务,尤其是将软件从Windows环境移植到Linux系统。本文将深入探讨这一过程,涵盖文档、API对比、内存泄漏工具以及处理方法。 首先,移植的文档是整个移植过程的基础。这包括源...

    libusb 源码(win32 & linux USB开发)

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

    Linux应用程序向Windows CE平台移植的研究与实现.pdf

    当需要将Linux上的应用程序移植到Windows CE平台时,会面临硬件兼容性、逻辑结构和API接口等方面的挑战。Linux和Windows CE的硬件架构、驱动模型以及操作系统API都有显著的差异。在硬件层面,Linux通常依赖于开放源...

    Linux下regex移植,Linux和windows可通用

    本教程将深入探讨如何将Linux下的regex功能移植到Windows系统,使程序在两个平台上都能正常工作。 首先,我们要理解Linux和Windows之间关于regex实现的主要差异。在Linux中,通常使用POSIX标准的`&lt;regex.h&gt;`库,它...

Global site tag (gtag.js) - Google Analytics