對於這個問題,網上已經有很多資料給予了介紹,但是相比於這些資訊,本文立足於個人的實踐,將內容具體到開發環境和源**,我覺得還是有很多值得總結和借鑑的。
首先宣告開發環境。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,實現指令碼是不一樣的。
將 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,程式語言也是...