亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1617 | 回復(fù): 0
打印 上一主題 下一主題

如何在 ILE 和 PASE 之間相互調(diào)用 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-01-18 13:48 |只看該作者 |倒序瀏覽
雖然 AIX 和 IBM i 構(gòu)建在共同的處理器 PowerPC 架構(gòu)之上,并且 IBM i 上的 PASE 應(yīng)用是以 AIX 模式運行的,但兩者內(nèi)存管理和地址空間分配有較大差異。在很多情況下,PASE 上的應(yīng)用需要調(diào)用 IBM i 操作系統(tǒng) Integrated Language Environment® (ILE) 中的程序(PGM),服務(wù)程序(Service Program)或者命令行程序(CL)獲取系統(tǒng)信息。同樣也存在 IBM i 程序使用 PASE 提供的功能這樣的情況。這樣的互相調(diào)用方式跨越了 PASE 和 ILE 兩種運行環(huán)境,程序中需要特殊的代碼來完成。本文以下章節(jié)將分別介紹如何處理這兩種情況。
ILE 和 PASE 的介紹
在討論跨越運行環(huán)境進行調(diào)用之前,本節(jié)將簡要介紹這兩種環(huán)境。
ILE
ILE 是 Integrated Language Environment 的縮寫,意思為集成語言環(huán)境。ILE 是被設(shè)計用來提升 IBM i 上程序開發(fā)的一系列工具和相關(guān)的系統(tǒng)支持。在 IBM i 平臺 ILE 環(huán)境下,C/C++、CL、RPG、COBOL 語言編寫的程序可以編譯成 Module Object。Module Object 可以直接鏈接成可執(zhí)行的 Program Object。
ILE 中有如下幾個重要概念:
  • Procedure
    一段高級語言編寫的源代碼,它可以詳細(xì)地完成某項任務(wù),然后返回給調(diào)用者。對 C 語言而言,Procedure 就是一個函數(shù);對 CL 而言,Procedure 其實就是一個 CL 程序的源代碼。
  • Module
    Module 是由 ILE 編譯器編譯出來的,不可以執(zhí)行的對象。Module 包含有一個或多個 Procedure 和一些數(shù)據(jù)信息,以及在這個 Module 中一些 Procedure 和數(shù)據(jù)導(dǎo)出導(dǎo)入信息。當(dāng)然,有些 Module 還包含調(diào)試信息,這取決于如何編譯程序。
  • Program
    Program 是 ILE 鏈接器把一個或者多個 Module 對象綁定鏈接而成的可以執(zhí)行的程序。即 ILE 應(yīng)用程序。
  • Service Program
    Service Program 是 ILE 下的外部可調(diào)用歷程(函數(shù)或過程)的封裝?晒┢渌 ILE 程序或 Service Program 引用和鏈接。

PASE
IBM i Portable Application Solutions Environment(PASE) 是為運行在 IBM i 操作系統(tǒng)上的 AIX 應(yīng)用而開發(fā)的一個集成運行時環(huán)境,該運行時環(huán)境在 IBM i 操作系統(tǒng)的 Licensed Internal Code 內(nèi)核之上。引入 PASE 的目的是不改變或只需要微小的改動就可以將已有的 AIX 程序移植到 IBM i 操作系統(tǒng)上運行。PASE 支持 AIX 的 application binary interface (ABI),支持標(biāo)準(zhǔn)的 C 和 C++ 運行時和 pthreads 線程庫,很大程度上能夠兼容 AIX 的共享庫,腳本,實用程序和系統(tǒng)調(diào)用。PASE 的應(yīng)用以 IBM i job 方式運行和管理,并且可以使用 IBM i 操作系統(tǒng)提供的功能,如文件服務(wù),安全和 sockets 通信機制。

