将 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 |
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 |
| Win32 | Linux |
| CreateMutex | pthread_mutex_init |
| CloseHandle | pthread_mutex_destroy |
| WaitForSingleObject | pthread_mutex_lock |
| ReleaseMutex | pthread_mutex_unlock |
| Common | Win32 | Linux |
| Semaphore | CreateSemaphore | pthread_mutex_init? |
| Event | CreateEvent | pthread_mutex_init? |
| Condition | CreateSemaphore? | pthread_cond_init |
本文轉自:http://csynine.blog.51cto.com/1388509/310927
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的将 Win32 程序移植到 Linux的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络编程--Address alread
- 下一篇: Qt程序打包发布方法(使用官方提供的wi