日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

java aix 移植linux,[转]程序的可移植性:window,linux,aix,solaris下程序移植体会

發(fā)布時(shí)間:2024/9/19 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java aix 移植linux,[转]程序的可移植性:window,linux,aix,solaris下程序移植体会 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

程序的可移植性:window,linux,aix,solaris下程序移植體會

- [工作學(xué)習(xí)]

1.類型

我們知道,在Windows平臺中,系統(tǒng)定義了很多諸如BOOL,CHAR,ULONG,HANDLE等大寫命名的類型,而在unix等系統(tǒng)中卻沒有。實(shí)際上,為了做好源代碼在各個(gè)系統(tǒng)下的移植,我們要使用這些類型,必須在unix中對這些類型進(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ū)分對待。線程處理回調(diào)函數(shù)申明:

Windows平臺: DWORD WINAPI ThreadProc(LPVOID lpParameter);

Linux/Unix平臺: void * start_routine(void * pParam);

pthread:大部分Linux/Unix平臺都支持posix

pthread庫,Redhat Linux,IBM AIX,Sun

Solaris都是支持的。它們的函數(shù)定義都是相同的,這一點(diǎn)可以做到很好的移植性,只要移植其中一個(gè),其他平臺就不用做大的修改。注意:下面舉的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對sem_init等還不支持,系統(tǒng)沒有實(shí)現(xiàn)這些函數(shù)。(本人版本AIX5.2)

3.連接庫至于什么是連接庫,我不想多說。只說明一點(diǎn),連接庫包括靜態(tài)連接庫和動態(tài)連接庫。靜態(tài)庫在Windows和Linux/Unix下分別表現(xiàn)為.lib和.a。動態(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)去即可。

動態(tài)庫:dll與so

動態(tài)庫的特點(diǎn):

1.Windows下為dll,Linux/Unix下為共享庫so。

2.減少空間,動態(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平臺:

extern "C" __declspec(dllexport) BOOL fnAgentStart(PRUNNING_PARAMS

pRunParams); Linux/Unix平臺: extern "C" BOOL

fnAgentStart(PRUNNING_PARAMS pRunParams);

因?yàn)閃indows下大都使用C++編寫程序,為了加載過程找到函數(shù)名字,必須使用extern

"C",否則C++編譯器會自動加上一些前綴標(biāo)簽。在Linux/Unix平臺下,可以去掉__declspec(dllexport)修飾,它是Windows下對導(dǎo)出函數(shù)的修飾。

動態(tài)庫相關(guān)API: LoadLibrary dlopen GetProcAddress dlsym

FreeLibrary dlclose 動態(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)試對于編寫軟件來說,工作量并不只是去編寫代碼,更多的精力可能放在調(diào)試和查錯(cuò)上面。在各個(gè)平臺上的調(diào)試技術(shù)有些差別。具體細(xì)節(jié)這里不詳述,主要補(bǔ)充幾個(gè)平臺下的區(qū)別。

Windows:有個(gè)非常出色的編輯器和調(diào)試器,vc功能非常強(qiáng)大,但讀于dll,multithread程序就稍微有些麻煩,甚至斷點(diǎn)都不好設(shè)置,對于一些不好設(shè)置斷點(diǎn)的地方,可以在DEBUG模式下在被調(diào)試代碼前插入assert(0),這樣總會觸發(fā)斷

總結(jié)

以上是生活随笔為你收集整理的java aix 移植linux,[转]程序的可移植性:window,linux,aix,solaris下程序移植体会的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。