zoukankan      html  css  js  c++  java
  • 将 Win32 程序移植到 Linux


    http://blog.csdn.net/ithomer/article/details/6271572


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

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

    在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。

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

    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

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


    Common

    Win32

    Linux

    Semaphore

    CreateSemaphore

    pthread_mutex_init 
    pthread_cond_init 
    (implement) 
    or sem_init

    Event

    CreateEvent

    pthread_mutex_init 
    (implement)

    Condition

    CreateSemaphore 
    (implement)

    pthread_cond_init

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


    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(131) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    图形设计 X11
    软件安装 RPM SRPM YUM
    如何将excel表格中的纯数字删掉 空白行,然后删除
    考试机
    程序编译与运行
    基础设定与备份策略
    开机流程 模块管理 Loader
    让所有Excel数据格全部乘 某个数
    转:JDK1.8-Stream()使用详解
    转:IK分词原理
  • 原文地址:https://www.cnblogs.com/ztguang/p/12648736.html
Copyright © 2011-2022 走看看