Взаимодействие z / OS MVS и z / OS UNIX в программе PL / I? - PullRequest
0 голосов
/ 08 июня 2018

Я копался в различных ресурсах в Интернете, но не смог найти однозначного ответа, который понял, поэтому спрашиваю здесь:

Как я могу вызвать z /Код ОС UNIX из z / OS MVS?

Я знаю, что BPXBATCH PGM ... может вызывать программу z / OS UNIX из z / OS MVS TSO.

Но могу ли я это сделатьчто, например, внутри z / OS MVS PL / I программы?

Что я хочу сказать,

  • Могу ли я статически связать вместе объектные модули z / OS MVS PL / I и z/ OS UNIX C объектные модули?(Есть ли разница между обоими, кроме разных языков программирования?)
  • Или я могу динамически связать оба?

Мой пример использования: у меня старый PL / Iбиблиотека 1970-х годов, которая теперь получает требование для создания сетей.И, насколько я понял, работа в сети в мире z / OS UNIX прошла бы гладко.

Старая библиотека PL / I статически связана с множеством других программ, на которые я не могу влиять напрямую.

PS: Может кто-то с большей репутацией, пожалуйста, установите тег PLI StackOverflow?;-)

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Ответьте только на вопрос «статическое связывание объектов C и PL / I».

Скомпилированный объект из C или PL / I - это просто скомпилированные объекты. Где вы их компилируете (TSO или USS) не имеет значения;а также то, где они находятся (каталог PDS / PDSE или каталог HFS), также не имеет значения.

Фактически, вы можете легко скопировать из HFS (например, hello.o) в PDS.

cp hello.o "//'MYHLQ.OBJ(HELLO)'"

или даже скомпилирован в USS и выведет .o на PDS

c89 -c hello.c -o "//'MYHLQ.OBJ(HELLO)'"

, а затем используйте BINDER для связи (или наоборот, скопируйте OBJECT из PDS в HFS и используйтеld to link)

Однако существует 2 формата объектных файлов: XOBJ и GOFF.

GOFF - более новый формат, и если вы используете XPLINK, это предварительное требование.Программа 64bit LE на z / OS также требует XPLINK.Сам GOFF также предварительно требует PDS / E.

0 голосов
/ 12 июня 2018

Существует большая путаница в отношениях между z / OS и службами UNIX, но следует помнить, что это не две разные вещи ... практически любая задача может стать процессом UNIX и выполнять вызовы функций USS., с правильной настройкой.

Так что на самом деле ваш вопрос состоит из двух вопросов в одном:

  1. Как мне перезаписать мою задачу как процесс UNIX, чтобы я мог выпускать функции ядра USS?
  2. Совместим ли мой PL / I-компилятор со средой выполнения LE и с объектными библиотеками, код которых построен с использованием других языков LE?

Первая часть - как дублировать ваш процесс как процесс UNIX - довольно проста.Подход IBM требует, чтобы вы были подключены к ядру USS (адресному пространству OMVS), прежде чем вы сможете вызывать функции UNIX, но обычно это происходит автоматически при первом запуске функции USS.

Для использования USS требуется определенная настройка системы.Конечно, сама OMVS должна быть активной (хотя в наши дни ее нет).Ваш администратор безопасности должен дать вам номер UID и, возможно, создать домашний каталог для вас.Предполагая, что с этой частью все в порядке, все, что вам нужно сделать, это вызвать функцию USS, и теперь вы - процесс служб UNIX.

Практически любое приложение может вызывать вызываемые службы IBM USS (это все модули с именами, начинающимися сс BPX1 / BPX4) - все, что нужно, это что-то, поддерживающее стандартную связь с ОС.Действительно, это в значительной степени то, что делают библиотеки времени выполнения IBM.Хорошим тестом было бы вызвать BPX1GPI (это UNIX "getpid ()") ... он возвращает ваш идентификатор процесса UNIX, и если вы можете заставить это работать, вы можете использовать большинство других сервисов UNIX.Если бы вы следили за реализацией LE "getpid ()", вы бы обнаружили, что это не намного больше, чем тонкий слой над BPX1GPI, поэтому нет никаких причин, по которым вы не можете вызывать базовую функцию самостоятельно ... это работает с большинствомиз функций ядра USS, а не просто getpid (), поэтому, если вы не можете понять, как открыть сокет, вызов BPX1SOC всегда является хорошим «планом B».

