將 Win32 程式移植到 Linux

2021-08-25 18:35:45 字數 3735 閱讀 1028

首先宣告開發環境。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)

orsem_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,實現指令碼是不一樣的。

本文**

linux下定義windows常用資料型別

將 Win32 程式移植到 Linux

分類 c c c linux shell 2011 03 23 17 01 2899人閱讀 收藏舉報 linux windows 平台service 指令碼程式設計 對於這個問題,網上已經有很多資料給予了介紹,但是相比於這些資訊,本文立足於個人的實踐,將內容具體到開發環境和源 我覺得還是有很多值得總...

將 Win32 程式移植到 Linux

首先宣告開發環境。win32程式的開發環境是vs.net 2008,程式語言是c linux使用的rhel 5.4,gcc的版本是4.1.2,程式語言也是c。然後依次說明移植的物件 資料型別 字串處理 系統呼叫 套接字 程序 程序鎖 執行緒 執行緒鎖 訊號量 事件鎖 條件鎖 系統服務。1.資料型別 ...

將 Win32 程式移植到 Linux

對於這個問題,網上已經有很多資料給予了介紹,但是相比於這些資訊,本文立足於個人的實踐,將內容具體到開發環境和源 我覺得還是有很多值得總結和借鑑的。首先宣告開發環境。win32程式的開發環境是vs.net 2008,程式語言是c linux使用的rhel 5.4,gcc的版本是4.1.2,程式語言也是...