Cómo llamarse entre ILE y PASE
Podemos integrar aplicaciones PASE en sistemas ILE existentes, de modo que los usuarios puedan reutilizar el código ILE existente y permitir que las aplicaciones PASE obtengan funciones que solo están disponibles en los sistemas ILE. Porque sólo ILE puede aprovechar al máximo las ventajas únicas del sistema operativo IBM i.
Podemos llamar a la aplicación PASE en el lado ILE de las siguientes maneras:
Llamar directamente a la aplicación ejecutable del lado PASE en la línea de comando de pantalla verde de ILE
QSH CMD('parámetros de pase_command')
pase_command es la aplicación ejecutable en el lado de PASE. Puede ser la ruta absoluta de la aplicación ejecutable,
también puede ser la sesión actual. Variable de entorno Aplicaciones ejecutables en PATH.
Listado 1. Usando QSH CMD
QSH CMD('ps -ef')
QSH CMD('/QOpenSys/usr/bin/ls')
CALL QP2SHELL PARM('pase_command''parameters)
pase_command es la ruta absoluta de la aplicación ejecutable en el lado PASE, y parámetros es la línea de comando del comando
. Por ejemplo:
Listado 2. Usando QP2SHELL desde la línea de comando
CALL QP2SHELL PARM('/QOpenSys/usr/bin/ls' '/QOpenSys/QIBM')
Llamar a la aplicación del lado PASE en el programa ILE
Para llamar a la aplicación ejecutable del lado PASE en el programa ILE, podemos usar las siguientes tres API para llamar a la aplicación del lado PASE en el Programa ILE.
QP2SHELL
QP2SHELL2
Las dos API QP2SHELL y QP2SHELL2 proporcionan una interfaz muy sencilla para utilizar el programa IBM i PASE
, directamente utilice el nombre del programa IBM i PASE y los parámetros de entrada para ejecutarlos como entrada para la API y podrá llamar a la aplicación PASE.
Los dos parámetros API son iguales, la diferencia es que la función QP2SHELL() crea un nuevo grupo de activación y ejecuta el programa PASE en él. La función QP2SHELL2() ejecutará el programa PASE en el mismo grupo de activación que la persona que llama. Ninguna API tiene un valor de retorno para indicar un estado de error, ni devuelve un valor de retorno de un procedimiento PASE.
Ejemplo de programa:
Listado 3. Uso de QP2SHELL en el programa
#include lt; ;stdlib.hgt;
#include lt;string.hgt;
#include lt;qp2usr.hgt
#include lt;qp2shell.hgt;
void main(int argc, char* argv[])
{
char* parm = "/"
char; * pasePgm = "/QOpenSys/bin/ls";
QP2SHELL(pasePGM, parm
}
Qp2RunPase
Qp2RunPase); Permite a los usuarios proporcionar más parámetros para controlar el funcionamiento del programa PASE. Puede especificar el nombre del programa y los parámetros de ejecución, y también puede definir las variables de entorno de ejecución del programa PASE y el CCSID de la ejecución inicial del programa PASE. El valor de retorno de Qp2RunPase puede obtener el estado de ejecución del programa PASE. Cuando el programa PASE finaliza y regresa, hace que Qp2RunPase regrese y devuelva el control al código ILE. El siguiente es el prototipo de la función Qp2RunPase:
Listado 4. Declaración de la función Qp2RunPase
int Qp2RunPase(
const char* pathname,
const char* symbolName, const void* symbolData,
unsigned int symbolDataLen,
int ccsid,
const char* const* argv,
const char* const* envp);
Descripción del parámetro:
parámetro de entrada pathName:
Indica la ruta del programa PASE en el IFS sistema de archivos, que se puede utilizar Una ruta absoluta o una ruta relativa a la ruta actual del trabajo.
Parámetros de entrada SymbolName, SymbolData, SymbolDataLen
El parámetro SymbolName debe definirse como un puntero nulo; los parámetros SymbolData y SymbolDataLen generalmente se ignoran.
Parámetro de entrada CCSID:
Este parámetro determina el CCSID de la ejecución inicial del programa PASE. El sistema convierte los datos de parámetros del CCSID predeterminado del trabajo a la codificación correspondiente. Por ejemplo, un CCSID de 1208 indica codificación UTF-8.
parámetro argv:
argv apunta a una matriz de punteros que es la tabla de parámetros del programa IBM i PASE. El primer parámetro es el nombre de la ruta del programa PASE y el valor de este parámetro es el mismo que el valor del parámetro nombre de la ruta.
parámetro envp:
El parámetro envp apunta a una matriz de punteros que define las variables de entorno para el programa IBM i PASE.
El valor de retorno de Qp2RunPase puede proporcionar más información para que los usuarios puedan procesar el estado de ejecución del programa PASE.
Normalmente, "0" indica un retorno normal y un valor distinto de cero indica un retorno de error, como "QP2RUNPASE_ERROR(-1)" o "QP2RUNPASE_RETURN_NOEXIT(-2)". función en sí. IBM i también proporciona algunas macros para manejar los valores de retorno, como se muestra en la siguiente tabla:
Tabla 1. Uso de macros para procesar los valores de retorno de Qp2RunPase
Macro
Significado
WIFEXITED(stat_val) Si devuelve un valor distinto de cero, indica que hay un error en el proceso de ejecución de la función Qp2RunPase. Debe llamar a la siguiente macro para obtener los detalles del error. /p>
WEXITSTATUS(stat_val) Cuando la macro WIFEXITED( Cuando stat_val) devuelve un valor distinto de cero, indica un error en el proceso de ejecución. Esta macro devolverá el valor de retorno del programa PASE
WIFSIGNALED(stat_val) Compruebe si el programa PASE finalizó anormalmente por la señal
WTERMSIG(stat_val) Cuando la macro WIFSIGNALED(stat_val) devuelve un valor distinto de cero, lo que indica que el proceso de ejecución finalizó mediante una señal. Esta macro confirma el número de señal recibido específico
Ejemplo de programa:
Listado 5. Ejemplo de uso de la función Qp2RunPase
int rc = Qp2RunPase(“program/path/ in /PASE", NULL, NULL, 0, 819, (char**)amp; argv, NULL);
if (rc == QP2RUNPASE_ERROR || rc == QP2RUNPASE_RETURN_NOEXIT)
{
printf (“error interno”);
}
if (WIFEXITED(rc) != 0)
{
// El comando salió normalmente, verifique su código de retorno
paseRC = WEXITSTATUS(rc);
printf (“pase salida del programa sin retorno cero: d ", paseRC);
}
Llame a la función PASE en el programa ILE
Lo anterior presenta la llamada del programa de aplicación en el entorno PASE IBM i en ILE También se proporciona un conjunto de API que admiten llamadas directas a la biblioteca compartida PASE. El proceso de llamada requiere las siguientes funciones:
Qp2ptrsize: obtiene la longitud del puntero de PASE. PASE admite el modo de 32 bits y el modo de 64 bits.
Qp2dlopen: similar a la función dlopen() en UNIX, utilizada para abrir la biblioteca compartida PASE.
Qp2dlsym: similar a la función dlsym() en UNIX, se utiliza para encontrar la entrada de función correspondiente.
Qp2dlclose: similar a la función dlclose() en UNIX, utilizada para cerrar la biblioteca compartida PASE.
Qp2dlerror: Si ocurre un error durante la ejecución de la función Qp2dlopen, Qp2dlsym o Qp2dlclose, el usuario puede utilizar esta función para obtener la información del error.
Qp2malloc: Asigna una memoria en PASE, *** intercambio de datos entre ILE y PASE.
Qp2free: Se utiliza para liberar la memoria asignada por la función Qp2mallloc.
Qp2CallPase
Qp2CallPase permite a los usuarios llamar a funciones en la biblioteca compartida PASE en programas ILE. Qp2CallPase no generará una nueva tarea, solo ejecutará la función PASE en la tarea actual.
Listado 6. Prototipo de función Qp2CallPase
#include lt; qp2user.hgt
int Qp2CallPase(
const void* target,
const void* arglist,
const QP2_arg_type_t* firma,
QP2_result_type_t result_type,
void* resultado);
Descripción del parámetro:
objetivo
Descriptor de la función PASE.
arglist:
La lista de argumentos para la función PASE de IBM i.
firma
El tipo específico del parámetro. QP2_ARG_END representa el final de la lista de firmas, QP2_ARG_WORD representa datos de 4 bytes, QP2_ARG_FLOAT32 representa datos de punto flotante de 4 bytes y QP2_ARG_FLOAT64 representa datos de punto flotante de 8 bytes.
result_type
El tipo de valor de retorno de la función PASE llamada se define en el archivo de encabezado qp2user.h. QP2_RESULT_VOID indica que la función PASE no tiene valor de retorno, QP2_RESULT_WORD indica datos de 4 bytes, QP2_RESULT_DWORD indica datos de 8 bytes y QP2_RESULT_FLOAT64 indica datos de punto flotante de 8 bytes.
resultado
El valor de retorno de la función PASE.
A continuación se describe el uso y los pasos de la función Qp2CallPase:
Inicialización: el entorno IBM i PASE debe inicializarse antes de llamarlo. El entorno IBM i PASE proporciona dos herramientas para la inicialización, una es /usr/bin/start32, que se utiliza para activar el entorno IBM i PASE de 32 bits, y la otra es /usr/bin/start64, que se utiliza para activar el entorno IBM i PASE de 64 bits. Cada proceso de IBM i debe ejecutar sólo un entorno IBM iPASE independiente.
Comprobación: Llame a Qp2ptrsize() para determinar si el entorno IBM i PASE está funcionando correctamente. Valor de retorno:
0, lo que indica que la inicialización no se ha completado.
4, que indica que el entorno PASE se está ejecutando en modo de 32 bits.
8, que indica que el entorno PASE se está ejecutando en modo de 64 bits.
Cargando la biblioteca: use Qp2dlopen y Qp2dlsym para cargar la biblioteca llamada en la memoria y luego ubique la entrada de la función llamada.
Llamar a Qp2CallPase: utilice la API Qp2CallPase() para activar la función de biblioteca compartida PASE y la lista de parámetros de la función llamada se pasa a Qp2CallPase en forma de una matriz de punteros. El código ILE también debe proporcionar una forma de describir el tipo de lista de parámetros, normalmente denominada Firma. Los usuarios pueden encontrar estas definiciones de tipos en el archivo de encabezado qsysinc/qp2usr.h.
Termine el proceso IBM i PASE: primero debe llamar a Qp2dlclose() para desinstalar la biblioteca compartida de IBM i PASE y luego llamar a la función Qp2EndPase() para finalizar el entorno PASE iniciado por start64 o start32. programa.
Listado 7. Ejemplo de uso de la función Qp2CallPase
#include lt; stdio.hgt
#include qp2shell2.hgt; > #include lt; qp2user.hgt;
#define JOB_CCSID 0
int main(int argc, char* argv[])
{
QP2_ptr64_t id;
void* getpid_pase
const QP2_arg_type_t firma[] = {QP2_ARG_END}
QP2_word_t resultado
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, // sin lista de argumentos
firma,
QP2_RESULT_WORD,
amp; resultado)
printf ("IBM i PASE getpid() = amp; i\n", resultado
if (resultado ==); -1)
printf ("IBM i errno = i\n", *Qp2errnop()
Qp2dlclose(id
Qp2EndPase()); ;
return 0;
}
Compile el programa del lado ILE para generar un PGM ejecutable
En el lado ILE que usualmente usamos Comando CRTCMOD (si el archivo del programa fuente está escrito en lenguaje ILE C) o CRTCPPMOD (si el archivo del programa fuente está escrito en lenguaje ILE C) para compilar el programa lateral ILE en MÓDULO y luego usar CRTPGM para convertir los MÓDULOS compilados. ) y Enlace del programa de servicio para generar PGM ejecutable.
Listado 8. Compilación y vinculación del programa en ILE
CRTCCMOD MODULE(QYOURLIB/YOURMOD) SRCFILE(QYOURLIB/QCSRC)
O: ÷ CRTCPPMOD MODULE( QYOURLIB /YOURMOD)
SRCSTMF('/qopensys/myprogram/myprogram.cpp') INCDIR('/qopensys/myprogram/include')
CRTPGM PGM(QYOURLIB/YOURPGM) MÓDULO ( QYOURLIB/YOURMOD)
BNDSVRPGM(QSYS/QP2USER)