java aix 移植linux,[转]程序的可移植性:window,linux,aix,solaris下程序移植体会
程序的可移植性:window,linux,aix,solaris下程序移植體會(huì)
- [工作學(xué)習(xí)]
1.類型
我們知道,在Windows平臺(tái)中,系統(tǒng)定義了很多諸如BOOL,CHAR,ULONG,HANDLE等大寫命名的類型,而在unix等系統(tǒng)中卻沒有。實(shí)際上,為了做好源代碼在各個(gè)系統(tǒng)下的移植,我們要使用這些類型,必須在unix中對(duì)這些類型進(jìn)行定義。
一般我們采用typedef來進(jìn)行定義,比如:typedef char
CHAR;但是為了防止多處重復(fù)定義導(dǎo)致的不一致,建議每個(gè)類型做如下形式的定義:
#ifndef BOOL_T #define BOOL_T typedef char BOOL; #endif
類似的定義包括各種類型:LONG,ULONG,INT,UINT,INT32,UINT32,HANDLE,PVOID,DWORD,HMODULE等;
枚舉值與Macro:TRUE,FALSE,NULL,INFINITE,WAIT_OBJECT_0,WAIT_TIMEOUT等。
2.多線程
在Windows中,存在大量關(guān)于thread的API,既有c運(yùn)行庫,也有win32
api庫函數(shù),同樣Linux/Unix也同樣支持thread,只是它們的API有些區(qū)別,在編寫代碼的過程中,需要區(qū)分對(duì)待。線程處理回調(diào)函數(shù)申明:
Windows平臺(tái): DWORD WINAPI ThreadProc(LPVOID lpParameter);
Linux/Unix平臺(tái): void * start_routine(void * pParam);
pthread:大部分Linux/Unix平臺(tái)都支持posix
pthread庫,Redhat Linux,IBM AIX,Sun
Solaris都是支持的。它們的函數(shù)定義都是相同的,這一點(diǎn)可以做到很好的移植性,只要移植其中一個(gè),其他平臺(tái)就不用做大的修改。注意:下面舉的Windows下的例子都是采用的Win32
thread API,而不是c運(yùn)行庫函數(shù)。線程創(chuàng)建和結(jié)束:
Win32:CreateThread Linux:pthread_create
在多線程程序中,同步和互斥是相當(dāng)重要的,它們保證了數(shù)據(jù)操作的一致性。
CreateEvent pthread_mutex_init,sem_init SetEvent
pthread_mutex_unlock,sem_post WaitForSingleObject
pthread_mutex_lock,sem_wait,pthread_join CloseHandle
pthread_mutex_destroy,sem_destroy
備注:AIX對(duì)sem_init等還不支持,系統(tǒng)沒有實(shí)現(xiàn)這些函數(shù)。(本人版本AIX5.2)
3.連接庫至于什么是連接庫,我不想多說。只說明一點(diǎn),連接庫包括靜態(tài)連接庫和動(dòng)態(tài)連接庫。靜態(tài)庫在Windows和Linux/Unix下分別表現(xiàn)為.lib和.a。動(dòng)態(tài)庫在Windows和Linux/Unix下分別表現(xiàn)為.dll和.so。
靜態(tài)庫:lib與a
Windows下直接在VC6選擇靜態(tài)庫開發(fā)即可。
Linux/Unix下開發(fā)與普通程序相同,只是不需要main文件,編譯結(jié)束后采用ar命令將所有.o文件打包成一個(gè).a文件。使用它們的時(shí)候只需要將靜態(tài)庫連接進(jìn)去即可。
動(dòng)態(tài)庫:dll與so
動(dòng)態(tài)庫的特點(diǎn):
1.Windows下為dll,Linux/Unix下為共享庫so。
2.減少空間,動(dòng)態(tài)加載。
3.每個(gè)進(jìn)程都有自己的image,進(jìn)程間的dll/so不干擾。
入口函數(shù)定義: Windows
Dll都有一個(gè)dll加載開始執(zhí)行的入口,這是必須的,但是linux/unix卻不必要。
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call,
LPVOID lpReserved ) 導(dǎo)出函數(shù)的申明: Windows平臺(tái):
extern "C" __declspec(dllexport) BOOL fnAgentStart(PRUNNING_PARAMS
pRunParams); Linux/Unix平臺(tái): extern "C" BOOL
fnAgentStart(PRUNNING_PARAMS pRunParams);
因?yàn)閃indows下大都使用C++編寫程序,為了加載過程找到函數(shù)名字,必須使用extern
"C",否則C++編譯器會(huì)自動(dòng)加上一些前綴標(biāo)簽。在Linux/Unix平臺(tái)下,可以去掉__declspec(dllexport)修飾,它是Windows下對(duì)導(dǎo)出函數(shù)的修飾。
動(dòng)態(tài)庫相關(guān)API: LoadLibrary dlopen GetProcAddress dlsym
FreeLibrary dlclose 動(dòng)態(tài)庫中共享全局變量:
Linux,Solaris都不需要特殊的修飾符,但是AIX不行。
aix:? 共享庫的編譯: Linux: gcc -fPIC -c a.c;ld -shared
-soname liba.so -o liba.so a.o AIX/Solaris: cc -c a.c; cc -G -o
liba.so a.o
4.硬件相關(guān) #pragma #pack intel x86與Risc,sparc
5.Service與daemon
6.系統(tǒng)信息: Windows: API; Qnix:/proc;
API區(qū)別:sleep,Sleep等。
7.編譯 C:gcc,cc,/usr/ccs/bin/cc,(solaris forte C); C++:gcc,cc,CC;
Lib:-ldl -lpthread
備注:solaris中如果調(diào)用了recvfrom等socket處理函數(shù),編譯連接時(shí)必須加-lxnet參數(shù)。
Makefile:
Linux,AIX,Solaris都支持Makefile,而且AIX,solaris的Makefile能通用,Linux下的make支持更多,更友好。
8.多用#ifdef #if defined
注釋采用方式,不要采用//,因?yàn)橛行┚幾g器不支持//的。
開發(fā)工具:vi,覺得linux做得最友好,編譯速度也最快。
9.調(diào)試對(duì)于編寫軟件來說,工作量并不只是去編寫代碼,更多的精力可能放在調(diào)試和查錯(cuò)上面。在各個(gè)平臺(tái)上的調(diào)試技術(shù)有些差別。具體細(xì)節(jié)這里不詳述,主要補(bǔ)充幾個(gè)平臺(tái)下的區(qū)別。
Windows:有個(gè)非常出色的編輯器和調(diào)試器,vc功能非常強(qiáng)大,但讀于dll,multithread程序就稍微有些麻煩,甚至斷點(diǎn)都不好設(shè)置,對(duì)于一些不好設(shè)置斷點(diǎn)的地方,可以在DEBUG模式下在被調(diào)試代碼前插入assert(0),這樣總會(huì)觸發(fā)斷
總結(jié)
以上是生活随笔為你收集整理的java aix 移植linux,[转]程序的可移植性:window,linux,aix,solaris下程序移植体会的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下创建文件没有权限,分享一个L
- 下一篇: linux svn 自动发布,linux