Определите среду, z / OS UNIX против JCL или TSO - PullRequest
0 голосов
/ 29 марта 2020

Какую функцию я могу вызвать из программы C, чтобы узнать, в какой среде z / OS выполняется программа, например, это z / OS UNIX (она же USS) или, скажем, из TSO через JCL?

1 Ответ

3 голосов
/ 10 апреля 2020

Существует два подхода: CEE3INF и копаться в областях данных z / OS.

CEE3INF имеет то преимущество, что его можно документировать и переносить в любую среду LE, а также предоставлять информацию о PIPI, которую нелегко найти в структурах z / OS.

В качестве альтернативы CEE3INF, в областях системных данных есть много информации, если вам просто нужно различить guish между Batch, TSO, CICS и независимо от того, были ли вы дублированы как Процесс USS. Альтернатива проста и особенно полезна вне среды LE ... хотя это даже легко сделать в C, просто загрузив некоторые указатели, которые вы можете получить, используя структуру XL C DSECT в C утилита преобразования.

Адресное пространство TSO - это пространство, в котором ASCBTSB не равен нулю (PSAAOLD-> ASCBTSB). Пакетное задание - это задание, в котором заполнен ASCBJBNI (PSAAOLD-> ASCBJBNI). Адресное пространство CICS имеет ненулевое значение TCBCAUF (PSATOLD-> TCBCAUF).

В любом из вышеперечисленных случаев вы также можете проверить, была ли ваша задача дублирована как процесс UNIX, проверив TCB-> STCB-> STCBOTCB. Если не ноль, вы дублированы и можете использовать UNIX Сервисы. Поле OTCBPRLI содержит информацию о процессе, такую ​​как PID, а THLI содержит информацию об уровне потока.

Обратите внимание, что для данной задачи может быть допустимо использование функций USS, но пока нет. Функция querydub () может помочь вам различить guish между заданием, которое уже было перезаписано, и заданием, которое может быть, но просто еще не было.

Если вы используете CEE3INF, были некоторые комментарии о том, что он не работает должным образом вне функции main (), но я думаю, что проблема заключается в небольшой ошибке в примере, который IBM предоставляет в своей документации. Этот пример отлично работает на моих системах z / OS 2.3 и 2.4:

#include <leawi.h>
#include <string.h>
#include <ceeedcct.h>

int do_call(void) 
{
 _INT4 sys_subsys,env_info,member_id,gpid;
 _FEEDBACK fc;
 CEE3INF(&sys_subsys,&env_info,&member_id,&gpid,&fc);
 if ( _FBCHECK(fc,CEE000) != 0 ) 
 {
   printf("CEE3INF failed with message number %d\n", fc.tok_msgno);
 }
 printf("System/Subsystem in hex %08x \n",sys_subsys);
 printf("Enviornment info in hex %08x \n",env_info);
 printf("Member languages in hex %08x \n",member_id);
 printf("GPID information in hex %08x \n",gpid);
 printf("\n");
}

int main(void)
{
   do_call();
}

Это пример кода из руководства IBM, за исключением уведомления в обращении к CEE3INF, в IBM do c есть ошибка («... f c» вместо «... & f c»). Были комментарии о том, что CEE3INF не работает, если вызывается вне main (), но я думаю, что проблема заключается просто в ошибке в примере выше.

Чтобы проверить, я скомпилировал приведенный выше код в оболочке UNIX Services с помощью этой команды:

xlc -o testinf testinf.c     

Затем я запускаю исполняемый файл из сеанса оболочки z / OS:

> ./testinf                 
System/Subsystem in hex 02000002 
Enviornment info in hex 00540000 
Member languages in hex 10000000 
GPID information in hex 04020300 

Это система z / OS 2.3 - я получаю идентичные результаты на 2.4.

...