如何在 ILE 環(huán)境調(diào)用 PASE 應(yīng)用程序?
我們可以將 PASE 應(yīng)用程序集成到已有的 ILE 系統(tǒng)中,這樣用戶就可以重用已有的 ILE 代碼,使 PASE 應(yīng)用獲得在 ILE 系統(tǒng)中才有的特性。因為只有 ILE 才能充分發(fā)揮 IBM i 操作系統(tǒng)的獨特優(yōu)勢。
我們可以通過以下幾種方式在 ILE 端調(diào)用 PASE 應(yīng)用程序:
在 ILE 綠屏命令行直接調(diào)用 PASE 端可執(zhí)行應(yīng)用程序
  • QSH CMD('pase_command parameters')
    pase_command 為 PASE 端的可執(zhí)行應(yīng)用程序,它可以是該可執(zhí)行應(yīng)用程序的絕對路徑,
    也可以是當(dāng)前 session 環(huán)境變量 PATH 下的可執(zhí)行的應(yīng)用程序。


    清單 1. 使用 QSH CMD
                                                        QSH CMD('ps -ef')  QSH CMD('/QOpenSys/usr/bin/ls')
  • CALL QP2SHELL PARM('pase_command''parameters)
    pase_command 為 PASE 端的可執(zhí)行應(yīng)用程序的絕對路徑 , parameters 為該命令的命令行
    參數(shù)。例如 :


    清單 2. 在命令行使用 QP2SHELL
                                                        CALL QP2SHELL PARM('/QOpenSys/usr/bin/ls' '/QOpenSys/QIBM')

在 ILE 程序中調(diào)用 PASE 端應(yīng)用程序
在 ILE 程序中調(diào)用 PASE 端可執(zhí)行應(yīng)用程序 , 我們可以使用以下三個 API 實現(xiàn)在 ILE 程序中調(diào)用 PASE 端應(yīng)用程序。
  • QP2SHELL
  • QP2SHELL2
QP2SHELL 和 QP2SHELL2 這兩個 API 提供了一個非常簡單的使用 IBM i PASE 程序的
接口,直接使用要運行的 IBM i PASE 程序名字和輸入?yún)?shù)作為 API 的輸入,就可以調(diào)用 PASE 應(yīng)用。
這兩個 API 參數(shù)相同,差別在于 QP2SHELL()函數(shù)會創(chuàng)建新的激活組并在其中運行 PASE 程序。而 QP2SHELL2()函數(shù)會在調(diào)用者相同的激活組中運行 PASE 程序。這兩個 API 都沒有指示錯誤狀態(tài)的返回值,也不會返回 PASE 程序的返回值。
程序示例:

清單 3. 在程序中使用 QP2SHELL
                                    #include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <qp2usr.h>  #include <qp2shell.h>  void main(int argc, char* argv[])  {  char* parm = “/”;  char* pasePgm = “/QOpenSys/bin/ls”;  QP2SHELL(pasePGM, parm);  }

  • Qp2RunPase
Qp2RunPase 允許用戶提供更多的參數(shù)來對 PASE 程序的運行進行控制。它可以指定程
序名和運行參數(shù),還可以定義 PASE 程序運行環(huán)境變量,以及 PASE 程序初始運行的 CCSID。Qp2RunPase 的返回值可以得到 PASE 程序執(zhí)行的狀態(tài)。PASE 程序結(jié)束返回時,導(dǎo)致 Qp2RunPase 返回并將控制權(quán)返還給 ILE 代碼。下面是 Qp2RunPase 函數(shù)的原型:

清單 4. Qp2RunPase 函數(shù)聲明
                                    int Qp2RunPase(  const char* pathname,  const char* symbolName, const void* symbolData,  unsigned int symbolDataLen,  int ccsid,  const char* const* argv,  const char* const* envp);

參數(shù)說明:
  • pathName 輸入?yún)?shù):
    表明 PASE 程序在 IFS 文件系統(tǒng)中的路徑,可以使絕對路徑,也可以是相對于作業(yè)當(dāng)前路徑的相對路徑。
  • symbolName、symbolData、symbolDataLen 輸入?yún)?shù)
    symbolName 參數(shù)必須定義為為一個空指針; symbolData 和 symbolDataLen 參數(shù)通常被忽略。
  • CCSID 輸入?yún)?shù):
    這個參數(shù)確定 PASE 程序初始運行的 CCSID。系統(tǒng)會將參數(shù)數(shù)據(jù)從作業(yè)默認(rèn)的 CCSID 轉(zhuǎn)換為對應(yīng)的編碼。例如,CCSID 設(shè)定為 1208,表明使用 UTF-8 編碼。
  • argv 參數(shù):
    argv 指向一個指針數(shù)組,該指針數(shù)組為 IBM i PASE 程序的參數(shù)表。第一個參數(shù)是 PASE 程序的路徑名,該參數(shù)的值與參數(shù) pathName 的值相同。
  • envp 參數(shù):
    envp 參數(shù)指向一個指針數(shù)組,該指針數(shù)組用來定義 IBM i PASE 程序的環(huán)境變量。