Имейте в виду, что есть разница между процессом UNIX и выполнением чего-то вроде оболочки bash ... оболочка выполняет такие действия, как настройка STDIN / OUT / ERR и т. Д. - если вам это нужно,вам нужно будет сделать это самостоятельно, если вы просто подключитесь к USS из ниоткуда.Вы не можете вызывать такие вещи, как printf (), пока не настроите стандартные дескрипторы файлов.

Простой способ начать работу - это написать себе короткую C-программу, которая работает как процесс UNIX, настроить STDIN / OUT / ERR (и все, что вам нужно), а затем вызвать текущий PL /.Я программирую.Это «оборачивает» ваш текущий код таким образом, что настраивает любые элементы USS, которые вам нужны, без необходимости делать это в PL / I.Вы также можете найти этот удобный способ сделать некоторые вещи, которые в противном случае являются сложными в PL / I, такие как вызов функций DLL ... просто напишите короткую функцию C, чтобы сделать то, что вам нужно, а затем вызовите эту функцию из вашего PL /Я кодирую.

Что касается второй части вашего вопроса, если ваш PL / I использует среду выполнения LE (что будет, если только она не очень старая), то микширование кода из других библиотек будет намного проще, чем кажется.Что касается основной среды выполнения, в большинстве случаев функции среды выполнения LE достаточно умны, чтобы быть «бимодальными» в том смысле, что одна и та же функция времени выполнения работает как в процессах USS, так и в процессах, не связанных с USS.Код объекта - это объектный код, и разница между, скажем, открытым файлом z / OS и открытым файлом служб UNIX не более чем то, вызывает ли среда выполнения вызовы SVC 19 (для z / OS OPEN) или BPX1OPN (для файлов служб UNIX).Это просто означает, что после того, как ваш код перезаписан как процесс USS, вы можете в большинстве случаев смешивать функции z / OS и USS по своему усмотрению.

Это также означает, что нет причин, по которым вы не можете использовать такие вещи, как "libxyz.a" в программе PL / I, при условии, что на уровне LE нет несовместимостей и так далее.Может оказаться сложной задачей заставить связующего решить все так, как вы ожидаете, но все должно работать, если вы будете настойчивы.

Из PL / I будет несколько трудностей (и я прошу прощения - я не эксперт PL / I).Примером может быть вызов чего-то похожего на ваш пример libcurl, где библиотека представляет собой DLL, а не статический архив.Опять же, хитрость здесь может заключаться в использовании короткого «заглушки» C, который вы можете вызвать из PL / I, и этот код может сделать магию, необходимую для загрузки и вызова DLL.В противном случае, я думаю, вы найдете это довольно простое упражнение, как только соберете все части.

0 голосов
/ 08 июня 2018

Одной из целей среды исполнения IBM Language Environment (LE) было обеспечение взаимодействия между COBOL, PL / I, Assembler и FORTRAN.C и C ++ позже пришли на прогулку.

Компиляторы, которые генерировали код, не соответствующий LE, не очень хорошо играли друг с другом (если вы будете осторожны, вы можете заставить всех игроков работать вместе).Компиляторы, которые генерируют код, соответствующий LE, хорошо играют друг с другом.Я написал код на языке COBOL, который использует подпрограммы времени выполнения C (fopen, fseek, fread, fclose, различные подпрограммы регулярных выражений), и это работало нормально благодаря LE.

Ваш ответ "Ну, вроде" на мой вопросо том, используете ли вы IBM Enterprise PL / I , может указывать на то, что вы уже находитесь в неподдерживаемой конфигурации.

Если ваша среда выполнения - LE, вы должны нормально вызывать подпрограммы времени выполнения C, которые поставляет IBM,Если ваша среда выполнения включает в себя некоторые старые неподдерживаемые подпрограммы OS PL / I, вы могли бы иметь возможность получать вызовы подпрограмм времени выполнения C, которые поставляет IBM для работы - но если бы я был в этой ситуации, я бы не сталспит беспробудно.Если вы можете связать свой старый код с использованием LE-версий старых подпрограмм времени выполнения OS PL / I, вы можете оказаться на более твердой почве.

...