将 Win32 程序移植到 Linux
首先聲明開(kāi)發(fā)環(huán)境。Win32程序的開(kāi)發(fā)環(huán)境是VS.NET 2008,編程語(yǔ)言是C;Linux使用的RHEL 5.4,GCC的版本是4.1.2,編程語(yǔ)言也是C。
然后依次說(shuō)明移植的對(duì)象:數(shù)據(jù)類型/字符串處理/系統(tǒng)調(diào)用/套接字/進(jìn)程/進(jìn)程鎖/線程/線程鎖/信號(hào)量/事件鎖/條件鎖/系統(tǒng)服務(wù)。
1. 數(shù)據(jù)類型:在開(kāi)發(fā)過(guò)程中,無(wú)論哪種平臺(tái),只使用最通用的數(shù)據(jù)類型char,unsigned char,int,unsigned int,void *以及它們組合的結(jié)構(gòu)體類型。對(duì)于數(shù)據(jù)長(zhǎng)度敏感的代碼,則只使用下面的數(shù)據(jù)類型:? ? ? ? ? ?
| 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. 字符串處理:雖然每個(gè)函數(shù)在兩個(gè)平臺(tái)下都有對(duì)應(yīng)的實(shí)現(xiàn),但是最好自己重新實(shí)現(xiàn),因?yàn)樗鼈兌疾蛔銐蛄钊藵M意:
| 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. 系統(tǒng)調(diào)用:真正的系統(tǒng)調(diào)用雖然不多,只有僅有的幾十個(gè),但有些系統(tǒng)調(diào)用差別很大,這里就不便做一一贅述了,而有些系統(tǒng)調(diào)用基本沒(méi)有差別,比如文件相關(guān)的操作。
4. 套接字:套接字的幾個(gè)主要函數(shù)都一樣,socket/bind/listen/connect/accept/select/send/recv,幾個(gè)細(xì)微的差別在于Win32使用套接字運(yùn)行TCP/IP協(xié)議需要初始化上下文環(huán)境,另外,對(duì)于套接字定義,Win32使用SOCKET,Linux使用int,對(duì)于關(guān)閉套接字,Win32使用closesocket,Linux使用close。
5. 進(jìn)程:在Windows平臺(tái)中使用CreateProcess來(lái)創(chuàng)建進(jìn)程,子進(jìn)程返回句柄和ID給父進(jìn)程,在Linux平臺(tái)中使用fork和execv來(lái)創(chuàng)建進(jìn)程,子進(jìn)程返回ID給父進(jìn)程。兩者最大的差別在于,在Windows平臺(tái)中子進(jìn)程跟父進(jìn)程沒(méi)有任何關(guān)系,而在Linux平臺(tái)中,子進(jìn)程繼承了父進(jìn)程的進(jìn)程上下文環(huán)境。其它相關(guān)函數(shù)的差別如下:
| Win32 | Linux |
| CreateProcess | fork/execv |
| TerminateProcess | kill |
| ExitProcess | exit |
| GetCommandLine | argv |
| GetCurrentProcessId | getpid |
| KillTimer | alarm |
| SetEnvironmentVariable | putenv |
| GetEnvironmentVariable | getenv |
| GetExitCodeProcess | waitpid |
6. 進(jìn)程鎖:是指多個(gè)進(jìn)程同步的機(jī)制。多進(jìn)程同步的方法有很多,比如共享內(nèi)存,命名信號(hào)量等。這里只說(shuō)明一下命名信號(hào)量的機(jī)制,共享內(nèi)存的方法可以查閱相關(guān)手冊(cè)。Win32比較簡(jiǎn)單,在CreateMutex的參數(shù)中輸入相應(yīng)名稱即可,Linux中,則可使用System V IPC的semget/semctl/semop操作,具體步驟直接man之。
7. 線程:線程同步、等待函數(shù)、線程本地存儲(chǔ)以及初始化和終止抽象是線程模型的重要部分。主要對(duì)應(yīng)函數(shù)列表如下:
| 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 |
本文轉(zhuǎn)自:http://csynine.blog.51cto.com/1388509/310927
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的将 Win32 程序移植到 Linux的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网络编程--Address alread
- 下一篇: 运维请注意:”非常危险“的Linux命令