Qp2RunPase 的返回值能夠提供更多的信息,以便用戶對 PASE 程序的運行狀態(tài)進行處理。通常情況下,“0”表示正常返回,非零值表明錯誤返回,如“QP2RUNPASE_ERROR(-1)”或“QP2RUNPASE_RETURN_NOEXIT(-2)”這兩個值表明函數(shù)本身的異常返回。IBM i 還提供了一些宏來處理返回值,如下表所示:

表 1. 使用宏處理 Qp2RunPase 返回值
含義
WIFEXITED(stat_val)如果返回非零值,表明 Qp2RunPase 函數(shù)的執(zhí)行過程有錯誤,需要調(diào)用下面的宏獲得錯誤的細(xì)節(jié)信息
WEXITSTATUS(stat_val)當(dāng)宏 WIFEXITED(stat_val) 返回非零值時,表明執(zhí)行過程有錯誤。該宏會返回 PASE 程序的返回值
WIFSIGNALED(stat_val)檢查 PASE 程序是否被 signal 異常終止
WTERMSIG(stat_val)當(dāng)宏 WIFSIGNALED(stat_val) 返回非零值時,表明執(zhí)行過程被 signal 終止。這個宏確認(rèn)具體收到的 signal number

程序示例:

清單 5. Qp2RunPase 函數(shù)使用實例
                                    int rc = Qp2RunPase(“program/path/in/PASE”, NULL, NULL, 0, 819, (char**)&argv, NULL);  if (rc == QP2RUNPASE_ERROR || rc == QP2RUNPASE_RETURN_NOEXIT)  {  printf (“internal error”);  }  if (WIFEXITED(rc) != 0)  {  // Command exited normally, check its return code  paseRC = WEXITSTATUS(rc);  printf (“pase program exit with none zero return: %d”, paseRC);  }

在 ILE 程序中調(diào)用 PASE 函數(shù)
以上介紹了在 ILE 中調(diào)用 PASE 環(huán)境中的應(yīng)用程序 IBM i 還提供了一組支持直接調(diào)用 PASE 共享庫的 API。調(diào)用過程需要用到以下函數(shù):
  • Qp2ptrsize: 獲取 PASE 的指針長度。PASE 支持 32 位模式和 64 位模式。
  • Qp2dlopen: 類似于 UNIX 下的 dlopen() 函數(shù),用于打開 PASE 共享庫。
  • Qp2dlsym: 類似于 UNIX 下的 dlsym() 函數(shù),用于查找對應(yīng)的函數(shù)入口。
  • Qp2dlclose: 類似于 UNIX 下的 dlclose() 函數(shù),用于關(guān)閉 PASE 共享庫。
  • Qp2dlerror: 如果 Qp2dlopen、Qp2dlsym 或 Qp2dlclose 函數(shù)在執(zhí)行過程出錯,用戶可以使用這個函數(shù)獲取錯誤信息。
  • Qp2malloc: 在 PASE 中分配一塊內(nèi)存,共 ILE 與 PASE 之間進行數(shù)據(jù)交互。
  • Qp2free: 用于釋放 Qp2mallloc 函數(shù)分配的內(nèi)存。
Qp2CallPase
Qp2CallPase 使得用戶可以在 ILE 程序中調(diào)用 PASE 共享庫中的函數(shù)。Qp2CallPase 不會產(chǎn)生新的任務(wù),只會在當(dāng)前任務(wù)中執(zhí)行 PASE 函數(shù)。

清單 6. Qp2CallPase 函數(shù)原型
                                    #include <qp2user.h>  int Qp2CallPase(  const void* target,  const void* arglist,  const QP2_arg_type_t* signature,  QP2_result_type_t result_type,  void* result);

參數(shù)說明:
  • target
    PASE 函數(shù)的描述符。
  • arglist:
    IBM i PASE 函數(shù)的參數(shù)列表。
  • signature
    參數(shù)的具體類型。QP2_ARG_END 表示 Signature 列表的結(jié)尾,QP2_ARG_WORD 表示 4-byte 數(shù)據(jù),QP2_ARG_FLOAT32 表示 4-byte 浮點型數(shù)據(jù),QP2_ARG_FLOAT64 表示 8-byte 浮點型數(shù)據(jù)。
  • result_type
    調(diào)用的 PASE 函數(shù)的返回值的類型,在頭文件 qp2user.h 中定義。QP2_RESULT_VOID 表明 PASE 函數(shù)沒有返回值,QP2_RESULT_WORD 表示 4-byte 數(shù)據(jù),QP2_RESULT_DWORD 表示 8-byte 數(shù)據(jù),QP2_RESULT_FLOAT64 表示 8-byte 浮點型數(shù)據(jù)。
  • result
    PASE 函數(shù)的返回值。

下面介紹 Qp2CallPase 函數(shù)的使用方法和步驟:
  • 初始化:調(diào)用 IBM i PASE 環(huán)境之前必須對其進行初始化。IBM i PASE 環(huán)境提供了兩個工具用來完成初始化,一個是 /usr/bin/start32,用來激活 32 位 IBM i PASE 環(huán)境,另一個是 /usr/bin/start64,用來激活 64 位 IBM i PASE 環(huán)境。每個 IBM i 進程必須且只能運行一個獨立的 IBM i PASE 環(huán)境。
  • 檢查:調(diào)用 Qp2ptrsize() 來確定 IBM i PASE 環(huán)境是否正常運行。返回值:
    0,表示沒有完成初始化。
    4,表示 PASE 環(huán)境運行在 32 位模式下
    8,表示 PASE 環(huán)境運行在 64 位模式下。
  • 加載庫:用 Qp2dlopen 和 Qp2dlsym 將被調(diào)用的庫加載至內(nèi)存中,然后就可以定位被調(diào)用函數(shù)的入口。
  • 調(diào)用 Qp2CallPase:使用 Qp2CallPase() API 激活 PASE 共享庫函數(shù),被調(diào)用的函數(shù)參數(shù)列表以指針數(shù)組的方式傳遞給 Qp2CallPase。ILE 代碼還需要提供一種方式來描述參數(shù)列表的類型,通常稱為 Signature。用戶可以在頭文件 qsysinc/qp2usr.h 中找到這些類型定義。
  • 終止 IBM i PASE 進程:需要先調(diào)用 Qp2dlclose() 來卸載 IBM i PASE 共享庫,然后調(diào)用 Qp2EndPase() 函數(shù)來終止 start64 或 start32 程序啟動的 PASE 環(huán)境。

清單 7. Qp2CallPase 函數(shù)使用實例
                                    #include <stdio.h>  #include <qp2shell2.h>  #include <qp2user.h>  #define JOB_CCSID 0  int main(int argc, char* argv[])  {  QP2_ptr64_t id;  void* getpid_pase;  const QP2_arg_type_t signature[] = {QP2_ARG_END};  QP2_word_t result;  QP2SHELL2(“/usr/lib/start32”);  id = Qp2dlopen(NULL, QP2_RTLD_NOW, JOB_CCSID);  getpid_pase = Qp2dlsym(id, “getpid”, JOB_CCSID, NULL);  int rc = Qp2CallPase(getpid_pase,  NULL,// no argument list  signature,  QP2_RESULT_WORD,  &result)  printf (“IBM i PASE getpid() = &i\n”, result);  if (result == -1)  printf (“IBM i errno = %i\n”, *Qp2errnop());  Qp2dlclose(id);  Qp2EndPase();  return 0;  }

編譯 ILE 端程序生成可執(zhí)行的 PGM
在 ILE 端我們通常通過 CRTCMOD(如果源程序文件是由 ILE C 語言編寫)或者 CRTCPPMOD(如果源程序文件是由 ILE C++ 語言編寫)命令來將 ILE 端的程序編譯成 MODULE,然后用 CRTPGM 來將編譯好的 MODULE(s) 以及 Service Program 鏈接生成可執(zhí)行的 PGM。

清單 8. 在 ILE 編譯和鏈接程序
                                    CRTCMOD  MODULE(QYOURLIB/YOURMOD)  SRCFILE(QYOURLIB/QCSRC) 或者:÷ CRTCPPMOD  MODULE(QYOURLIB/YOURMOD)  SRCSTMF('/qopensys/myprogram/myprogram.cpp') INCDIR('/qopensys/myprogram/include')  CRTPGM  PGM(QYOURLIB/YOURPGM)  MODULE(QYOURLIB/YOURMOD)  BNDSVRPGM(QSYS/QP2USER)


如何在 PASE 端調(diào)用 ILE ?
PASE 程序調(diào)用 ILE command line
ILE 命令行是指在 IBM i 的終端窗口內(nèi)使用的命令,類似 AIX 的 shell 命令。例如: CRTUSRPRF USRPRF(USER1) 用來創(chuàng)建一個 IBM i 系統(tǒng)賬號。如果希望在 PASE 應(yīng)用中調(diào)用上面的命令行提供創(chuàng)建賬號功能,就需要使用 systemCL API 來完成。systemCL 提供了 PASE 程序運行 ILE Commnad Line 命令的功能。函數(shù)聲明:

清單 9. systemCL 聲明
                                    #include <as400_protos.h>  int systemCL(const char  *command, int lags);

<as400_protos.h> 頭文件是 PASE 專有的,包含了支持 PASE 調(diào)用 ILE 的 API。

清單 10. 使用 systemCL 調(diào)用 ILE 命令
                                    int retval = systemCL("CRTUSRPRF USRPRF(USER1)", SYSTEMCL_MSG_STDOUT);

調(diào)用 ILE 下的 PGM 對象
Program 是 ILE 下的可執(zhí)行程序,對象類型為 *PGM。 例如通過 WRKOBJ OBJ(QSYS/*ALL) OBJTYPE(*PGM) 來查看 QSYS 庫下的所有 Program。Program 可以在 ILE 的終端下使用 CALL 命令直接引用。
由于要在 PASE 中使用 ILE 對象涉及到地址轉(zhuǎn)換,先介紹 PASE 中的 ILE 對象指針也就是地址,即 ILEpointer 結(jié)構(gòu) :

清單 11. ILEpointer 對象聲明
                                    typedef union _ILEpointer {  #if !(defined(_AIX) || defined(KERNEL))  #pragma pack(1,16,_ILEpointer)       /* Force sCC quadword alignment */  #endif     long double         align;       /* Force xlc quadword alignment  (with -qldbl128 -qalign=natural) */  #ifndef _AIX     void               *openPtr; /* MI open pointer (tagged quadword) */  #endif     struct {  char           filler[16-sizeof(uint64)];  address64_t    addr;/* (PASE) memory address */     } s;  } ILEpointer;

可以看出 ILE 下對象指針長度是 16 字節(jié),而 PASE 的地址保存在 8 字節(jié)的 addr 中。
調(diào)用 PGM 對象使用到的函數(shù):

清單 12. _RSLOBJ 和 _RSLOBJ2 函數(shù)聲明
                                    #include <as400_protos.h>  int _RSLOBJ(ILEpointer       *sysptr              const char       *path,              char             *objtype);  int _RSLOBJ2(ILEpointer      *sysptr,               unsigned short  type_subtype,                const char      *objname,               const char      *libname);  

這兩個函數(shù)用來解析和提取 ILE 下 Program 對象的地址,接收參數(shù)為對象路徑或?qū)ο竺麕烀祷?16 字節(jié)指向 Program 的系統(tǒng)指針。

清單 13. _PGMCALL 函數(shù)聲明
                                    int _PGMCALL(const ILEpointer  *target,               void              **argv,               unsigned          flags);  

_PGMCALL 函數(shù)調(diào)用指定的 Program。參數(shù)為 _RSLOBJ()_RSLOBJ2() 函數(shù)返回的對象指針。參數(shù) flags 指定如何控制被調(diào)的 ILE 程序,通常情況下,如果調(diào)用者希望 _PGMCALL 通過返回值的方式來判斷調(diào)用出錯,可以使用 PGMCALL_EXCP_NOSIGNAL,否則 _PGMCALL 將出錯轉(zhuǎn)化為 PASE 的信號,在未安裝信號處理函數(shù)的情況下,這可能導(dǎo)致程序直接退出。
例子:在 PASE 下調(diào)用 ILE 的 TESTLIB 庫文件系統(tǒng) TESTPGM(*PGM 類型 )

清單 14. _PGMCALL 使用實例
                                    ILEpointer PGM_pointer;  const char* arglist[] = { "parm1", "parm2",NULL};  int retval1 = _RSLOBJ2(&PGM_pointer, RSLOBJ_TS_PGM, "TESTLIB", "TESTPGM");  int retval2 = _PGMCALL(&PGM_pointer,(void**)arglist, PGMCALL_EXCP_NOSIGNAL);

調(diào)用 Service Program
ILE 下的 Service Program 類似于共享庫或者動態(tài)鏈接庫,包含一系列的函數(shù)或過程為其他 Service Program 或程序使用。Service Program 區(qū)別于 PGM 的地方是沒有程序入口函數(shù)即 main 函數(shù)。通常這些函數(shù)被一個或多個應(yīng)用頻繁使用,將這些函數(shù)打包到 Service Program 可以提高重用性,簡化維護開銷和減少內(nèi)存消耗。Service Program 可以做到運行時綁定。
調(diào)用 Service Program 需要使用到的函數(shù):

清單 15. _ILELOAD 函數(shù)聲明
                                    unsigned long long _ILELOADX(const void  *id, unsigned int flags);  int _ILELOAD(const void  *id, unsigned int flags);  

上面兩個函數(shù)加載 ILE 的 Service Program,返回 Service Program 的唯一激活標(biāo)識。

清單 16. _ILESYMX 和 _ILESYM 函數(shù)聲明
                                    int _ILESYMX(ILEpointer          *export,               unsigned long long  actmark,               const char          *symbol);   int _ILESYM(ILEpointer  *export,              int         actmark,              const char  *symbol);

這兩個函數(shù)使用 _ILELOADX()_ILELOAD() 返回的激活標(biāo)識作為輸入?yún)?shù),在 Service Program 尋找被調(diào)用函數(shù)或過程的符號,對返回指向該函數(shù)的 16 字節(jié)指針。

