Это команда perlos2, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
perlos2 - Perl для OS / 2, DOS, Win0.3 *, Win0.95 и WinNT.
СИНТАКСИС
Этот документ можно читать в следующих форматах:
человек perlos2
просмотреть perl perlos2
проводник perlos2.html
информация perlos2
чтобы перечислить некоторые (не все могут быть доступны одновременно), или его можно прочитать as is: либо как
README.os2 или pod / perlos2.pod.
Читать .INF версия документации (очень рекомендуется) вне OS / 2 требуется
Считыватель IBM (может быть доступен на ftp-сайтах IBM (?) (URL-адрес кто-нибудь?)) Или поставляется с PC DOS
7.0 и IBM Visual Age C ++ 3.5.
Копия программы просмотра Win * содержится в пакете «Просто добавьте OS / 2 Warp».
ftp://ftp.software.ibm.com/ps/products/os2/tools/jaow/jaow.zip
in ?: \ JUST_ADD \ view.exe. Это дает доступ к EMX .INF документы (текстовая форма
доступна в / emx / doc в дистрибутиве EMX). Также есть другой зритель с именем
просмотр.
Обратите внимание, что если у вас есть рысь.exe or netscape.exe установлен, вы можете переходить по WWW ссылкам с
этот документ в .INF формат. Если у вас правильно установлены документы EMX, вы можете следовать
ссылки на библиотеки (вам нужно, чтобы "view emxbook" работал, установив среду "EMXBOOK"
переменная, как это описано в документации EMX).
ОПИСАНИЕ
цель
Цель состоит в том, чтобы сделать OS / 2 одной из лучших поддерживаемых платформ для
использование / создание / разработка Perl и Perl Приложения, а также сделать Perl лучшим
язык для использования в OS / 2. Вторая цель - попытаться заставить эту работу работать под DOS и
Win * тоже (но не слишком жесткий).
Текущее состояние довольно близко к этой цели. Известные ограничения:
· Некоторые программы * nix используют вилка () много; с наиболее полезными разновидностями perl для OS / 2
(их строят одновременно несколько) это поддерживается; но некоторые ароматы не
поддержите это (например, когда Perl вызывается изнутри REXX). С использованием вилка () после используют ИНГ
динамически загружаемые расширения не работают с очень старые версии EMX.
· Вам нужен отдельный исполняемый файл Perl Perl__.exe (см. "perl __. exe"), если вы хотите использовать
Код PM в вашем приложении (как модули Perl / Tk или OpenGL Perl) без
присутствует окно в текстовом режиме.
При использовании стандартного perl.exe из окна текстового режима тоже возможно, у меня есть
известны случаи, когда это вызывает снижение стабильности системы. С использованием Perl__.exe
позволяет избежать такой деградации.
· Нет простого способа получить доступ к объектам WPS. Я знаю только один способ - через "OS2 :: REXX".
и расширения "SOM" (см. OS2 :: REXX, SOM). Однако у нас нет доступа к
удобные методы Object-REXX. (Возможно ли это вообще? Я не знаю ни одного Object-REXX
API.) Расширение "SOM" (в настоящее время в альфа-тексте) может в конечном итоге удалить это
недостаток; однако из-за того, что DII не поддерживается модулем "SOM",
пользоваться «СОМ» не так удобно, как хотелось бы.
Пожалуйста, обновляйте этот список, сообщая мне о других пунктах.
Прочее ОС
Поскольку порт Perl для OS / 2 использует замечательную среду EMX, он может запускаться (и создавать
расширения и, возможно, быть построенными самостоятельно) в любой среде, в которой может работать EMX. В
текущий список - это DOS, DOS-inside-OS / 2, Win0.3 *, Win0.95 и WinNT. Из многих perl
ароматы, работает только один, см. "perl_.exe".
Обратите внимание, что не все функции Perl доступны в этих средах. Это зависит от
особенности наполнитель - скорее всего RSX - решил внедрить.
Ср. «Предпосылки».
Предпосылки
EMX Требуется среда выполнения EMX (может быть заменена на RSX). Обратите внимание, что можно
сделать perl_.exe работать под DOS без какой-либо внешней поддержки путем привязки
emx.exe/rsx.exe к нему, см. "emxbind". Обратите внимание, что под DOS для достижения наилучших результатов один
следует использовать среду выполнения RSX, в которой работает гораздо больше функций (например, "fork", "popen"
и так далее). Фактически RSX требуется, если нет VCPI. Обратите внимание на RSX
требует DPMI. Известно, что многие реализации DPMI содержат множество ошибок, будьте осторожны!
Поддерживается только последняя версия среды выполнения, в настоящее время «0.9d fix 03». Perl может работать под
более ранние версии EMX, но это не тестировалось.
Можно получить разные части EMX, скажем,
ftp://crydee.sai.msu.ru/pub/comp/os/os2/leo/gnu/emx+ gcc /
http://hobbes.nmsu.edu/h-browse.php? dir = / pub / os2 / dev / emx / v0.9d /
Компонент среды выполнения должен иметь имя emxrt.zip.
ЗАМЕТКА, Когда используешь emx.exe/rsx.exe, достаточно, чтобы они были на вашем пути. Один делает
не нужно указывать их явно (хотя это
emx perl_.exe -де 0
тоже будет работать.)
RSX Для запуска Perl на платформах DPMI необходима среда выполнения RSX. Это необходимо под
DOS-inside-OS / 2, Win0.3 *, Win0.95 и WinNT (см. «Другие операционные системы»). RSX не будет работать
только с VCPI, как и EMX, требуется DMPI.
Имея RSX и последнюю версию sh.exe получается полностью функциональный * Никс-ровая среда
под DOS работают, скажем, "fork", "` `" и pipe- "open". На самом деле MakeMaker работает (для
статическая сборка), поэтому можно иметь среду разработки Perl под DOS.
Можно получить RSX, скажем,
http://cd.textfiles.com/hobbesos29804/disk1/EMX09C/
ftp://crydee.sai.msu.ru/pub/comp/os/os2/leo/gnu/emx+ gcc / contrib /
Свяжитесь с автором по "[электронная почта защищена]".
В последнем sh.exe с перехватчиками DOS доступен в
http://www.ilyaz.org/software/os2/
as sh_dos.zip или под похожими именами, начинающимися с «sh», «pdksh» и т. д.
HPFS Perl не заботится о файловых системах, но библиотека perl содержит много файлов с
длинные имена, поэтому для его установки необходима файловая система, поддерживающая длинные файлы
имена.
Обратите внимание: если вы не планируете создавать сам Perl, возможно, можно обмануть
EMX для обрезки имен файлов. Это не поддерживается, прочтите документацию EMX, чтобы узнать, как это сделать.
его.
pdksh Для запуска внешних программ со сложными командными строками (например, с конвейерами в
между и / или цитированием аргументов) Perl использует внешнюю оболочку. С портом EMX
такую оболочку следует назвать sh.exe, и находится либо в файле wired-in-during-compile
локации (обычно F:/ бен) или в настраиваемом месте (см. «PERL_SH_DIR»).
Для достижения наилучших результатов используйте EMX pdksh. Стандартный двоичный файл (5.2.14 или новее) работает под DOS.
(с "RSX"), см.
http://www.ilyaz.org/software/os2/
Начало Perl программы недооценивают ее OS / 2 (И DOS и...)
Запустите вашу программу Perl foo.pl с аргументами "arg1 arg2 arg3" так же, как и на любом
другая платформа, автор:
Perl foo.pl arg1 arg2 arg3
Если вы хотите указать параметры perl "-my_opts" для самого perl (в отличие от вашего
программа), используйте
perl -my_opts foo.pl arg1 arg2 arg3
В качестве альтернативы, если вы используете оболочку OS / 2-ish, такую как CMD или 4os2, поставьте в начале следующее:
вашего Perl-скрипта:
extproc perl -S -my_opts
переименуйте вашу программу в foo.cmdи запустите его, набрав
foo arg1 arg2 arg3
Обратите внимание, что из-за глупых ограничений OS / 2 полный путь к сценарию perl не
доступен, когда вы используете "extproc", поэтому вы вынуждены использовать Perl-переключатель "-S", а ваш
сценарий должен быть в «ПУТЬ». В качестве плюса, если вы знаете полный путь к вашему скрипту,
вы все еще можете начать это с
perl ../../blah/foo.cmd arg1 arg2 arg3
(обратите внимание, что аргумент "-my_opts" обрабатывается строкой "extproc" в вашем скрипте,
см. "extproc" в первой строке ").
Чтобы понять, что выше магия есть, прочтите документацию perl о переключателе "-S" - см. perlrun,
и cmdref о "extproc":
просмотреть perl perlrun
человек Perlrun
просмотреть cmdref extproc
помощь extproc
или любой другой метод, который вы предпочитаете.
Есть также бесконечные возможности использования выполнимый расширения из 4os2, ассоциации of
WPS и так далее ... Однако, если вы используете * nixish shell (например, sh.exe поставляется в двоичном формате
дистрибутив), вам необходимо следовать синтаксису, указанному в «Командных переключателях» в perlrun.
Обратите внимание, что -S коммутатор поддерживает скрипты с дополнительными расширениями .cmd, .btm, .bat, .pl as
Что ж.
Начало OS / 2 (И НАЗАД) программы недооценивают ее Perl
Это то, что система() (см. "system" в perlfunc), "` `" (см. "Операторы ввода-вывода" в perlop),
и открытый труба (см. «open» в perlfunc) для. (Избегать exec () (см. "exec" в perlfunc)
если вы не знаете, что делаете).
Однако обратите внимание, что для использования некоторых из этих операторов вам потребуется оболочка sh-синтаксиса.
установлен (см. «Pdksh», «Часто задаваемые вопросы»), и perl должен его найти.
(см. «PERL_SH_DIR»).
Случаи использования оболочки:
1. Один аргумент система() (см. «систему» в perlfunc), exec () (см. "exec" в perlfunc) с
перенаправление или метасимволы оболочки;
2. Pipe-open (см. «Open» в perlfunc) с помощью команды, которая содержит перенаправление или
мета-символы оболочки;
3. Обратные кавычки "` "(см." Операторы ввода-вывода "в perlop) с командой, которая содержит
перенаправление или метасимволы оболочки;
4. Если исполняемый файл вызван система()/exec ()/трубка-открытый()/ "` `" - это скрипт с
"магия" "#!" строка или строка "extproc", определяющая оболочку;
5. Если исполняемый файл вызван система()/exec ()/трубка-открытый()/ "` `" - это скрипт без
"волшебная" строка, а $ ENV {EXECSHELL} устанавливается в оболочку;
6. Если исполняемый файл вызван система()/exec ()/трубка-открытый()/ "` `" не найдено (не в этом
замечание устарело?);
7. Для подстановки (см. «Glob» в perlfunc, «Операторы ввода-вывода» в perlop) (устарело? Perl использует
встроенные глобусы в настоящее время ...).
Для скорости в общем случае в приведенных выше алгоритмах обратная косая черта в
Имя команды не рассматривается как метасимволы оболочки.
Perl запускает скрипты, которые начинаются с cookies "extproc" или "#!" напрямую, без
вмешательство оболочки. Perl использует тот же алгоритм для поиска исполняемого файла, что и пдкш: если
путь на "#!" строка не работает, и содержит "/", то часть каталога
исполняемый файл игнорируется, а исполняемый файл ищется в . и на «ПУТЬ». Найти
аргументы для этих сценариев Perl использует другой алгоритм, чем пдкш: до 3 аргументов
распознаются, а конечные пробелы удаляются.
Если в скрипте такой куки нет, то во избежание вызова sh.exe, Perl использует
тот же алгоритм, что и пдкш: если установлен $ ENV {EXECSHELL}, скрипт дается как первый
аргумент этой команды, если не установлен, то используется "$ ENV {COMSPEC} / c" (или
угадайте, если $ ENV {COMSPEC} не установлен).
При непосредственном запуске скриптов Perl использует тот же алгоритм, что и для поиска
сценарий предоставлен -S параметр командной строки: он будет искать в текущем каталоге, затем в
компоненты $ ENV {PATH} с использованием следующего порядка добавления расширений: без расширения,
.cmd, .btm, .bat, .pl.
Обратите внимание, что Perl начнет искать сценарии только в том случае, если OS / 2 не может запустить указанный
приложение, поэтому "system 'blah'" не будет искать скрипт, если есть исполняемый файл
файл бла.exe откуда угодно на «ПУТЬ». Другими словами, "ПУТЬ" по существу ищется дважды:
сначала ОС для исполняемого файла, затем Perl для сценариев.
Также обратите внимание, что исполняемые файлы в OS / 2 могут иметь произвольное расширение, но .exe будет
добавляется автоматически, если в имени нет точки. Обходной путь так же прост, как
что: поскольку мля. и вздор обозначают один и тот же файл (в списке файловых систем FAT и HPFS),
запустить исполняемый файл, находящийся в файле n: / bin / blah (без расширения) дать аргумент
"п: / bin / blah." (добавлена точка) к система().
Perl запускает программы PM из процесса Perl VIO (= текстовый режим) в отдельном сеансе PM;
обратное неверно: когда вы запускаете программу, не относящуюся к PM, из процесса PM Perl, Perl
не будет запускать его в отдельном сеансе. Если требуется отдельный сеанс, либо убедитесь, что
эта оболочка будет использоваться, как в "system 'cmd / c myprog'", или запустить ее, используя необязательный
аргументы система() задокументировано в модуле "OS2 :: Process". Это считается
функцию.
Часто спросил вопросов
"Это приносит Работа"
Бинарные дистрибутивы Perl поставляются с testperl.cmd скрипт, который пытается обнаружить распространенные
проблемы с неправильно настроенными установками. Есть довольно большая вероятность, что это будет
узнайте, на каком этапе установки вам удалось обойтись. ";-)"
I не могу пробег и, что лучший способ программы
· Вы запускали свои программы с ключом "-w"? См. "Запуск программ OS / 2 (и DOS)"
под Perl ».
· Вы пытаетесь бежать в нашей внутренней среде, команды оболочки, такие как "` copy ab` "(внутренние для cmd.exe),
или "glob a * b`" (внутренний для ksh)? Вам нужно явно указать свою оболочку, например
"` cmd / c copy ab` ", поскольку Perl не может определить, какие команды являются внутренними для вашего
ракушка.
I не могу вставлять Perl в my программа, or используют perl.dll от my программу.
Ваша программа компилируется в EMX с помощью "-Zmt -Zcrtdll"?
Что ж, в настоящее время Perl DLL можно использовать и из другой скомпилированной программы ...
Если вы можете запускать код Perl из сценариев REXX (см. OS2 :: REXX), то есть и другие
аспект взаимодействия, который игнорируется текущим хакерским кодом для поддержки
по-разному скомпилированные основные программы.
Если ничего не помогает, вам нужно создать автономную DLL для perl. Свяжитесь со мной, я
сделал это однажды. Сокеты не работают, как и многое другое.
Вы использовали ExtUtils :: Embed?
Некоторое время назад у меня были сообщения, что он не работает. Сейчас это проверено в тесте Perl.
люкс, так что grep ./т подкаталог дерева сборки (а также * .t файлы в ./ Lib
подкаталог), чтобы узнать, как это должно быть сделано "правильно".
"` `" и труба- «открытая» do работает недооценивают ее DOS.
Это может быть вариант просто «Я не могу запускать внешние программы» или более серьезная проблема.
В основном: ты RSX (см. «Предварительные требования») для работы этих команд, и вам может потребоваться
порт sh.exe который понимает аргументы команд. Один из таких портов указан в
«Предпосылки» под RSX. Не забудьте также установить переменную «PERL_SH_DIR».
DPMI требуется для RSX.
Не могу Начало "find.exe "шаблон" файл"
Вся идея «стандартного C API для запуска приложений» состоит в том, что формы «foo» и
«foo» аргументов программы полностью взаимозаменяемы. найдите ломает эту парадигму;
найти файл "шаблон"
найти файл шаблона
не эквивалентны; найдите не может быть запущен напрямую с помощью вышеуказанного API. Нужен способ
заключить двойные кавычки в какую-либо другую конструкцию цитирования, обязательно имеющую
дополнительная не-Unixish оболочка между ними.
Используйте один из
система 'cmd', '/ c', 'найти файл "шаблон";
`cmd / c 'найти файл" шаблона "
Это начнется FIND.EXE с помощью cmd.exe через "sh.exe" через "perl.exe", но это цена
платите, если хотите использовать несовместимую программу.
МОНТАЖ
Автоматический двоичный установка
Самый удобный способ установки бинарного дистрибутива perl - через установщик perl.
install.exe. Просто следуйте инструкциям и 99% инсталляционной хандры пошло бы.
далеко.
Однако обратите внимание, что вам необходимо иметь unzip.exe на вашем пути и в среде EMX Бег.
Последнее означает, что если вы только что установили EMX и внесли все необходимые изменения в
config.sys, вам может потребоваться перезагрузка между ними. Проверьте время выполнения EMX, запустив
Эмксрев
Бинарный установщик также создает на вашем рабочем столе папку с некоторыми полезными объектами. если ты
необходимо изменить некоторые аспекты работы бинарного установщика, смело редактируйте
файл Perl.pkg. Это может быть полезно, например, если вам нужно запускать установщик много раз и
не хочу вносить много интерактивных изменений в графический интерфейс.
Вещи приняты заботится of by автоматически двоичный монтаж:
"PERL_BADLANG" может потребоваться, если вы измените кодовую страницу. после установка perl и
новое значение не поддерживается EMX. См. «PERL_BADLANG».
«PERL_BADFREE» см. «PERL_BADFREE».
Конфиг.pm Этот файл находится где-то глубоко в том месте, где вы установили свой perl.
библиотека, узнайте это
perl -MConfig -le "распечатать $ INC {'Config.pm'}"
Хотя наиболее важные значения в этом файле обновляется двоичным кодом
установщик, некоторые из них, возможно, потребуется отредактировать вручную. Я таких данных не знаю,
пожалуйста, дайте мне знать, если найдете. Кроме того, ручные изменения
установленная версия может нуждаться в сопровождении редактирования этого файла.
ЗАМЕТКА. Из-за опечатки двоичный установщик 5.00305 установил бы переменную
"PERL_SHPATH" в config.sys. Удалите эту переменную и введите вместо нее «PERL_SH_DIR».
Ручная двоичный установка
Начиная с версии 5.00305, двоичный дистрибутив perl для OS / 2 разделен на 11 компонентов.
К сожалению, чтобы включить настраиваемую двоичную установку, пути к файлам в zip-файлах
не являются абсолютными, а относятся к некоторому каталогу.
Обратите внимание, что извлечение с сохраненными путями все еще необходимо (по умолчанию с распаковкой,
укажите "-d" для pkunzip). Однако вам нужно знать, куда извлекать файлы. Тебе нужно
также вручную изменять записи в config.sys чтобы отразить, куда вы положили файлы. Примечание
что если у вас есть примитивный распаковщик (например, pkunzip), вы можете получить много
предупреждения / ошибки при разархивировании. Обновите до "(w) unzip".
Ниже приведен пример того, что нужно сделать, чтобы воспроизвести конфигурацию на моем компьютере. В
ПРОСМОТР.EXE теперь вы можете нажать «Ctrl-Insert» и вырезать и вставить из полученного файла -
создан в каталоге, который вы запустили ПРОСМОТР.EXE из.
Для каждого компонента мы упоминаем переменные среды, относящиеся к каждой установке.
каталог. Либо выберите каталоги, соответствующие вашим значениям переменных, либо
переменные create / append-to для учета каталогов.
Исполняемые файлы Perl VIO и PM (динамически связанные)
распаковать perl_exc.zip * .exe * .ico -df: /emx.add/bin
распаковать perl_exc.zip * .dll -df: /emx.add/dll
(иметь каталоги с «* .exe» в PATH и «* .dll» в LIBPATH);
Исполняемый файл Perl_ VIO (статически связанный)
распаковать perl_aou.zip -df: /emx.add/bin
(иметь каталог на PATH);
Исполняемые файлы для утилит Perl
распаковать perl_utl.zip -df: /emx.add/bin
(иметь каталог на PATH);
Основная библиотека Perl
распаковать perl_mlb.zip -df: / perllib / lib
Если этот каталог в точности совпадает с префиксом, который был скомпилирован в perl.exe,
ничего менять не нужно. Однако, чтобы Perl мог найти библиотеку, если вы используете
другой путь, вам нужно "установить PERLLIB_PREFIX" в config.sysсм. «PERLLIB_PREFIX».
Дополнительные модули Perl
распаковать perl_ste.zip -df: /perllib/lib/site_perl/5.22.1/
Применяется то же замечание, что и выше. Кроме того, если этот каталог не входит в
каталоги на @INC (а на @INC влияет "PERLLIB_PREFIX"), вам нужно поместить это
каталог и подкаталог ./ос2 в переменной "PERLLIB" или "PERL5LIB". Не используй
"PERL5LIB", если он еще не установлен. См. «ОКРУЖАЮЩАЯ СРЕДА» в perl.
[Проверять будь то этой добыча каталог is все еще отношение новый каталог
Структура макет!]
Инструменты для компиляции модулей Perl
распаковать perl_blb.zip -df: / perllib / lib
То же замечание, что и для perl_ste.zip.
Manpages для Perl и утилит
распаковать perl_man.zip -df: / perllib / man
Этот каталог лучше всего находится на "MANPATH". Вам нужно иметь рабочий человек , чтобы открыть
эти файлы.
Страницы управления модулями Perl
распаковать perl_mam.zip -df: / perllib / man
Этот каталог лучше всего находится на "MANPATH". Для доступа нужен рабочий мужчина.
эти файлы.
Источник документации Perl
распаковать perl_pod.zip -df: / perllib / lib
Это используется программой "perldoc" (см. Perldoc) и может использоваться для генерации HTML.
документация, доступная для браузеров WWW, и документация в миллионах других форматов:
"информация", "LaTeX", "Acrobat", "FrameMaker" и так далее. [Используйте такие программы, как pod2латекс
так далее.]
Руководство по Perl в .INF формат
распаковать perl_inf.zip -dd: / os2 / book
Этот каталог лучше всего на «КНИЖНОЙ ПОЛКЕ».
Пдкш
распаковать perl_sh.zip -df:/ бен
Это используется perl для запуска внешних команд, которые явно требуют оболочки, например
команды с использованием перенаправление и оболочка метасимволы. Он также используется вместо
явный / Бен / ш.
Установите «PERL_SH_DIR» (см. «PERL_SH_DIR»), если вы перемещаетесь sh.exe из указанного выше места.
Примечания. Возможно, удастся использовать какую-нибудь другую sh-совместимую оболочку (непроверенную).
После установки необходимых компонентов и обновления config.sys соответственно,
вам нужно отредактировать вручную Конфиг.pm. Этот файл находится где-то глубоко в том месте, где вы
установил вашу библиотеку Perl, узнайте ее
perl -MConfig -le "распечатать $ INC {'Config.pm'}"
Вам необходимо исправить все записи, которые выглядят как пути к файлам (в настоящее время они начинаются с
"f: /").
Предупреждение
Автоматическая и ручная установка perl оставляет предварительно скомпилированные пути внутри perl.
исполняемые файлы. Хотя эти пути можно перезаписывать (см. «PERLLIB_PREFIX», «PERL_SH_DIR»),
некоторые люди могут предпочесть двоичное редактирование путей внутри исполняемых файлов / DLL.
Доступ к документации
В зависимости от того, как вы собрали / установили Perl, у вас может быть (в остальном идентичный) Perl
документация в следующих форматах:
OS / 2 .INF файл
Скорее всего, самая удобная форма. В OS / 2 просмотрите его как
просмотреть Perl
просмотреть perl perlfunc
смотреть на Perl меньше
просмотреть perl ExtUtils :: MakeMaker
(в настоящее время последние два могут попасть не в то место, но это может скоро улучшиться). Меньше победы *
см. «ОБЗОР».
Если вы хотите самостоятельно создавать документы и иметь OS / 2 Инструментарий, бежать
pod2ipf> perl.ipf
in / perllib / lib / под каталог, затем
ipfc / inf perl.ipf
(Ожидайте много ошибок на обоих этапах.) Теперь переместите его на свою КНИЖНУЮ ПОЛКУ.
одноцветный текст
Если у вас есть документация по Perl в исходной форме, установлены утилиты Perl и GNU groff
установлен, вы можете использовать
Perldoc Perlfunc
Perldoc меньше
perldoc ExtUtils :: MakeMaker
для доступа к документации Perl в текстовой форме (обратите внимание, что вы можете получить лучшие результаты
используя perl manpages).
Или попробуйте запустить pod2text на .pod файлы.
страницы Справочника
Если вы только что человек установлен в вашей системе, и вы установили perl manpages, используйте что-нибудь
как это:
человек perlfunc
человек на 3 меньше
человек ExtUtils.MakeMaker
для доступа к документации по различным компонентам Perl. Начать с
человек перл
Обратите внимание на точку (.) используется как разделитель пакетов для документации для пакетов, и как
обычно, иногда нужно дать раздел - 3 выше - чтобы не затенять
Меньше(1) справочная страница.
Убедитесь, что каталог выше каталог с man-страницами находится на нашем "MANPATH", например
этой
установить MANPATH = c: / man; f: / perllib / man
для справочных страниц Perl в "f: / perllib / man / man1 /" и т. д.
HTML
Если у вас есть доступный WWW-браузер, установите документацию Perl в исходный код.
form и Perl, вы можете создавать HTML-документы. Cd в каталог с .pod файлы и делаем
так
компакт-диск f: / perllib / lib / pod
pod2html
После этого вы можете направить в браузере файл perl.html в этом каталоге и продолжайте
с чтением документов, например:
исследовать файл: /// f: /perllib/lib/pod/perl.html
В качестве альтернативы вы можете получить эти документы предварительно созданными из CPAN.
GNU "Информация" файлов
Пользователи Emacs это очень оценят, особенно с загруженным режимом "CPerl". Ты
необходимо получить последний "pod2texi" из "CPAN" или, альтернативно, предварительно созданные информационные страницы.
PDF файлов
для "Acrobat" доступны на CPAN (может быть для немного более старой версии perl).
"Латекс" Документы
можно построить с помощью "pod2latex".
BUILD
Здесь мы обсудим, как собрать Perl под OS / 2.
The короткие История
Предположим, вы опытный носильщик, поэтому убедитесь, что все необходимые инструменты есть.
уже присутствует в вашей системе, и вы знаете, как получить исходный код Perl.
Разверните его, перейдите в каталог извлечения и
gnupatch -p0 <os2 \ diff.configure
sh Настроить -des -D prefix = f: / perllib
сделать
сделать тест
сделать установку
сделать aout_test
сделать aout_install
Это помещает исполняемые файлы в f: / perllib / bin. Вручную переместите их в «ПУТЬ», вручную
переместить построенный perl * .dll в "LIBPATH" (здесь для Perl DLL * это не очень значащее шестнадцатеричное
контрольная сумма) и запустите
сделать installcmd INSTALLCMDDIR = d: / ir / on / path
Если предположить, что "man" -файлы были помещены в соответствующее место, это завершает
установка минимальной системы Perl. (Бинарный дистрибутив также содержит много
дополнительные модули и документацию в формате INF.)
Далее следует подробное руководство по этим шагам.
Предпосылки
У вас должна быть последняя среда разработки EMX, полный набор инструментов GNU (gawk
переименован в awk, а GNU FIND.EXE раньше на пути, чем OS / 2 FIND.EXE, то же самое с
sort.exe, чтобы проверить использование
найти --версия
сортировать --версия
). Вам нужна последняя версия пдкш установлен как sh.exe.
Проверьте, что у вас есть BSD установлены библиотеки и заголовки, и - опционально - Berkeley DB
заголовки и библиотеки, и crypt.
Возможные места для получения файлов:
ftp://ftp.uni-heidelberg.de/pub/os2/unix/
http://hobbes.nmsu.edu/h-browse.php? dir = / pub / os2
http://cd.textfiles.com/hobbesos29804/disk1/DEV32/
http://cd.textfiles.com/hobbesos29804/disk1/EMX09C/
Сообщается, что следующие архивы содержат достаточно утилит для сборки Perl:
gnufutil.zip, gnusutil.zip, gnututil.zip, gnused.zip, gnupatch.zip, gnuawk.zip,
gnumake.zip, gngrep.zip, bsddev.zip и ksh527rt.zip (или более поздняя версия). Обратите внимание, что все
эти утилиты, как известно, доступны от LEO:
ftp://crydee.sai.msu.ru/pub/comp/os/os2/leo/gnu/
Отметим также, что db.lib и дБ.а из раздачи EMX не подходят для мульти-
многопоточная компиляция (даже однопоточная версия Perl использует многопоточный C RTL, для
совместимость с XFree86-OS / 2). Получите исправленный от
http://www.ilyaz.org/software/os2/db_mt.zip
Если вы только что точно, то же версия of Perl уже установлен, убедитесь, что нет копий
или Perl в данный момент запущены. Более поздние этапы сборки могут завершиться ошибкой, так как более старая версия
of perl.dll загружены в память могут быть найдены. Запуск "make test" становится бессмысленным,
поскольку тест проверяет предыдущую сборку perl (эта ситуация обнаруживается и
сообщает lib / os2_base.t контрольная работа). Не забудьте отключить "PERL_EMXLOAD_SEC" в
окружающей среды.
Также убедитесь, что у вас есть / Tmp каталог на текущем диске и . каталог в вашем
"LIBPATH". Последнее условие можно попытаться исправить путем
установите BEGINLIBPATH. \.
если вы используете что-то вроде CMD.EXE или последние версии 4os2.exe. (Установка BEGINLIBPATH
чтобы просто "." игнорируется ядром OS / 2.)
Убедитесь, что ваш gcc подходит для связывания "-Zomf": запустите скрипт "omflibs" в / emx / lib
каталог.
Убедитесь, что у вас установлен link386. Он входит в стандартную комплектацию OS / 2, но может и не быть
установлен в связи с кастомизацией. Если печатать
link386
показывает, что у вас его нет, делайте Выборочный запуск устанавливатьи выберите "Связать объектные модули" в
По желанию система коммунальные услуги / Подробнее. Если вы попали в окно запроса link386, нажмите «Ctrl-C» для выхода.
Получающий Perl источник
Вам необходимо получить последний исходный код Perl (включая версии разработчиков). С некоторыми
вероятность, что он находится в
http://www.cpan.org/src/
http://www.cpan.org/src/unsupported
В противном случае вам может потребоваться покопаться в индексах, чтобы найти его в каталоге текущего
сопровождающий.
Быстрый цикл выпуска релиза разработчиками может время от времени нарушать сборку OS / 2, изучая
http://www.cpan.org/ports/os2/
может указывать на последний выпуск, который был публично выпущен сопровождающим. Обратите внимание, что
выпуск может включать некоторые дополнительные патчи для применения к текущему источнику perl.
Извлеките это так
смола vzxf perl5.00409.tar.gz
Вы можете увидеть сообщение об ошибках при извлечении Настроить. Это потому, что есть
конфликт с файлом с таким же именем конфигурировать.
Перейдите в каталог извлечения.
Заполнитель of патчи
Вам нужно применить патчи в ./os2/разн.* как это:
gnupatch -p0 <os2 \ diff.configure
Вам также может потребоваться применить патчи, поставляемые с двоичным дистрибутивом perl. Это
также имеет смысл поискать в списке рассылки perl5-porters последние новости, связанные с OS / 2.
патчи (см.http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/>). Такие патчи
обычно содержат строки "/ os2 /" и "patch", поэтому есть смысл искать эти строки.
Ручное редактирование
Вы можете заглянуть в файл ./подсказки/os2.sh и исправьте все, что там не так. я делаю
не ожидал, что он нужен нигде.
Создание
sh Настроить -des -D prefix = f: / perllib
«префикс» означает: куда установить получившуюся библиотеку perl. Указав правильный префикс, вы можете
избегайте необходимости указывать «PERLLIB_PREFIX», см. «PERLLIB_PREFIX».
Игнор сообщение о отсутствующий "пер", и о "-c" вариант в tr. Последний наиболее
вероятно, уже исправлено, если вы его видите и можете отследить, где последнее ложное предупреждение
откуда, пожалуйста, сообщите мне.
Теперь
сделать
В какой-то момент собранный может умереть, сообщив о версия несоответствие or не в состоянии в пробег Perl.
Это означает, что у вас нет . в вашем LIBPATH, поэтому perl.exe не могу найти нужный
perl67B2.dll (рассматривать эти шестнадцатеричные цифры как линейный шум). После того, как это будет исправлено, сборка должна
закончить без особой суеты.
Тестирование
Теперь запустите
сделать тест
Все тесты должны пройти успешно (некоторые из них пропущены). Если у вас такая же версия
Perl установлен, очень важно, чтобы у вас был "." в начале вашего LIBPATH (или в
BEGINLIBPATH), иначе ваши тесты, скорее всего, будут проверять неправильную версию Perl.
Некоторые тесты могут генерировать дополнительные сообщения, похожие на
Много "плохих бесплатных"
в тестах баз данных, связанных с Berkeley DB. Эти должен be фиксированной уже. Если это
сохраняется, вы можете отключить это предупреждение, см. «PERL_BADFREE».
Процесс завершен SIGTERM / SIGINT
Это стандартное сообщение, отправляемое приложениями OS / 2. * приложения nix умирают в
тишина. Это считается особенностью. Это можно легко отключить соответствующим
сигхендлеры.
Однако тестовый движок выводит это сообщение на экран в неожиданные моменты. Два
сообщения такого рода должен присутствовать во время тестирования.
Чтобы получить более точные отчеты об испытаниях, позвоните
перл т / жгут
Отчет с io / pipe.t сбой может выглядеть так:
Failed Test Status Wstat Total Fail Fail Failed Список неудачных
-------------------------------------------------- ----------
io / pipe.t 12 1 8.33% 9
Пропущено 7 тестов, плюс 56 субтестов.
Неудачные тестовые сценарии 1/195, 99.49% в порядке. 1/6542 субтестов не прошли, 99.98% в порядке.
Причины наиболее важных пропущенных тестов:
op / fs.t
18 Проверяет atime и mtime для stat () - к сожалению, HPFS предоставляет только
Гранулярность по времени 2 секунды (для совместимости с FAT?).
25 Проверяет "truncate ()" на только что открытый дескриптор файла на запись - я не знаю, почему
это должно или не должно работать.
op / stat.t
Проверяет "stat ()". Тесты:
4 Проверяет atime и mtime для stat () - к сожалению, HPFS предоставляет только
Гранулярность по времени 2 секунды (для совместимости с FAT?).
Установка построенный Perl
Если вы еще не переместили «perl * .dll» в LIBPATH, сделайте это сейчас.
Run
сделать установку
Он поместит сгенерированные файлы в нужные места. Вручную поставить perl.exe, Perl__.exe
и Perl___.exe в место на вашем пути, perl.dll в место на вашем LIBPATH.
Run
сделать installcmd INSTALLCMDDIR = d: / ir / on / path
преобразовать утилиты Perl в .cmd файлы и поместите их в PATH. Вам нужно поставить
. EXE-утилиты по пути вручную. Они устанавливаются в "$ prefix / bin", здесь $ prefix - это то, что
ты дал Настроитьсм. «Изготовление».
Если вы используете "man", либо переместите установленный */человек/ каталоги в ваш "MANPATH", или
измените "MANPATH" в соответствии с местоположением. (Этого можно было бы избежать, если бы
правильный вариант "manpath" для . / Настроить, или редактирование ./config.sh между настройкой и
делая шаги.)
стиль "a.out" строить
Действуйте, как указано выше, но сделайте perl_.exe (см. "perl_.exe")
сделать perl_
протестировать и установить
сделать aout_test
сделать aout_install
Вручную поставить perl_.exe в место на вашем пути.
Примечания. Процесс сборки для "perl_" приносит знают обо всех зависимостях, так что вы
должен убедиться, что все обновлено, например, выполнив
сделать perl_dll
первый.
Здание a двоичный распределение
[В этом разделе представлен только краткий обзор ...]
Сборка должна происходить по-разному в зависимости от того, установлена ли версия perl, которую вы устанавливаете.
уже присутствует и используется в вашей системе или является новой версией, которая еще не использовалась. В
описание ниже предполагает, что это новая версия, поэтому установка ее DLL и .вечера файлов
не нарушит работу вашей системы, даже если некоторые промежуточные шаги еще не выполнены
полностью рабочий.
В других случаях требуется немного более запутанная процедура. Ниже я предполагаю, что
текущая версия Perl - 5.8.2, поэтому исполняемые файлы имеют соответствующие имена.
1. Полностью соберите и протестируйте дистрибутив Perl. Убедитесь, что ни один из тестов не завершился ошибкой.
цели "test" и "aout_test"; исправить ошибки в Perl и обнаруженный набор тестов Perl
этими тестами. Убедитесь, что "all_test" делает целевой запуск максимально чистым.
Убедитесь, что os2 / perlrexx.cmd работает нормально.
2. Полностью установите Perl, включая цель «installcmd». Скопируйте сгенерированные библиотеки DLL в
«LIBPATH»; скопируйте пронумерованные исполняемые файлы Perl (как в perl5.8.2.exe) в "ПУТЬ"; копировать
«perl_.exe» в «ПУТЬ» как «perl_5.8.2.exe». Подумайте, нужно ли вам назад-
совместимость с библиотеками DLL. В большинстве случаев устанавливать их пока не нужно; но когда-нибудь
это может упростить следующие шаги.
3. Убедитесь, что "CPAN.pm" может загружать файлы с CPAN. В противном случае вам может потребоваться
вручную установить "Net :: FTP".
4. Установите связку «Bundle :: OS2_default»
perl5.8.2 -MCPAN -e "установить Bundle :: OS2_default" <nul | & tee 00cpan_i_1
Это может занять пару часов на процессоре с тактовой частотой 1 ГГц (при первом запуске). И это
не обязательно должна быть гладкой процедурой. Некоторые модули могут не указывать требуемые
зависимости, поэтому может потребоваться повторить эту процедуру несколько раз, пока результаты
стабилизировать.
perl5.8.2 -MCPAN -e "установить Bundle :: OS2_default" <nul | & tee 00cpan_i_2
perl5.8.2 -MCPAN -e "установить Bundle :: OS2_default" <nul | & tee 00cpan_i_3
Даже после того, как они стабилизируются, некоторые тесты могут не пройти.
Исправьте как можно больше обнаруженных ошибок. Задокументируйте все ошибки, которые не исправлены,
и все сбои по неизвестным причинам. Осмотрите полученные бревна 00cpan_i_1 в
находить подозрительно пропущенные тесты и другие подозрительные события.
Имейте в виду, что установка некоторых модулей также могут выйти из строя: например, библиотеки DLL для
обновление может быть уже загружено CPAN.pm. Просмотрите журналы "установки" (в примере
выше 00cpan_i_1 и т. д.) на наличие ошибок и установите все вручную, как в
cd $ CPANHOME / .cpan / build / Digest-MD5-2.31
сделать установку
Некоторые дистрибутивы могут не пройти некоторые тесты, но вы все равно можете их установить (как
выше, или с помощью команды "принудительная установка" режима оболочки "CPAN.pm").
Поскольку эта процедура может занять довольно много времени, имеет смысл
"заморозить" вашу конфигурацию CPAN, отключив периодические обновления локальной копии
Индекс CPAN: установите для index_expire какое-нибудь большое значение (я использую 365), затем сохраните настройки.
CPAN> o conf index_expire 365
CPAN> o conf совершить
По завершении вернитесь к значению по умолчанию 1.
5. Если результаты вас устраивают, повторно запустите цель «installcmd». Теперь вы можете скопировать
«perl5.8.2.exe» в «perl.exe» и установить другие исполняемые файлы сборки OMF:
"perl __. exe" и т. д. Они готовы к использованию.
6. Перейдите в каталог "./pod" дерева сборки, загрузите логотип Perl.
ВерблюдСерыйБольшой.BMP, и запустить
(perl2ipf> perl.ipf) | & тройник 00ipf
ipfc / INF perl.ipf | & tee 00inf
Это создает онлайн-книгу Perl docs "perl.INF". Установить по пути "КНИЖНАЯ ПОЛКА".
7. Пришло время создать статически связанный исполняемый файл. perl_.exe который включает недавно-
устанавливается через модули "Bundle :: OS2_default". Проведение тестирования через "CPAN.pm" собирается
быть мучительно медленным, поскольку он статически связывает новый исполняемый файл с расширением XS.
Вот возможный обходной путь: создать верхний уровень Makefile.PL in $ CPANHOME / .cpan / build /
с содержимым (сравните с "Создание исполняемых файлов с пользовательским набором
статически загружаемые расширения ")
используйте ExtUtils :: MakeMaker;
WriteMakefile NAME => 'пустышка';
выполнить это как
perl_5.8.2.exe Makefile.PL
make -k all test
Опять же, эта процедура не должна быть абсолютно гладкой. Некоторые "Makefile.PL" в
подкаталоги могут содержать ошибки и не запускаться как «дочерние» сценарии. В
взаимозависимость модулей может вас поразить; однако, поскольку модули, не относящиеся к XS, уже
Установленные, предварительные требования большинства модулей имеют очень хорошие шансы присутствовать.
Если вы обнаружите какие-то сбои, переместите каталоги проблемных модулей в другой
место расположения; если эти модули не являются модулями XS, вы можете просто игнорировать их - они
уже установлено; остальные, XS, модули необходимо установить вручную по одному.
После каждого такого удаления вам нужно повторно запускать процесс "Makefile.PL" / "make"; как правило
эта процедура скоро сходится. (Но обязательно конвертируйте все необходимые внешние C
библиотеки из .lib отформатировать в .a формат: запустить один из
emxaout foo.lib
emximp -o foo.a foo.lib
в зависимости от того, что подходит.) Кроме того, убедитесь, что библиотеки DLL для внешних библиотек
можно использовать с исполняемыми файлами, скомпилированными без параметров "-Zmtd".
Если вы уверены, что только несколько подкаталогов приводят к сбоям, вы можете добавить
Параметр "-j4" для "make" для ускорения пропуска подкаталогов с уже готовыми
строить.
Когда вы будете удовлетворены результатами тестов, установите сборки C-библиотек для
расширения:
сделать установку | & tee 00aout_i
Теперь вы можете переименовать файл ./perl.exe генерируется на последнем этапе, чтобы
perl_5.8.2.exe; поместите его в «ПУТЬ»; если есть взаимозависимость между некоторыми XS
модулей, вам может потребоваться повторить цикл "тест" / "установка" с этим новым исполняемым файлом и
некоторые исключенные модули - до схождения процедуры.
Теперь у вас есть все необходимое .a библиотеки для этих модулей Perl в местах, где
Конструктор Perl может его найти. Используйте конструктор perl: перейдите в пустой каталог, создайте
"манекен" Makefile.PL снова и беги
perl_5.8.2.exe Makefile.PL | & tee 00c
сделать perl | & tee 00p
Это должно создать исполняемый файл ./perl.exe со всеми статически загруженными расширениями
встроенный. Сравните сгенерированные perlmain.c файлы, чтобы убедиться, что во время
итераций количество загружаемых расширений только увеличивается. Переименовать ./perl.exe в
perl_5.8.2.exe на «ПУТЬ».
Когда он сходится, вы получаете функциональный вариант perl_5.8.2.exe; скопируйте это в
"perl_.exe". Вы закончили создание локальной установки Perl.
8. Убедитесь, что установленные модули действительно установлены на место нового
Perl и не наследуются от записей @INC, предоставленных для наследования от более старых
версии Perl: установите «PERLLIB_582_PREFIX», чтобы перенаправить новую версию Perl на
новое место и скопируйте установленные файлы в это новое место. Повторите тесты, чтобы
убедитесь, что версии модулей, унаследованные от более старых версий Perl, не
необходимо.
Фактически, вывод журнала pod2ipf(1) на шаге 6 дает очень подробную информацию
о том, какие модули загружаются с какого места; так что вы можете использовать его как дополнительный
инструмент проверки.
Убедитесь, что некоторые временные файлы не попали в дерево установки perl. Бегать
что-то вроде этого
pfind. -f "! (/ \. (pm | pl | ix | al | h | a | lib | txt | pod | imp | bs | dll | ld | bs | inc | xbm | yml | cgi | uu | e2x | skip | packlist | например | cfg | html | pub | enc | all | ini | po | pot) $ / i или / ^ \ w + $ / ") | меньше
в дереве установки (как верхний, так и сителиб один).
Сжать все библиотеки DLL с помощью lxlite, Крошечный .exe можно сжать с помощью "/ c: max" (
ошибка появляется только тогда, когда есть исправление в последних 6 байтах страницы (?); так как
крошечные исполняемые файлы намного меньше страницы, ошибка не затронет). Не сжимать
"perl_.exe" - под DOS работать не будет.
9. Теперь вы можете сгенерировать двоичный дистрибутив. Это делается путем запуска теста
Дистрибутив CPAN "OS2 :: SoftInstaller". Настроить файл test.pl в соответствии с макетом
текущей версии Perl. Не забудьте упаковать необходимые внешние DLL
соответственно. Включите описание ошибок и сбоев набора тестов, которые вы могли бы
не исправить. Включите небольшие версии исполняемых файлов Perl из сборки Perl
каталог.
Включают perl5.def чтобы люди могли повторно связать Perl DLL, сохраняя двоичный файл
совместимость или может создавать библиотеки DLL совместимости. Включите файлы различий ("diff -pu
old new ") исправлений, которые вы сделали, чтобы люди могли пересобрать вашу версию. Включите perl5.карта
так что можно использовать удаленную отладку.
10. Расскажите другим людям о том, что вы сделали. Расслабляться. Наслаждайтесь плодами своего труда.
11. Будьте готовы к благодарностям, сообщениям об ошибках, сообщениям ненависти и спаму, полученным в результате
предыдущий шаг. Ни одно доброе дело не должно оставаться безнаказанным!
Здание изготовленный на заказ . EXE файлов
Исполняемые файлы Perl можно легко перестроить в любой момент. Более того, можно использовать
вложения интерфейс (см. perlembed) для создания очень настраиваемых исполняемых файлов.
Создание исполняемые a изготовленный на заказ лыжных шлемов of статически загружено расширения
Это немного проще сделать, пока убывающий список статически загружаемых
расширения. Мы обсуждаем этот случай только здесь.
1. Перейдите в пустой каталог и создайте заполнитель. :
используйте ExtUtils :: MakeMaker;
WriteMakefile NAME => 'пустышка';
2. Запустите его с ароматом Perl (perl.exe or perl_.exe) вы хотите восстановить.
perl_ Makefile.PL
3. Попросите его создать новый исполняемый файл Perl:
сделать Perl
(вам может потребоваться вручную добавить "PERLTYPE = -DPERL_CORE" в эту командную строку на некоторых
версии Perl; симптом в том, что подстановка командной строки не работает из
Оболочки OS / 2 с недавно скомпилированным исполняемым файлом; проверить с
. \ perl.exe -wle "печать для @ARGV" *
).
4. Предыдущий шаг создан perlmain.c который содержит список newXS () звонки рядом с
конец. Удаление ненужных вызовов и повторный запуск
сделать Perl
создаст настраиваемый исполняемый файл.
Создание исполняемые a изготовленный на заказ поисковые пути
Исполняемый файл Perl по умолчанию достаточно гибкий, чтобы поддерживать большинство вариантов использования. Однако можно
хотите чего-то еще более гибкого; например, можно найти Perl DLL относительно
расположение EXE-файла; или кто-то может захотеть игнорировать среду при установке
Патч поиска Perl-библиотеки и т. Д.
Если вам удобно вложения интерфейс (см. perlembed), такие вещи легко
повторяйте шаги, описанные в разделе «Создание исполняемых файлов с настраиваемой коллекцией
статически загруженные расширения "и внесение более подробных изменений в Основной () of perlmain.c.
Люди, не желающие разбираться в Perl, могут просто переименовать Основной (), и сделать необходимо
модификация в кастоме Основной () который вызывает переименованную функцию в нужное время.
Однако есть и третий способ: Perl DLL экспортирует Основной () функция и несколько обратных вызовов
для настройки пути поиска. Ниже приведен полный пример «загрузчика Perl», который
1. Ищет Perl DLL в каталоге "$ exedir /../ dll";
2. Добавляет указанный выше каталог к "BEGINLIBPATH";
3. Ошибка, если Perl DLL, найденная через "BEGINLIBPATH", отличается от того, что было загружено на
шаг 1; например, другой процесс мог загрузить его из "LIBPATH" или из другого
значение "BEGINLIBPATH". В этих случаях необходимо изменить настройки системы.
так что этот другой процесс либо не запускается, либо загружает DLL из "BEGINLIBPATH"
с "LIBPATHSTRICT = T" (доступно с ядрами после сентября 2000 г.).
4. Загружает библиотеку Perl из "$ exedir /../ dll / lib /".
5. Использует оболочку Борна из "$ exedir /../ dll / sh / ksh.exe".
Для достижения наилучших результатов скомпилируйте файл C ниже с теми же параметрами, что и Perl DLL. Тем не мение,
многие функции будут работать, даже если исполняемый файл не является приложением EMX, например,
если скомпилирован с
gcc -Wall -DDOSISH -DOS2 = 1 -O2 -s -Zomf -Zsys perl-starter.c \
-DPERL_DLL_BASENAME = \ "perl312F \" -Zstack 8192 -Zlinker / PM: VIO
Вот пример файла C:
#define INCL_DOS
#define INCL_NOPM
/ * Они необходимы для компиляции, если os2.h включает os2tk.h, а не os2emx.h * /
#define INCL_DOSPROCESS
#включают
#include "EXTERN.h"
# определить PERL_IN_MINIPERLMAIN_C
#include "perl.h"
static char * me;
Ручка HMODULE;
статическая пустота
die_with (символ * сообщение1, символ * сообщение2, символ * сообщение3, символ * сообщение4)
{
УЛОНГ с;
char * s = "ошибка:";
DosWrite (2, я, StrLen(я) и т. д.
DosWrite (2, s, strlen (s), & c);
DosWrite (2, сообщение1, StrLen(msg1) и c);
DosWrite (2, сообщение2, StrLen(msg2) и c);
DosWrite (2, сообщение3, StrLen(msg3) и c);
DosWrite (2, сообщение4, StrLen(msg4) и c);
DosWrite (2, «\ r \ n», 2, & c);
выход(255);
}
typedef ULONG (* fill_extLibpath_t) (тип int, char * pre, char * post, int replace, char * msg);
typedef int (* main_t) (тип int, char * argv [], char * env []);
typedef int (* handler_t) (void * data, int который);
#ifndef PERL_DLL_BASENAME
# определить PERL_DLL_BASENAME "perl"
#endif
статический HMODULE
load_perl_dll (символ * базовое имя)
{
char buf [300], ошибка [260];
STRLEN l, дирл;
fill_extLibpath_t ж;
ULONG rc_fullname;
HМОДУЛЬ ручка, ручка1;
если (_execname (buf, sizeof (buf) - 13)! = 0)
die_with ("Не могу найти полный путь:", strerror (errno), "", "");
/ * XXXX Заполните 'меня' новым значением * /
l = strlen (buf);
while (l && buf [l-1]! = '/' && buf [l-1]! = '\\')
л-;
дирл = л - 1;
strcpy (buf + l, базовое имя);
l + = strlen (базовое имя);
strcpy (buf + l, ".dll");
if ((rc_fullname = DosLoadModule (сбой, размер сбоя, buf, & дескриптор))! = 0
&& DosLoadModule (сбой, размер сбоя, базовое имя и дескриптор)! = 0)
die_with ("Не могу загрузить DLL", buf, "", "");
если (rc_fullname)
ручка возврата; / * был загружен с коротким именем; Все хорошо */
если (DosQueryProcAddr (дескриптор, 0, «fill_extLibpath», (PFN *) & f))
die_with (buf, ": DLL не экспортирует символ", "fill_extLibpath", "");
buf [dirl] = 0;
if (f (0 / * BEGINLIBPATH * /, buf / * добавить * /, NULL / * добавить * /,
0 / * сохранить старое значение * /, я))
die_with (меня, ": добавление BEGINLIBPATH", "", "");
if (DosLoadModule (сбой, размер сбоя, базовое имя и дескриптор1)! = 0)
die_with (me, ": снова найти Perl DLL через BEGINLIBPATH", "", "");
buf [dirl] = '\\';
if (handle1! = handle) {
если (DosQueryModuleName (handle1, sizeof (сбой), сбой))
strcpy (сбой, «???»);
die_with (buf, ": \ n \ tperl DLL через BEGINLIBPATH отличается: \ n \ t",
провал,
"\ n \ tВам может потребоваться манипулировать глобальными BEGINLIBPATH и LIBPATHSTRICT"
"\ n \ t, чтобы другая копия была загружена через BEGINLIBPATH.");
}
ручка возврата;
}
Int
основной (int argc, char ** argv, char ** env)
{
main_t ж;
обработчик_т ч;
me = argv [0];
/ ** /
handle = load_perl_dll (PERL_DLL_BASENAME);
if (DosQueryProcAddr (handle, 0, «Perl_OS2_handler_install», (PFN *) & h))
die_with (PERL_DLL_BASENAME, ": DLL не экспортирует символ", "Perl_OS2_handler_install", "");
if (! h ((void *) "~ installprefix", Perlos2_handler_perllib_from)
|| ! h ((void *) «~ dll», Perlos2_handler_perllib_to)
|| ! h ((void *) "~ dll / sh / ksh.exe", Perlos2_handler_perl_sh))
die_with (PERL_DLL_BASENAME, ": невозможно установить манглеры @INC", "", "");
если (DosQueryProcAddr (дескриптор, 0, "dll_perlmain", (PFN *) & f))
die_with (PERL_DLL_BASENAME, ": DLL не экспортирует символ", "dll_perlmain", "");
вернуть f (argc, argv, env);
}
Построить FAQ
Некоторые "/" стали "\" in пдкш.
У вас очень старый файл pdksh. См. «Предварительные условия».
'errno' - неразрешенный и, что лучший способ
У вас нет МТ-сейфа db.lib. См. «Предварительные условия».
Проблемы tr or СЕПГ
сообщается с очень старой версией tr и sed.
Некоторые проблема (забывать , которые ;-)
У вас более старая версия perl.dll на вашем LIBPATH, который нарушил сборку
.
Библиотека ... найденный
Вы не запускали "омфлиб". См. «Предварительные условия».
Сегфолт in сделать
Вы используете старую версию GNU make. См. «Предварительные условия».
op / sprintf тест недостаточность
Это может быть результатом ошибки в emx sprintf, которая была исправлена в 0.9d fix 03.
Конкретный (не) особенности of OS / 2 порт
"Установить приоритет", "getpriority"
Обратите внимание, что эти функции совместимы с * nix, а не со старыми портами '94-95.
Приоритеты абсолютные, от 32 до -95, чем ниже, тем быстрее. 0 по умолчанию
приоритет.
ПРЕДУПРЕЖДЕНИЕ. Вызов "getpriority" для несуществующего процесса может заблокировать систему до того, как
Warp3 fixpak22. Начиная с Warp3, Perl будет использовать обходной путь: он прерывается. getpriority ()
если процесса нет. Это невозможно в более старых версиях «2. *» и
в любом случае состояние гонки.
"система()"
Форма с несколькими аргументами "system ()" допускает дополнительный числовой аргумент. Значение
этот аргумент описан в OS2 :: Process.
При нахождении программы для запуска Perl сначала просит ОС искать исполняемые файлы в «PATH».
(OS / 2 добавляет расширение .exe если расширение отсутствует). Если не найден, ищет
скрипт с возможными расширениями, добавленными в следующем порядке: без расширения, .cmd, .btm, .bat, .pl.
Если обнаружено, Perl проверяет начало файла на наличие магических строк "#!" и «extproc». Если
найдено, Perl использует оставшуюся часть первой строки как начало командной строки для запуска
этот скрипт. Единственное искажение первой строки - это извлечение аргументов.
(в настоящее время до 3), и игнорирование части пути имени "интерпретатора", если он не может
можно найти, используя полный путь.
Например, "system 'foo', 'bar', 'baz'" может привести Perl к поиску C: /emx/bin/foo.cmd с
первая линия
EXTPROC / bin / bash -х -с
If /bin/bash.exe не найден, тогда Perl ищет исполняемый файл bash.exe на «ПУТЬ». Если
найти в C: /emx.add/bin/bash.exe, то указанное выше система() переводится на
системный qw (C: /emx.add/bin/bash.exe -x -c C: /emx/bin/foo.cmd bar baz)
Выполняется один дополнительный перевод: вместо / Бен / ш Perl использует аппаратный или
настраиваемая оболочка (см. «PERL_SH_DIR»).
Вышеупомянутый поиск "интерпретатора" является рекурсивным: если колотить исполняемый файл не найден, но
bash.btm найден, Perl исследует свою первую строку и т. д. Единственное фиксированное ограничение на
глубина рекурсии неявная: есть ограничение на количество дополнительных аргументов 4
вставлен перед фактическими аргументами, переданными в система(). В частности, если не будет дополнительных
аргументы указываются в "волшебных" первых строках, тогда ограничение по глубине равно 4.
Если Perl обнаруживает, что найденный исполняемый файл относится к типу PM, а текущий сеанс - нет, он
запустит новый процесс в отдельном сеансе необходимого типа. Звоните через
"OS2 :: Process", чтобы отключить эту магию.
ПРЕДУПРЕЖДЕНИЕ. Из-за описанной логики вам необходимо явно указать .com продление, если
нужный. Более того, если исполняемый файл перл5.6.1 запрашивается, Perl не будет искать
perl5.6.1.exe. [Это может измениться в будущем.]
"extproc" on первый линия
Если первые символы Perl-скрипта - «extproc», эта строка обрабатывается как «#!» - строка,
таким образом, все переключатели в этой строке обрабатываются (дважды, если скрипт был запущен через
cmd.exe). См. «ОПИСАНИЕ» в perlrun.
дополнительный модули:
OS2 :: Процесс, OS2 :: DLL, OS2 :: REXX, OS2 :: PrfDB, OS2 :: ExtAttr. Эти модули обеспечивают доступ
к дополнительному числовому аргументу для "системы" и к информации о запущенном
процессу, в библиотеки DLL, имеющие функции с сигнатурой REXX, и в среду выполнения REXX, в OS / 2
базы данных в INI- формат и расширенные атрибуты.
Два дополнительных расширения Андреаса Кайзера, «OS2 :: UPM» и «OS2 :: FTP», включены в
Справочник "ИЛЬЯЗ", отображаемый на CPAN. Доступны и другие расширения, относящиеся к OS / 2.
прекомпилированное методы:
"Файл :: Копировать :: syscopy"
используется "File :: Copy :: copy", см. File :: Copy.
"DynaLoader :: mod2fname"
используется "DynaLoader" для изменения имени DLL.
"Cwd :: current_drive ()"
Самоочевидно.
"Cwd :: sys_chdir (имя)"
оставляет диск как есть.
"Cwd :: change_drive (имя)"
меняет "текущий" диск.
"Cwd :: sys_is_absolute (имя)"
означает, что имеет букву диска и is_rooted.
"Cwd :: sys_is_rooted (имя)"
означает, что в начале "[/ \\]" (возможно, после буквы диска :).
"Cwd :: sys_is_relative (имя)"
означает изменения в текущем каталоге.
"Cwd :: sys_cwd (имя)"
Интерфейс к cwd из EMX. Используется "Cwd :: cwd".
"Cwd :: sys_abspath (имя, каталог)"
Действительно действительно одиозная функция для реализации. Возвращает абсолютное имя файла, который
иметь "name", если CWD был "dir". "Dir" по умолчанию соответствует текущему каталогу.
"Cwd :: extLibpath ([тип])"
Получить текущее значение расширенного пути поиска библиотеки. Если "тип" присутствует и положительный,
работает с "END_LIBPATH", если отрицательно, работает с "LIBPATHSTRICT", в противном случае с
"BEGIN_LIBPATH".
"Cwd :: extLibpath_set (путь [, тип])"
Установить текущее значение пути поиска расширенной библиотеки. Если "тип" присутствует и положительный,
работает с , если отрицательный, работает с "LIBPATHSTRICT", в противном случае с
"BEGIN_LIBPATH".
"OS2 :: Ошибка (do_harderror, do_exception)"
Возвращает undef, если он еще не был вызван, в противном случае устанавливается бит 1, если на предыдущем
вызов do_harderror был включен, бит 2 установлен, если при предыдущем вызове do_exception был
включен.
Эта функция включает / отключает всплывающие окна с ошибками, связанными с аппаратными ошибками (Диск не
готово и т. д.) и программные исключения.
Я не знаю, как узнать состояние всплывающих окон до первый звонок к этому
функции.
"OS2 :: Errors2Drive (диск)"
Возвращает undef, если он еще не был вызван, в противном случае возвращает false, если ошибок не было.
запрошено записать на жесткий диск, или букву диска, если это было запрошено.
Эта функция может перенаправлять всплывающие окна с ошибками, связанными с аппаратными ошибками (Диск не
готово и т. д.) и программных исключений для файла POPUPLOG.OS2 в корневом каталоге
указанный диск. Отменяет OS2 :: Ошибка () уточняется индивидуальными программами. Данный
аргумент undef отключит перенаправление.
Имеет глобальный эффект, сохраняется после выхода из приложения.
Я не знаю как узнать состояние перенаправления всплывающих окон на диск до
первый вызов этой функции.
OS2 :: SysInfo ()
Возвращает хеш с системной информацией. Ключи хэша
MAX_PATH_LENGTH, MAX_TEXT_SESSIONS, MAX_PM_SESSIONS,
MAX_VDM_SESSIONS, BOOT_DRIVE, DYN_PRI_VARIATION,
MAX_WAIT, MIN_SLICE, MAX_SLICE, PAGE_SIZE,
VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION,
MS_COUNT, TIME_LOW, TIME_HIGH, TOTPHYSMEM, TOTRESMEM,
TOTAVAILMEM, MAXPRMEM, MAXSHMEM, TIMER_INTERVAL,
MAX_COMP_LENGTH, FOREGROUND_FS_SESSION,
FOREGROUND_PROCESS
OS2 :: BootDrive ()
Возвращает письмо без двоеточия.
"OS2 :: MorphPM (служить)", "OS2 :: UnMorphPM (служить)"
Преобразует текущее приложение в приложение PM и обратно. Аргумент верный
означает, что будет обслуживаться реальный цикл сообщений. OS2 :: MorphPM () возвращает PM
дескриптор очереди сообщений как целое число.
Дополнительные сведения см. В разделе «Централизованное управление ресурсами».
"OS2 :: Serve_Messages (принудительно)"
Поддельное получение по запросу незавершенных сообщений PM. Если "force" ложно, не будет
отправлять сообщения, если известно, что существует реальный цикл сообщений. Возвращает количество
сообщения получены.
Умирает с "QUITing ...", если получено сообщение WM_QUIT.
"OS2 :: Process_Messages (force [, cnt])"
Получение сообщений PM до создания / уничтожения окна. Если "сила" ложна, будет
не отправлять сообщения, если известно, что существует реальный цикл сообщений.
Возвращает изменение количества окон. Если указано "cnt", оно увеличивается на
количество полученных сообщений.
Умирает с "QUITing ...", если получено сообщение WM_QUIT.
"OS2 :: _ control87 (новое, маска)"
так же, как _control87(3) из EMX. Принимает целые числа в качестве аргументов, возвращает предыдущее
управляющее слово сопроцессора в виде целого числа. Только биты в «новом», которые присутствуют в
"маска" изменяются в контрольном слове.
OS2 :: get_control87 ()
получает управляющее слово сопроцессора в виде целого числа.
"OS2 :: set_control87_em (новый = MCW_EM, маска = MCW_EM)"
Вариант OS2 :: _ control87 () со значениями по умолчанию, подходящими для обработки маски исключения:
если нет «маски», используется только часть маски исключения из «нового». Если нет "новый", отключает все
исключения с плавающей запятой.
См. Подробности в разделе «Неисправности».
"OS2 :: DLLname ([как [, \ & xsub]]]"
Предоставляет информацию о Perl DLL или DLL, содержащей функцию C, привязанную к
пользователя & xsub. Значение «как»: по умолчанию (2): полное имя; 0: ручка; 1: имя модуля.
(Обратите внимание, что со временем некоторые из них могут быть перемещены в другие библиотеки).
прекомпилированное переменные:
$ OS2 :: emx_rev
числовое значение такое же, как _emx_rev в EMX, строковое значение такое же, как _emx_vprt
(аналогично «0.9c»).
$ OS2 :: emx_env
то же, что и _emx_env в EMX, число похоже на 0x8001.
$ OS2 :: os_ver
число "OS_MAJOR + 0.001 * OS_MINOR".
$ OS2 :: is_aout
Значение true, если библиотека Perl была скомпилирована в формате AOUT.
$ OS2 :: can_fork
Значение true, если текущий исполняемый файл является исполняемым файлом AOUT EMX, поэтому Perl может выполнить форк. Не надо
используйте это, используйте переносимую проверку для $ Config :: Config {dfork}.
$ OS2 :: nsyserror
Эта переменная (по умолчанию 1) определяет, нужно ли принудительно запускать содержимое $ ^ E.
с идентификатором типа "SYS0003". Если установлено в 0, то строковое значение $ ^ E - это то, что
доступно из файла сообщений OS / 2. (Некоторые сообщения в этом файле имеют
Идентификатор типа "SYS0003" добавлен, а некоторые нет.)
Недостатки
· С стадо(3) присутствует в EMX, но не работает, его эмулирует perl. К
отключите эмуляции, установите переменную окружения «USE_PERL_FLOCK = 0».
· Вот список вещей, которые могут быть "сломаны" на EMX (из документации EMX):
· Функции Recvmsg(3) отправитьmsg(3), и пара розеток(3) не реализованы.
· sock_init(3) не требуется и не выполняется.
· стадо(3) еще не реализован (фиктивная функция). (У Perl есть обходной путь.)
· убивать(3): Специальная обработка PID = 0, PID = 1 и PID = -1 не применяется.
· ожидание(3):
ГЛАВНЫЙ
Не реализована.
waitpid () не реализован для отрицательных значений PID.
Обратите внимание, что «kill -9» не работает с текущей версией EMX.
· См. «Дескрипторы файлов в текстовом режиме».
· Сокеты домена Unix в OS / 2 живут в псевдофайловой системе "/ sockets / ...". Чтобы избежать
не удалось создать сокет с именем другой формы, "/ socket /" добавляется к
имя сокета (если оно уже не начинается с этого).
Это может привести к проблемам позже, если доступ к сокету будет осуществляться через "обычный" файл -
системные вызовы с использованием "начального" имени.
· Судя по всему, IBM использовала компилятор (какое-то время около 95-го?), Который изменяет FP
маска справа и слева. Это не которая плохо для программ IBM, но компилятор тот же
использовался для библиотек DLL, которые используются в приложениях общего назначения. Когда эти DLL
используются, состояние флагов с плавающей запятой в приложении непредсказуемо.
Что еще хуже, некоторые библиотеки DLL меняют флаги с плавающей запятой, когда _DLLInitTerm ()
(например, TCP32IP). Это означает, что даже если вы не призывают любая функция в DLL,
просто процесс загрузки этой DLL сбросит ваши флаги. Что еще хуже, то же самое
компилятор использовался для компиляции некоторых библиотек HOOK. Учитывая, что библиотеки HOOK выполняются в
контекст ВСЕ приложений в системе, это означает полную непредсказуемость
флагов с плавающей запятой в системах, использующих такие библиотеки DLL HOOK. Например, GAMESRVR.DLL of DIVE
origin изменяет флаги с плавающей запятой при каждой записи в TTY VIO (оконного
текстовый режим) приложений.
Некоторые другие (не полностью отлаженные) ситуации, когда меняются флаги FP, включают некоторые
видеодрайверы (?) и некоторые операции, связанные с созданием окон. Люди, которые
код OpenGL может иметь больше опыта в этом.
Perl обычно используется в ситуации, когда все исключения с плавающей запятой
игнорируется, поскольку это значение по умолчанию для EMX. Если их не игнорировать, какой-нибудь доброкачественный Perl
программы получат "SIGFPE" и умрут ужасной смертью.
Чтобы обойти это, Perl использует два хака. Они помогают против one только тип повреждения:
Флаги FP изменены при загрузке DLL.
Один из приемов - отключить исключения с плавающей запятой при запуске Perl (как и
по умолчанию с EMX). Это помогает только с DLL, связанными во время компиляции, изменяя флаги.
до Основной () имел шанс быть названным.
Другой способ - восстановить флаги FP после вызова dlopen (). Это помогает против
аналогичный ущерб, нанесенный DLL _DLLInitTerm () во время выполнения. В настоящее время нет возможности переключиться
эти отрубки предусмотрены.
Модификации
Perl изменяет некоторые стандартные вызовы библиотеки C следующим образом:
"popen" "my_popen" использует sh.exe если требуется оболочка, ср. «PERL_SH_DIR».
«tmpnam» создается с использованием переменной окружения «TMP» или «TEMP» через «tempnam».
"tmpfile"
Если текущий каталог недоступен для записи, файл создается с использованием измененного
"tmpnam", так что может быть состояние гонки.
"ctermid"
фиктивная реализация.
Особые случаи "stat" "os2_stat" / dev / tty и / dev / con.
"мкдир", "рмдир"
эти функции EMX не работают, если путь содержит завершающий "/". Perl
содержит обходной путь для этого.
"стадо" С стадо(3) присутствует в EMX, но не работает, его эмулирует perl.
Чтобы отключить эмуляцию, установите переменную среды «USE_PERL_FLOCK = 0».
идентифицирующий библиотеки DLL
Все библиотеки DLL, созданные с использованием текущих версий Perl, имеют строки идентификатора, идентифицирующие имя
расширения, его версии и версии Perl, необходимой для этой DLL. Бегать
"bldlevel DLL-name", чтобы найти эту информацию.
Централизованное управление of Ресурсы
Поскольку для вызова определенного API OS / 2 необходима правильно инициализированная подсистема "Win",
Для расширений OS / 2 может потребоваться получение HAB и HMQ. Если расширение подойдет
это само по себе, другое расширение может не инициализироваться.
Perl обеспечивает централизованное управление этими ресурсами:
«ЖИЛЬЯ»
Чтобы получить HAB, расширение должно вызвать "hab = perl_hab_GET ()" в C. После этого
вызов выполняется, "hab" может быть доступен как "Perl_hab". Нет необходимости выпускать
ВЦВ после его использования.
Если по каким-то причинам перл.ч не может быть включен, используйте
extern int Perl_hab_GET (недействительно);
.
"HMQ"
Есть два случая:
· Расширению нужен «HMQ» только потому, что в противном случае некоторые API не будут работать. Использовать
"serve = 0" ниже.
· Расширение нуждается в «HMQ», поскольку оно хочет участвовать в цикле событий PM. Использовать
"serve = 1" ниже.
Чтобы получить «HMQ», расширение должно вызвать «hmq = perl_hmq_GET (serve)» в C. После
этот вызов выполняется, "hmq" может быть доступен как "Perl_hmq".
Чтобы сообщить Perl, что HMQ больше не нужен, вызовите perl_hmq_UNSET (serve). Perl
процесс автоматически трансформируется / реформируется в / из процесса PM, если HMQ
нужно / не нужно. Perl будет автоматически включать / отключать сообщение "WM_QUIT" во время
выключение, если очередь сообщений обслуживается / не обслуживается.
ЗАМЕТКА. Если во время выключения есть очередь сообщений, которая не отключила WM_QUIT,
и который не обработал полученное сообщение WM_QUIT, завершение работы будет
автоматически отменяется. Не звони perl_hmq_GET(1) если вы не собираетесь обрабатывать
сообщения на упорядоченной основе.
Обработка ошибок, сообщаемых OS / 2 API
Есть два основных соглашения (полезно называть их «Dos *» и «Win *» -
хотя эта часть сигнатуры функции не всегда определяется именем
API) сообщения об ошибках OS / 2 API. Большинство API "Dos *" сообщают о
код ошибки в результате вызова (так что 0 означает успех, и есть много типов
ошибки). Большинство API «Win *» сообщают об успешном / неудачном завершении работы с результатом «ИСТИНА» / «ЛОЖЬ»;
чтобы выяснить причину сбоя, необходимо позвонить WinGetLastError () API.
Некоторые точки входа "Win *" также перегружают "значимое" возвращаемое значение ошибкой.
показатель; возвращаемое значение 0 указывает на ошибку. Еще какая-то другая запись "Win *"
точки перегружают вещи еще больше, а возвращаемое значение 0 может означать успешный вызов
возврат допустимого значения 0, а также состояния ошибки; в случае возврата 0
ценность, которую следует назвать WinGetLastError () API, чтобы отличить успешный звонок от
в случае неудачи.
По соглашению, все вызовы OS / 2 API должны указывать на свои сбои путем сброса
$ ^ E. Все доступные Perl функции, вызывающие OS / 2 API, можно разбить на две части.
классы: некоторые умереть ()s при обнаружении ошибки API другой сообщает об ошибке через
ложное возвращаемое значение (конечно, это не касается Perl-доступных функций, которые
ожидать сбой вызова API OS / 2, закодированы некоторые обходные пути).
Очевидно, что в случае последнего типа сигнатуры API OS / 2 это
должно быть более удобным для пользователей, если сбой обозначен умереть ()ing: один делает
не нужно проверять $ ^ E, чтобы знать, что что-то пошло не так. Если, однако, это решение
по какой-то причине нежелательно, рассматриваемый код должен сбрасывать $ ^ E в 0 перед
выполнение этого вызова API OS / 2, чтобы вызывающая функция, доступная для Perl, имела
шанс отличить значение "успех, но нулевой результат" от неудачного. (Можно вернуться
undef как альтернативный способ сообщить об ошибке.)
Макросы, упрощающие этот тип распространения ошибок:
"CheckOSError (expr)"
В случае ошибки возвращает true, устанавливает $ ^ E. Ожидает expr () быть вызовом API в стиле "Dos *".
"CheckWinError (expr)"
В случае ошибки возвращает true, устанавливает $ ^ E. Ожидает expr () быть вызовом API в стиле "Win *".
"SaveWinError (expr)"
Возвращает expr, устанавливает $ ^ E из WinGetLastError () если "expr" ложно.
"SaveCroakWinError (expr, die, name1, name2)"
Возвращает expr, устанавливает $ ^ E из WinGetLastError () если "expr" ложно, и умереть ()с, если
"die" и $ ^ E верны. Сообщение о смерти - это сцепленные строки «name1».
и «name2», разделенные «:» из содержимого $ ^ E.
"WinError_2_Perl_rc"
Устанавливает "Perl_rc" равным возвращаемому значению WinGetLastError ().
"FillWinError"
Устанавливает "Perl_rc" равным возвращаемому значению WinGetLastError (), и устанавливает $ ^ E в
соответствующее значение.
"FillOSError (rc)"
Устанавливает "Perl_rc" в "rc" и устанавливает $ ^ E в соответствующее значение.
Загрузка библиотек DLL и порядковых номеров в библиотеки DLL
Некоторые библиотеки DLL присутствуют только в некоторых версиях OS / 2 или в некоторых конфигурациях
OS / 2. Некоторые экспортированные точки входа присутствуют только в библиотеках DLL, поставляемых с некоторыми версиями.
из OS / 2. Если эти библиотеки DLL и точки входа были связаны напрямую для Perl
исполняемый файл / DLL или из расширений Perl, этот двоичный файл будет работать только с
указанные версии / настройки. Даже если бы эти точки входа не понадобились, загрузка of
исполняемый файл (или DLL) выйдет из строя.
Например, многие новые полезные API отсутствуют в OS / 2 v2; многие API, связанные с PM
требовать библиотеки DLL, недоступные при настройке загрузки с гибкого диска.
Чтобы эти звонки потерпели неудачу Важно когда призывы выполненный, следует называть эти API
через API динамического связывания. В Perl есть подсистема для упрощения такого типа
звонки. Предусмотрено большое количество точек входа для такой привязки (см.
"entry_ordinals" - а также "PMWIN_entries" - в os2ish.h). Эти порядковые номера могут быть
доступ через API:
CallORD (), DeclFuncByORD (), DeclVoidFuncByORD (),
DeclOSFuncByORD (), DeclWinFuncByORD (), AssignFuncPByORD (),
DeclWinFuncByORD_CACHE (), DeclWinFuncByORD_CACHE_survive (),
DeclWinFuncByORD_CACHE_resetError_survive (),
DeclWinFunc_CACHE (), DeclWinFunc_CACHE_resetError (),
DeclWinFunc_CACHE_survive (), DeclWinFunc_CACHE_resetError_survive ()
См. Файлы заголовков и код C в поставляемых модулях, связанных с OS / 2, для
подробности об использовании этих функций.
Некоторые из этих функций также сочетают семантику динамической загрузки с распространением ошибок.
семантика обсуждалась выше.
Perl вкус
Из-за особенностей OS / 2 нельзя класть все яйца в одну корзину (хотя
Среда EMX изо всех сил пытается преодолеть эти ограничения, поэтому ситуация может как-то
улучшать). В дистрибутиве есть 4 исполняемых файла для Perl:
perl.exe
Основная рабочая лошадка. Это исполняемый файл химеры: он скомпилирован в стиле "a.out"
исполняемый файл, но связан с динамической библиотекой в стиле "omf" perl.dll, и с динамическим ЭЛТ
DLL. Этот исполняемый файл представляет собой приложение VIO.
Он может загружать динамические расширения Perl, и он может вилка ().
Примечания. Имейте в виду, что вилка () нужен, чтобы открыть трубу самому себе.
perl_.exe
Это статически связанный исполняемый файл в стиле "a.out". Не удается загрузить динамический Perl
расширения. Исполняемый файл, поставляемый в двоичных дистрибутивах, имеет множество расширений.
prebuilt, поэтому указанное выше ограничение важно только в том случае, если вы используете специальные расширения.
Этот исполняемый файл представляет собой приложение VIO.
Эти is Важно выполнимый приносит требовать OS / 2. Друзья заперты в мире "M $"
был бы признателен за то, что этот исполняемый файл работает под DOS, Win0.3 *, Win0.95 и WinNT
с соответствующим удлинителем. См. «Другие операционные системы».
Perl__.exe
Это тот же исполняемый файл, что и Perl___.exe, но это приложение в личном кабинете.
Примечания. Обычно (если явно не перенаправлено во время запуска) STDIN, STDERR и STDOUT
приложения PM перенаправляются на нулю. Однако возможно увидели их, если вы
запустите "perl __. exe" из программы PM, которая имитирует окно консоли, например Оболочка Режим of
Emacs или EPM. Таким образом is возможное использовать отладчик Perl (см. perldebug) для отладки вашего PM
приложение (но остерегайтесь зависаний цикла сообщений - это не сработает, если у вас есть
очередь сообщений для обслуживания, если вы не подключите обслуживание к getc () функции
отладчик).
Другой способ увидеть результат работы программы PM - запустить ее как
pm_prog args 2> & 1 | Кот -
с ракушкой различный от cmd.exe, так что он не создает связи между VIO
сессия и сессия "pm_porg". (Такая ссылка закрывает окно VIO.) Например, это
Работает с sh.exe - или с Perl!
откройте P, 'pm_prog args 2> & 1 |' или умри;
печатать пока ;
Вкус Perl__.exe требуется, если вы хотите запустить свою программу без окна VIO
присутствует, но не «отсоединяется» (для получения дополнительной информации запустите «помочь отсоединить»). Очень полезно для расширений
которые используют PM, например Perl / Tk или OpenGL.
Также обратите внимание, что различия между исполняемыми файлами PM и VIO заключаются только в по умолчанию
поведение. Можно начать любое исполняемый файл в любое вид сеанса с использованием аргументов
переключатели "/ fs", "/ pm" или "/ win" команды "start" (of CMD.EXE или аналогичная оболочка).
В качестве альтернативы можно использовать числовой первый аргумент "системной" функции Perl (см.
OS2 :: Процесс).
Perl___.exe
Это исполняемый файл в стиле "omf", который динамически связан с perl.dll и CRT DLL. я
не знаю преимуществ этого исполняемого файла перед "perl.exe", но он не может вилка () вообще. Что ж,
Одним из преимуществ является то, что процесс сборки не так запутан, как с «perl.exe».
Это приложение VIO.
почему странный имена?
Поскольку Perl обрабатывает строку «#!» (См. «ОПИСАНИЕ» в perlrun, «Командные переключатели» в
perlrun, «Perl-скрипт не найден во входных данных» в perldiag), он должен знать, когда программа is a
Perl. Существует некоторое соглашение об именах, которое позволяет Perl отличать правильные строки от
неправильные. Приведенные выше имена - почти единственные имена, разрешенные этим соглашением, которые
не содержать цифр (которые имеют совершенно разную семантику).
почему динамический связывание?
Что ж, наличие нескольких исполняемых файлов, динамически связанных с одной и той же огромной библиотекой, имеет свои
преимущества, но это не обосновало бы дополнительную работу по его компиляции. В
Причина в том, что это сложно для разработчиков, но очень быстро и удобно для пользователей, "сложно"
динамическое связывание, используемое OS / 2.
Есть две отличительные особенности модели динамического связывания OS / 2: во-первых, все
ссылки на внешние функции разрешаются во время компиляции; во-вторых, нет
исправление во время выполнения библиотек DLL после их загрузки в память. Первая особенность - это
огромное преимущество перед другими моделями: он позволяет избежать конфликтов, когда несколько библиотек DLL используются одним
приложения экспортируют записи с тем же именем. В таких случаях «другие» модели динамиков
связывание просто выберите между этими двумя точками входа, используя некоторый случайный критерий - с
предсказуемые катастрофы как результат. Но это вторая функция, которая требует сборки
of perl.dll.
Таблицы адресов библиотек DLL исправляются только один раз при их загрузке. Адреса
точки входа в библиотеки DLL гарантированно будут одинаковыми для всех программ, использующих
та же DLL. Это удаляет исправления времени выполнения - после загрузки DLL ее код доступен только для чтения.
Хотя это дает некоторые (значительные?) Преимущества в производительности, это значительно усложняет жизнь.
для разработчиков, поскольку приведенная выше схема делает невозможным "привязку" библиотеки DLL к
символ в . EXE файл. Действительно, для этого потребуется DLL, чтобы иметь разные перемещения
таблицы для (разных) исполняемых файлов, которые используют эту DLL.
Однако динамически загружаемое расширение Perl вынуждено использовать некоторые символы из Perl.
исполняемый файл, например, чтобы знать, как найти аргументы функций: аргументы живут
во внутреннем стеке оценки Perl. Решение - поставить основной код
интерпретатор в DLL и сделайте . EXE файл, который просто загружает эту DLL в память и
предоставляет аргументы команды. Библиотека расширения не может ссылаться на символы в . EXE, но
нет проблем со ссылками на символы в . Dll.
Эти значительно увеличивает время загрузки приложения (а также усложняет
сборник). Поскольку интерпретатор находится в DLL, C RTL в основном вынужден находиться в
DLL (в противном случае расширения не смогли бы использовать CRT). Есть некоторые
преимущества, если вы используете разные варианты Perl, такие как запуск perl.exe и Perl__.exe
одновременно: они разделяют память о perl.dll.
ЗАМЕТКА. Есть еще один эффект, который делает библиотеки DLL более расточительными: библиотеки DLL загружаются в
область разделяемой памяти, которая является скудным ресурсом, учитывая барьер 512 МБ
«стандартная» виртуальная память OS / 2. Код . EXE файлы также используются всеми
процессы, использующие особые . EXE, но они "совместно используются в частном адресном пространстве"
процесса "; это возможно, потому что адрес, по которому разные разделы
. EXE файл загружается, решается во время компиляции, поэтому все процессы имеют эти
разделы, загруженные по одним и тем же адресам, и никаких исправлений внутренних ссылок внутри . EXE is
необходимо.
Поскольку библиотеки DLL могут быть загружены во время выполнения, чтобы иметь такой же механизм для библиотек DLL, необходимо:
иметь диапазон адресов любое of загружено Библиотеки DLL в системе будут доступны in ВСЕ
Процессы который еще не загрузил конкретную DLL. Вот почему библиотеки DLL отображаются в
разделяемая область памяти.
почему химера строить?
Текущая среда EMX не позволяет библиотекам DLL, скомпилированным с использованием формата Unixish "a.out",
символы экспорта для данных (или хотя бы некоторых типов данных). Это заставляет компилировать в стиле "omf"
of perl.dll.
Текущая среда EMX не позволяет . EXE файлы, скомпилированные в формате "omf", чтобы вилка ().
вилка () требуется ровно для трех операций Perl:
· Явный вилка () в сценарии,
· "Открыть FH," | - ""
· "Открыть FH" - | "", другими словами, открыть трубы самому себе.
Хотя эти операции не являются вопросом жизни и смерти, они необходимы для многих
полезные скрипты. Это заставляет компиляцию в стиле "a.out" perl.exe.
ОКРУЖАЮЩАЯ СРЕДА
Здесь мы перечисляем переменные среды, которые относятся либо к OS / 2-, DOS- и Win *, либо
в OS / 2 более важны, чем в других операционных системах.
"PERLLIB_PREFIX"
Специально для порта EMX. Должен иметь вид
путь1; путь2
or
путь1 путь2
Если начало некоторого предустановленного пути совпадает путь1, он заменяется на путь2.
Следует использовать, если библиотека perl перемещена из местоположения по умолчанию в предпочтительное для
"PERL(5) LIB ", так как это не оставит неправильных записей в @INC. Например, если
скомпилированная версия perl ищет @INC в е: / perllib / lib, и вы хотите установить
библиотека в ч: / opt / gnuЯ
установить PERLLIB_PREFIX = f: / perllib / lib; h: / opt / gnu
Это приведет к тому, что Perl с предварительно созданным @INC из
f: /perllib/lib/5.00553/os2
f: /perllib/lib/5.00553
е: /perllib/lib/site_perl/5.00553/os2
f: /perllib/lib/site_perl/5.00553
.
использовать следующий @INC:
ч: /opt/gnu/5.00553/os2
ч: /opt/gnu/5.00553
ч: /opt/gnu/site_perl/5.00553/os2
ч: /opt/gnu/site_perl/5.00553
.
"PERL_BADLANG"
Если 0, perl игнорирует setlocale () неудача. Может быть полезно с каким-то странным местныйs.
"PERL_BADFREE"
Если 0, perl не будет предупреждать в случае необоснованного свободно(). Со старыми перлами это могло быть
полезен в сочетании с модулем DB_File, который давал сбой при динамической компоновке и
OMF-построен.
Не следует устанавливать на более новые Perls, так как это может скрыть некоторые реальные проблемы.
"PERL_SH_DIR"
Специально для порта EMX. Предоставляет каталогу часть местоположения для sh.exe.
«USE_PERL_FLOCK»
Специально для порта EMX. С стадо(3) присутствует в EMX, но не работает, это
эмулируется Perl. Чтобы отключить эмуляцию, установите переменную среды «USE_PERL_FLOCK = 0».
«ТМЗ» or «ТЕМП»
Специально для порта EMX. Используется как место для хранения временных файлов.
Evolution
Здесь мы перечисляем основные изменения, которые могут вас удивить.
Текстовый режим файловые ручки
Начиная с версии 5.8, Perl использует встроенный слой перевода для файлов текстового режима.
Это заменяет эффективный, хорошо протестированный слой EMX некоторым кодом, который должен быть лучшим.
охарактеризован как «быстрый взлом».
Помимо возможных ошибок и невозможности отслеживать изменения в политике перевода
с выключателем / включением перевода TERMIO это вносит серьезное несовместимое изменение:
до sysread () в текстовом режиме дескрипторы файлов будут проходить через слой перевода, теперь он
не будет.
Приоритеты
"setpriority" и "getpriority" несовместимы с более ранними портами Андреаса Кайзера.
См. "Setpriority, getpriority".
DLL имя искажение: заранее 5.6.2
В выпуске 5.003_01 динамически загружаемые библиотеки должны быть перестроены, когда
скомпилирована другая версия Perl. В частности, библиотеки DLL (в том числе perl.dll) есть сейчас
создается с именами, которые содержат контрольную сумму, что позволяет обходной путь для схемы OS / 2
кеширования DLL.
Возможно, удастся создать простой обходной путь, который
· Найти старые библиотеки DLL, просматривая старый @INC;
· Переделывать имена по схеме нового perl и копировать библиотеки под эти имена;
· Отредактируйте внутренние "LX" таблицы DLL, чтобы отразить изменение имени (вероятно, не
необходим для библиотек DLL расширения Perl, так как внутренне закодированные имена не используются для
«специфические» DLL, они используются только для «глобальных» DLL).
· Отредактировать внутренние таблицы «ИМПОРТ» и изменить название «старых» perl ????. dll до
«Новый» perl ????. dll.
DLL имя искажение: 5.6.2 и За
Фактически искажение расширение DLL были сделаны из-за непонимания OS / 2
динамометрическая модель. OS / 2 (по сути) поддерживает две разные таблицы загруженной DLL:
Глобальные библиотеки DLL
загруженные по базовому имени из "LIBPATH"; в том числе связанные во время ссылки;
конкретные библиотеки DLL
загружается по полному имени.
При разрешении запроса на глобальную DLL таблица уже загруженных конкретных DLL
(эффективно) игнорируется; кроме того, конкретные библиотеки DLL всегда загружается с заданного пути.
Есть / был небольшой поворот, делающий эту схему хрупкой: что делать с загруженными DLL
от
«BEGINLIBPATH» и «ENDLIBPATH»
(которые зависят от процесса)
. от "LIBPATH"
, которые фактически зависит от процесса (хотя "LIBPATH" одинаков для всех
процессы).
Если для "LIBPATHSTRICT" не задано значение "T" (и ядро не установлено после 2000/09/01), такие библиотеки DLL являются
считается глобальным. При загрузке глобальной DLL она сначала просматривается в таблице
уже загруженные глобальные библиотеки DLL. Из-за этого тот факт, что один исполняемый файл загрузил DLL
из "BEGINLIBPATH" и "ENDLIBPATH" или . от "LIBPATH" может повлиять , которые DLL загружена
когда другой исполняемый файл запрашивает DLL с тем же именем. Эти причина для
зависящее от версии изменение имени DLL для perl DLL.
Поскольку библиотеки DLL расширения Perl всегда загружаются с полным путем, нет необходимости
искажать их имена способами, зависящими от версии: их каталог уже отражает
соответствующая версия perl, а @INC учитывает двоичную совместимость со старыми
версия. Начиная с 5.6.2, схема изменения имен исправлена, чтобы быть такой же, как для Perl.
5.005_53 (как в популярном бинарном выпуске). Таким образом, новый Perls сможет решение
имена старых расширений DLL, если @INC позволяет найти их каталоги.
Однако это еще не гарантирует, что эта DLL может быть загружена. Причина в том
искажение имени Perl DLL. И поскольку библиотеки DLL расширения связаны с Perl
DLL, расширения DLL для более старых версий будут загружать более старую Perl DLL, и в большинстве случаев
возможно segfault (поскольку данные в этой DLL не инициализированы должным образом).
Существует частичный обходной путь (который можно сделать в комплекте с новыми ядрами OS / 2): создать
DLL пересылки с тем же именем, что и DLL старой версии Perl, которая пересылает
вход указывает на более новую библиотеку Perl. Сделайте эту DLL доступной (скажем) на
"BEGINLIBPATH" нового исполняемого файла Perl. Когда новый исполняемый файл обращается к старому Perl
расширения DLL, они запросили бы старую DLL Perl по имени, вместо этого получили бы пересылку,
так эффективно будет связываться с текущей (новой) Perl DLL.
Это может сломаться двумя способами:
· Старый исполняемый файл Perl запускается, когда новый исполняемый файл загружает
расширение, скомпилированное для старого исполняемого файла (уф!). В этом случае старый исполняемый файл
получит DLL пересылки вместо старой Perl DLL, поэтому будет связываться с новым perl
DLL. Хотя это и не является смертельным исходом, он будет вести себя так же, как новый исполняемый файл. Это бьет
вся цель явного запуска старого исполняемого файла.
· Новый исполняемый файл загружает расширение, скомпилированное для старого исполняемого файла, когда старый perl
исполняемый файл запущен. В этом случае добавочный номер не примет экспедитора -
со смертельным исходом.
Благодаря поддержке "LIBPATHSTRICT" это можно обойти - если не запущена одна из библиотек DLL.
от . из "LIBPATH" (я не знаю, влияет ли "LIBPATHSTRICT" на этот случай).
Замечание. Если новые ядра не позволяют . в "BEGINLIBPATH" (в старых версиях нет) этот беспорядок не может
быть полностью очищенным. (Оказывается, по состоянию на начало 2002 г. . не разрешено,
но . \. есть - и имеет тот же эффект.)
Замечание. «LIBPATHSTRICT», «BEGINLIBPATH» и «ENDLIBPATH» не являются переменными среды,
хотя cmd.exe имитирует их в строках "SET ...". Из Perl к ним может получить доступ
Cwd :: extLibpath и Cwd :: extLibpath_set.
DLL экспедитор поколение
Предположим, что старая DLL называется perlE0AC.dll (как для 5.005_53), а новый
версия 5.6.1. Создать файл perl5shim.def-лидер
БИБЛИОТЕКА 'perlE0AC' INITINSTANCE TERMINSTANCE
ОПИСАНИЕ '@#[электронная почта защищена]: 5.006001 # @ Модуль Perl для 5.00553 -> Перенаправитель Perl 5.6.1 '
КОД НАГРУЗКИ
ЗАГРУЗКА ДАННЫХ ПРИ ВЫЗОВЕ НЕСКОЛЬКИХ НЕСКОЛЬКИХ ДАННЫХ
ЭКСПОРТ
изменение версий / названий по мере необходимости. Бегать
perl -wnle "next if 0 ../ EXPORTS /; напечатать qq (\" $ 1 \ ") if / \" (\ w +) \ "/" perl5.def> lst
в каталоге сборки Perl (чтобы уменьшить размер DLL, замените perl5.def определением
файл для более старой версии Perl, если он есть).
cat perl5shim.def-leader lst> perl5shim.def
gcc -Zomf -Zdll -o perlE0AC.dll perl5shim.def -s -llibperl
(игнорировать многократное «предупреждение L4085»).
Threading
Начиная с версии 5.003_01 perl связан с многопоточной RTL DLL на языке C. Если сам perl не
скомпилирован с поддержкой многопоточности, поэтому не будет Perl таНос (). Однако расширения могут использовать
несколько потоков на свой страх и риск.
Это было необходимо для компиляции "Perl / Tk" для XFree86-OS / 2 из коробки и связывания с библиотеками DLL.
для других полезных библиотек, которые обычно компилируются с помощью "-Zmt -Zcrtdll".
Объявления в и, что лучший способ программы
По многочисленным просьбам обращение к внешней программе на Perl было изменено на Андреаса.
Порт Кайзера. If Perl необходимо вызвать внешнюю программу с помощью оболочка, е: /bin/sh.exe
будет вызван, или что бы там ни было, см. «PERL_SH_DIR».
Это означает, что вам нужно получить копию sh.exe также (я использую один из pdksh). В
путь F:/ бен выше настраивается автоматически во время сборки на правильное значение на
строительная машина, но может быть переопределена во время выполнения,
Причины: консенсус по поводу "perl5-porters" заключался в том, что perl должен использовать одну непереопределяемую оболочку
на платформу. Очевидный выбор для OS / 2: cmd.exe и sh.exe. Имея сборку perl
сам по себе был бы невозможен с cmd.exe как оболочку, таким образом я взял "sh.exe". Этот
обеспечивает почти 100% совместимость со скриптами из * nix. В качестве дополнительного преимущества
это также работает под DOS, если вы используете порт pdksh с поддержкой DOS (см. «Предварительные требования»).
Минусы: в настоящее время sh.exe pdksh вызывает внешние программы через вилка ()/exec () и
Там есть нет функционирование exec () в OS / 2. exec () эмулируется EMX асинхронным вызовом
пока вызывающий абонент ожидает завершения дочернего объекта (чтобы сделать вид, что "pid" не изменился).
Это означает, что 1 дополнительно копия sh.exe становится активным через вилка ()/exec (), что может привести к
некоторые ресурсы, взятые из системы (даже если мы не учитываем дополнительную работу, необходимую для
вилка ()инж.).
Обратите внимание, что теперь это меньшая проблема, когда мы не создаем sh.exe если не требуется (метахары
нашел).
Всегда можно начать cmd.exe явно через
система 'cmd', '/ c', 'mycmd', 'arg1', 'arg2', ...
Если вам нужно использовать cmd.exe, и не хотите вручную редактировать тысячи ваших скриптов,
Предлагаемое на p5-p долгосрочное решение - иметь директиву
используйте OS2 :: Cmd;
который переопределит система(), exec (), "` `" и "open (, '... |')". С текущим Perl вы можете
только отменять система(), Ридпайп () - явная версия "` `" и, возможно, exec (),
код заменит вызов с одним аргументом на система() автор: "CORE :: system ('cmd.exe', '/ c',
сдвиг)".
Если у вас есть рабочий код для "OS2 :: Cmd", пришлите его мне, я включу его в
распределение. Такой модуль мне не нужен, поэтому не могу его протестировать.
Подробнее о текущей ситуации с вызовом внешних программ см. «Запуск
Программы OS / 2 (и DOS) на Perl ". Укажите несколько функций:
· Внешние скрипты могут вызываться по их базовому имени. Perl попробует те же расширения
как при обработке -S переключатель командной строки.
· Внешние скрипты, начинающиеся с "#!" или "extproc" будет выполняться напрямую, без
вызов оболочки путем вызова программы, указанной в оставшейся части первой строки.
Память распределение
Perl использует собственный таНос () под OS / 2 - интерпретаторы обычно привязаны к malloc для скорости,
но perl - нет, поскольку его malloc молниеносно. Тесты производительности с настройкой использования памяти Perl
показывают, что Perl malloc в 5 раз быстрее EMX. У меня нет убедительных данных
насчет объема памяти, но (довольно случайный) тест показал, что Perl составляет 5%
лучше.
Сочетание perl's таНос () а жесткое разрешение имен DLL создает особую проблему
с библиотечными функциями, которые ожидают, что их возвращаемое значение будет свободно()d по системе свободно().
Чтобы облегчить расширения, которым необходимо вызывать такие функции, выделение системной памяти
функции по-прежнему доступны с добавленным префиксом "emx_". (В настоящее время только DLL perl имеет
это должно распространиться на perl_.exe в ближайшее время.)
Потоки
Можно создать Perl с включенной поддержкой потоков, указав параметр -D usethreads для
Настроить. В настоящее время поддержка потоков OS / 2 находится на очень предварительной стадии.
Наиболее заметные проблемы:
"COND_WAIT"
может иметь состояние гонки (но, вероятно, не из-за того, что OS / 2 запускается по фронту)
Семафоры событий). (Требуется повторная реализация (с точки зрения цепочки ожидающих потоков,
со связанным списком, хранящимся в структуре потока?)?)
ОС2.с
имеет пару статических переменных, используемых в специфичных для OS / 2 функциях. (Необходимо переместить
в структуру потока или сериализованный?)
Обратите внимание, что эти проблемы не должны мешать экспериментировать, так как они имеют низкий
вероятность воздействия на небольшие программы.
Используйте perlos2 онлайн с помощью сервисов onworks.net