Существует большая путаница в отношениях между z / OS и службами UNIX, но следует помнить, что это не две разные вещи ... практически любая задача может стать процессом UNIX и выполнять вызовы функций USS., с правильной настройкой.
Так что на самом деле ваш вопрос состоит из двух вопросов в одном:
- Как мне перезаписать мою задачу как процесс UNIX, чтобы я мог выпускать функции ядра USS?
- Совместим ли мой 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.В противном случае, я думаю, вы найдете это довольно простое упражнение, как только соберете все части.