清單 17. _ILECALLX 和 _ILECALL 函數(shù)聲明
                                    int _ILECALLX(const ILEpointer  *target,                ILEarglist_base   *ILEarglist,                const arg_type_t  *signature,                result_type_t     result_type,                int               flags);  int _ILECALL(const ILEpointer  *target,               ILEarglist_base   *ILEarglist,               const arg_type_t  *signature,               result_type_t     result_type);

以上兩個函數(shù)調(diào)用 Service Program,傳遞 16 字節(jié)的指向被調(diào) ILE 函數(shù)指針,以及參數(shù)列表,參數(shù)類型列表等。由于 ILE 的程序要求參數(shù)有一定的對齊方式,PASE 提供了兩個函數(shù)幫助構(gòu)造參數(shù)列表。

清單 18. size_ILEarglist 函數(shù)聲明
                                    size_t size_ILEarglist(const arg_type_t  *signature);

size_ILEarglist() 用來計算參數(shù)字節(jié)數(shù)。由于參數(shù)按字節(jié)對齊,參數(shù)的順序?qū)⒂绊憛?shù)空間的大小。

清單 19. build_ILEarglist 函數(shù)聲明
                                    int build_ILEarglist(ILEarglist_base   *ILEarglist,                       const void        *PASEarglist,                       const arg_type_t  *signature);

build_ILEarglist() 根據(jù)參數(shù)類型構(gòu)造參數(shù)列表。
調(diào)用 Service Program 程序示例:
TESTLIB 庫下的 TESTSRV Service Program 里的 TESTSRV 過程,聲明如下:

清單 20. TESTSRV 函數(shù)聲明
                                    int TESTSRV(int a, float b,char c);

需要定義一個和被調(diào)函數(shù)有同樣參數(shù)的轉(zhuǎn)換函數(shù),調(diào)用過程封裝在轉(zhuǎn)換函數(shù)中完成。對 PASE 開發(fā)者來說這個轉(zhuǎn)換函數(shù)是必要的,因為編譯器會根據(jù)轉(zhuǎn)換函數(shù)的參數(shù)類型和順序自動構(gòu)造參數(shù)列表并進行參數(shù)字節(jié)對齊,Service Program 可以直接使用編譯器生成的參數(shù)列表。否則開發(fā)人員需要自己實現(xiàn)參數(shù)的字節(jié)對齊。

清單 21. PASE 下調(diào)用 ILE Service Program 實例
                                    int TESTSRVWrapper(int arg1, double arg2, char arg3)  {  // 加載 Service Program  int actmark = _ILELOAD("TESTLIB/TESTSRV", ILELOAD_LIBOBJ);  ILEPointer* ILEtarget = (ILEPointer*)malloc(sizeof(ILEPointer));  // 定位被調(diào)過程的符號 int rc = _ILESYMX(ILEtarget, actmark, "TESTSRV");  // 指定調(diào)用參數(shù)類型列表 static short signature[] =  {     ARG_INT32,     ARG_FLOAT64,     ARG_UINT8,     ARG_END  };  ILEarglist_base *ILEarglist;  // 計算參數(shù)列表空間 ILEarglist = (ILEarglist_base*)malloc( size_ILEarglist(signature) );  // 構(gòu)造參數(shù)列表,只需第一個參數(shù)的地址 build_ILEarglist(ILEarglist, &arg1, signature);  // 傳入?yún)?shù)并調(diào)用 _ILECALL(ILEtarget, ILEarglist, signature, RESULT_INT32);  free(ILEarglist);  free(ILEtarget);

}
在 PASE 環(huán)境下編譯和鏈接程序
PASE 支持 AIX 的編譯器 IBM XL C/C++ for AIX,該編譯器是單獨提供的。PASE 也包含了許多 AIX 的開發(fā)工具,如 ld,ar,make,yacc。XLC 編譯器要注意的問題是指針的處理。因為 ILEpointer 類型代表了訪問底層機器接口的指針,在結(jié)構(gòu)體中它要求 16 字節(jié)對齊,XLC 通過編譯選項 -qlngdbl128 和 -qalign=natural 為 long double 類型的數(shù)據(jù)保持 16 字節(jié)對齊提供了有限的支持。
編譯命令示例:

清單 22. PASE 下進行編譯
                                    xlC_r -o test -qlngdbl128 -qalign=natural – H16 – lc128 -qrtti=dyna -qlanglvl=newexcp  -Wl,,-brtl -Wl,-bhalt:8 -bI:/usr/lib/as400_libc.exp test.cpp

xlC_r 是編譯命令,用來編譯多線程程序以確保和線程安全庫鏈接。
-qrtti 可以為 dynamic_cast 產(chǎn)生運行時類型識別信息。
-qlanglvl 指定 new 或 new[] 在不能分配請求的內(nèi)存時拋出異常
-Wl 提供了一組鏈接選項:-brtl 默認(rèn)值會先搜尋 .so 類型的文件進行鏈接,再搜尋 .a 類型的文件;-bhalt 確保當(dāng)鏈接程序返回的錯誤值大于指定值時鏈接器掛起。
編譯命令會將 -bI 后面的參數(shù)傳遞給鏈接器 ld,as400_libc.exp 文件包含了來自 libc.a 的 IBM i 系統(tǒng)特有的接口。
如果生成鏈接文件而非可執(zhí)行程序則需使用 -qmkshrobj 參數(shù)。

總結(jié)
通常,PASE 應(yīng)用可以利用 IBM i 操作系統(tǒng)環(huán)境提供的服務(wù),如安全,消息處理,通信,備份和恢復(fù),同時也可以使用繼承自 AIX 的應(yīng)用接口。運行在 PASE 下的應(yīng)用可以集成 ILE 文件系統(tǒng)和 DB2 for IBM i,也可以調(diào)用 Java 和 ILE 應(yīng)用。Java 和 ILE 應(yīng)用也可以調(diào)用 PASE 應(yīng)用。這種相互調(diào)用方便了開發(fā)人員進行跨平臺程序移植,提高了資源使用率并有助于節(jié)約投資和維護成本。

作者簡介
荊雷,IBM CSTL 的 CIM provider for IBM i 項目的一名軟件工程師。他所感興趣和專長的領(lǐng)域包括 DMTF WBEM 架構(gòu),CIM schema 和 IBM i 上的管理軟件開發(fā)。

趙新峰,IBM CSTL 的 CIM Server for IBM i 項目的一名軟件工程師。他所感興趣和專長的領(lǐng)域包括 CIM 架構(gòu),CIM Server 和 IBM i License Program 安裝和退出程序的開發(fā)。




http://www.ibm.com/developerworks/cn/ibmi/library/i-cn-ilecallpase/i-cn-ilecallpase.html

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP