これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの 2 つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド perlosXNUMX です。
プログラム:
NAME
perlos2 - OS/2、DOS、Win0.3*、Win0.95、および WinNT での Perl。
SYNOPSIS
このドキュメントは次の形式で読むことができます。
男 perlos2
perl perlos2 を表示
エクスプローラー perlos2.html
perlos2の情報
いくつかをリストする (すべてが同時に利用できるわけではない)、または読み取られる場合もあります as is: として
README.os2または ポッド/perlos2.pod.
を読むには .INF ドキュメントのバージョン(非常に OS/2以外では、
IBM のリーダー (IBM の ftp サイト (?) (URL は誰か?) で入手できる可能性があります)、または PC DOS に同梱されています
7.0 と IBM の Visual Age C++ 3.5。
Win* ビューアのコピーは、「Just add 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のディストリビューションには含まれていない。また、
xビュー。
ご注意ください lynx.exe or ネットスケープ.exe インストールすると、WWWリンクをたどることができます
この文書では .INF フォーマット。EMXドキュメントが正しくインストールされている場合は、
ライブラリリンク(「EMXBOOK」環境を設定して「view emxbook」が動作している必要があります)
EMX ドキュメントで説明されている変数と同じです。
DESCRIPTION
ターゲット
目標はOS/2を最もよくサポートされるプラットフォームのXNUMXつにすることです。
Perlの使用/構築/開発と パール Perlを最高のものにする
OS/2で使用できる言語。第二の目標は、これをDOSで動作させることである。
勝利*も(ただし あまりに 難しい)。
現状はこの目標にかなり近いです。既知の制限事項:
· 一部の*nixプログラムは フォーク() たくさんあります。OS/2用のPerlのほとんど便利なフレーバーが含まれています。
(同時に複数ビルドされる)これはサポートされていますが、一部のフレーバーではサポートされていません
これをサポートします(例えば、PerlがREXX内から呼び出される場合)。 フォーク() After つかいまする
動的にロードする拡張機能は 非常に EMX の古いバージョン。
· 別のperl実行ファイルが必要です パール__.exeファイル (「perl__.exe」を参照)
アプリケーションにPMコード(Perl/TkやOpenGL Perlモジュールのように)を組み込むことで、
テキストモードウィンドウが存在します。
標準を使用している間 perl.exe テキストモードウィンドウからも可能です。
システムの安定性が低下するケースが見られます。 パール__.exeファイル
このような劣化を回避します。
· WPSオブジェクトにアクセスする簡単な方法はありません。私が知っている唯一の方法は「OS2::REXX」を使うことです。
および「SOM」拡張機能(OS2::REXX、SOMを参照)。ただし、
Object-REXXの便利なメソッド。(そもそも可能でしょうか?私はObject-REXXの便利なメソッドを知りません。
API。「SOM」拡張機能(現在はアルファテキスト)は、最終的にこれを削除する可能性があります。
欠点は、DIIが「SOM」モジュールでサポートされていないため、
「SOM」の使用は、期待するほど便利ではありません。
他の項目についてもお知らせいただき、このリストを最新の状態に保ってください。
その他 OS
OS/2のPerl移植版はEMX環境を採用しているため、実行(およびビルド)が可能です。
EMXを実行できる環境では、拡張機能(おそらくそれ自体もビルド可能)が使用できます。
現在のリストはDOS、DOS-inside-OS/2、Win0.3*、Win0.95、WinNTです。多くのPerl
フレーバーは 1 つだけ動作します。「perl_.exe」を参照してください。
これらの環境ではPerlのすべての機能が利用できるわけではないことに注意してください。これは
特徴は 広がります - おそらく RSX - を実装することにしました。
「前提条件」を参照してください。
前提条件
EMX EMXランタイムが必要です(RSXで代用できます)。
make perl_.exe 外部サポートなしでDOS上で実行できるようにバインドする
.exe は、/rsx.exe 詳細は「emxbind」を参照してください。DOSでは最良の結果を得るために、
RSXランタイムを使用するべきです。これはより多くの機能が動作します(「fork」、「popen」など)。
など)。実際、VCPIが存在しない場合はRSXが必要です。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.
注意。 使用時 .exe は、/rsx.exe彼らがあなたの道にいるだけで十分です。
明示的に指定する必要はありません(ただし、
emx perl_.exe -de 0
も同様に機能します。
RSX DPMIプラットフォームでPerlを実行するには、RSXランタイムが必要です。これは、
DOS-inside-OS/2、Win0.3*、Win0.95、WinNT(「その他のOS」を参照)。RSXは動作しません。
VCPI のみの場合、EMX と同様に、DMPI が必要です。
RSXと最新の sh.exe 完全に機能する * nixっぽい環境
DOSでは、例えば「fork」、「``」、パイプ「open」が使える。実際、MakeMakerは(
静的ビルド) なので、DOS 上で Perl 開発環境を構築できます。
RSXは例えば
http://cd.textfiles.com/hobbesos29804/disk1/EMX09C/
ftp://crydee.sai.msu.ru/pub/comp/os/os2/leo/gnu/emx+gcc/コントリビュート/
著者への連絡は「[メール保護]".
最新の 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、コンパイル中に配線された
場所(通常は F:/ binに)、または設定可能な場所(「PERL_SH_DIR」を参照)に保存されます。
最良の結果を得るには、EMX pdkshを使用してください。標準バイナリ(5.2.14以降)はDOSで動作します。
(「RSX」の場合)も参照してください。
http://www.ilyaz.org/software/os2/
起動 パール プログラム 下 OS / 2 (と DOS そして...)
Perl プログラムを開始する foo.pl 引数「arg1 arg2 arg3」は他の
他のプラットフォーム、
perl foo.pl 引数1 引数2 引数3
Perl オプション「-my_opts」を Perl 自体に指定したい場合 (
プログラム)、使用します
perl -my_opts foo.pl arg1 arg2 arg3
あるいは、CMDや2os4のようなOS/2風のシェルを使用する場合は、先頭に次の行を入れます。
Perl スクリプトの:
extproc perl -S -my_opts
プログラムの名前を foo.cmdと入力して起動します。
foo 引数1 引数2 引数3
OS/2の制限により、perlスクリプトのフルパスは
「extproc」を使用する場合に利用できるため、「-S」Perlスイッチを使用する必要があり、
スクリプトは「PATH」上になければなりません。スクリプトへのフルパスが分かっている場合は、
あなたはまだそれを始めることができます
perl ../../blah/foo.cmd arg1 arg2 arg3
(引数「-my_opts」はスクリプト内の「extproc」行で処理されることに注意してください。
最初の行の「extproc」を参照してください)。
上記の内容を理解するには マジック 「-S」スイッチについてはperlのドキュメントを読んでください - perlrunを参照してください。
「extproc」に関するcmdref:
perl の表示 perlrun
男のperlrun
コマンド参照 extproc の表示
ヘルプ extproc
またはお好みの方法で。
使い方も無限大 実行ファイル エクステンション 4os2の、 団体 of
WPSなど...ただし、*nixishシェル( sh.exe バイナリで提供される
ディストリビューション) を使用する場合は、perlrun の「コマンド スイッチ」で指定されている構文に従う必要があります。
注意してください -S スイッチは追加の拡張機能を持つスクリプトをサポートします 。CMD, .btm, 。バット, .pl as
よく。
起動 OS / 2 (と DOS) プログラム 下 パール
これは何 システム() (perlfuncの「system」を参照)、「``」(perlopの「I/O演算子」を参照)、
開いた パイプ (perlfuncの「open」を参照) は、次のものです。(避けてください exec() (perlfuncの「exec」を参照)
ただし、自分が何をしているのか分かっている場合は除きます。
ただし、これらの演算子の一部を使用するには、sh構文のシェルが必要です。
インストールされていれば(「Pdksh」、「よくある質問」を参照)、perlはそれを見つけることができるはずです。
(「PERL_SH_DIR」を参照)。
シェルが使用されるケースは次のとおりです。
1. XNUMXつの引数 システム() (perlfuncの「system」を参照) exec() (perlfuncの「exec」を参照)
リダイレクトまたはシェルのメタ文字。
2. リダイレクトを含むコマンドでパイプオープンする(perlfuncの「open」を参照)。
シェルのメタ文字;
3. バッククォート「``」(perlopの「I/O演算子」を参照)を含むコマンドで
リダイレクトまたはシェルのメタ文字。
4. 実行ファイルが システム()/exec()/パイプ-開いた()/"``"は、
シェルを指定する「magic」「#!」行または「extproc」行。
5. 実行ファイルが システム()/exec()/パイプ-開いた()/"``"は、
「magic」行があり、$ENV{EXECSHELL} がシェルに設定されます。
6. 実行ファイルが システム()/exec()/パイプ-開いた()/"``"が見つかりません(これは
発言は時代遅れ?);
7. グロブについては(perlfuncの「glob」、perlopの「I/O演算子」を参照)(古い?Perlでは
最近はグロビングが組み込まれています...)。
一般的なケースの速度向上のため、上記のアルゴリズムでは、
コマンド名はシェルのメタ文字として扱われません。
Perlはクッキー「extproc」または「#!」で始まるスクリプトを、
シェルの介入。Perlは実行ファイルを見つけるために同じアルゴリズムを使用する。 プディクシュ:もし
「#!」行のパスが機能せず、「/」が含まれている場合、
実行ファイルは無視され、実行ファイルは . 「PATH」で見つけるには
これらのスクリプトの引数Perlは、 プディクシュ: 最大3つの引数
が認識され、末尾の空白は削除されます。
スクリプトにそのようなクッキーが含まれていない場合、呼び出しを回避するために sh.exePerlでは、
同じアルゴリズム プディクシュ: $ENV{EXECSHELL}が設定されている場合、スクリプトは最初のものとして与えられます
このコマンドの引数が設定されていない場合は、「$ENV{COMSPEC} /c」が使用されます(またはハードワイヤード
$ENV{COMSPEC} が設定されていない場合は推測します。
スクリプトを直接起動する場合、Perlは検索と全く同じアルゴリズムを使用します。
提供されたスクリプト -S コマンドラインオプション:現在のディレクトリを検索し、次に
$ENV{PATH}の構成要素を以下の順序で拡張子を付加して列挙する: 拡張子なし、
。CMD, .btm, 。バット, .pl.
PerlはOS/2が指定されたスクリプトを起動できない場合にのみスクリプトの検索を開始することに注意してください。
アプリケーションなので、「system 'blah'」は実行ファイルがある場合にはスクリプトを検索しません。
file blah.exe どこにでも 「PATH」について。言い換えれば、「PATH」は実質的に2回検索されます。
1 回目は OS によって実行可能ファイル用に実行され、2 回目は Perl によってスクリプト用に実行されます。
また、OS/2上の実行ファイルは任意の拡張子を持つことができますが、 .exeファイル なります
名前にドットが含まれていない場合は自動的に追加されます。回避策は簡単です。
あれ:以来 何とか。 何とか 同じファイルを示す(FATおよびHPFSファイルシステムのリストで)。
ファイルにある実行ファイルを起動する n:/bin/blah (拡張子なし)引数を与える
「n:/bin/blah.」(ドットを追加)に システム().
Perl は別の PM セッションで VIO (= テキスト モード) Perl プロセスから PM プログラムを開始します。
逆は真ではありません。PM Perlプロセスから非PMプログラムを起動すると、Perl
別のセッションでは実行されません。別のセッションが必要な場合は、
「system 'cmd /c myprog'」のようにそのシェルが使用されるか、オプションで起動します。
引数 システム() 「OS2::Process」モジュールに記述されています。これは
特徴。
頻繁に 尋ね 質問
"それ ありません 仕事"
Perlのバイナリディストリビューションには、 testperl.cmd 一般的な検出を試みるスクリプト
誤った設定によるインストールの問題。かなり高い確率で
インストールのどのステップを間違えたかを見つけてください。 ";-)"
I ラン 外部 プログラム
· プログラムを「-w」スイッチ付きで実行しましたか?「OS/2(およびDOS)プログラムの起動」を参照してください。
「Perl で」。
· 走ってみる? 内部 シェルコマンド、例えば「`copy ab`」(内部コマンド) cmd.exeを),
または「`glob a*b`」(kshの内部)でしょうか?シェルを明示的に指定する必要があります。
Perlはどのコマンドがアプリケーション内部のコマンドなのか推測できないため、「`cmd /c copy ab`」と入力します。
シェル。
I 埋め込みます パール に my プログラム、 or つかいます perl.dll from my プログラム。
プログラムは「-Zmt -Zcrtdll」で EMX コンパイルされていますか?
まあ、今では Perl DLL は、異なる方法でコンパイルされたプログラムからも使用できるはずです...
REXXスクリプトからPerlコードを実行できる場合(OS2::REXXを参照)、他にも
現在のハック的なコードでは見落とされているインタラクションの側面をサポート
異なる方法でコンパイルされた主要プログラム。
それでもダメなら、Perl用のスタンドアロンDLLをビルドする必要があります。ご連絡ください。
一度やってみました。ソケットは動作しませんでしたし、他の多くのものも動作しませんでした。
ExtUtils::Embed を使用しましたか?
以前、動作しないという報告がありました。現在はPerlテストで確認されています。
スイートなのでgrep ./t ビルドツリーのサブディレクトリ(および *.t のファイル ./ lib
サブディレクトリ) を参照して、どのように「正しく」実行すべきかを調べます。
「``」 パイプ-「オープン」 do 下 DOS。
これは単に「外部プログラムを実行できない」という状況のバリエーションである可能性もありますが、より深刻な問題である可能性もあります。
基本的に:あなた 必要 これらのコマンドが動作するにはRSX(「前提条件」を参照)が必要であり、
の港 sh.exe コマンド引数を理解するポートです。そのようなポートの1つは、
RSXの「前提条件」を参照してください。変数「PERL_SH_DIR」も忘れずに設定してください。
RSX には DPMI が必要です。
できません start 「find.exe "パターン" ファイル"
「アプリケーションを起動するための標準C API」の全体的な考え方は、「foo」という形式と
プログラム引数の「foo」は完全に交換可能です。 find このパラダイムを打ち破ります。
「パターン」ファイルを見つける
パターンファイルを見つける
同等ではありません。 find 上記のAPIを使用して直接起動することはできません。
二重引用符を他の引用構造で囲むには、必然的に
間には Unix 以外のシェルが追加されます。
いずれか1つを使用する
システム 'cmd'、'/c'、'「パターン」ファイルを検索';
`cmd /c '「パターン」ファイルを見つける'`
これは find.exe 、 cmd.exeを 「sh.exe」経由「perl.exe」経由だが、これは
非準拠プログラムを使用する場合は料金をお支払いいただきます。
インストール
オートマチック バイナリ インストール
Perlのバイナリディストリビューションをインストールする最も便利な方法は、Perlインストーラを使用することです。
install.exeを指示に従うだけで、インストールの99%の問題が解決します。
離れました。
ただし、 unzip.exe あなたの道とEMX環境 ランニング.
後者は、EMXをインストールし、必要な変更をすべて行った場合、
Config.sys再起動が必要な場合があります。EMXランタイムを確認するには、以下を実行します。
emxrev
バイナリインストーラーは、デスクトップに便利なオブジェクトが入ったフォルダも作成します。
バイナリインストーラーの動作の一部を変更する必要がある場合は、
file Perl.pkgこれは、インストーラを何度も実行する必要がある場合などに便利です。
GUI で多くの対話型の変更を行いたくない。
物事 撮影 これ of by 自動 バイナリ インストール:
コードページを変更する場合は「PERL_BADLANG」が必要になる場合があります After 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 以降、OS/2 perl バイナリ ディストリビューションは 11 個のコンポーネントに分割されています。
残念ながら、設定可能なバイナリインストールを有効にするには、zipファイル内のファイルパスが
絶対的なものではなく、あるディレクトリに対する相対的なものです。
保存されたパスでの抽出は依然として必要であることに注意してください(unzipのデフォルト、
pkunzipに「-d」を指定します。ただし、ファイルをどこに展開するかを知っておく必要があります。
手動でエントリを変更するには Config.sys ファイルをどこに置いたかを反映します。注
原始的な解凍ソフト(「pkunzip」など)があれば、
解凍中に警告/エラーが発生しました。「(w)unzip」にアップグレードしてください。
以下は、私のマシンで設定を再現するための手順の例です。
VIEW.EXE ここで「Ctrl + Insert」を押して、結果のファイルから切り取って貼り付けることができます -
開始したディレクトリに作成された VIEW.EXE から。
各コンポーネントについて、各インストールに関連する環境変数について説明します。
ディレクトリ。変数の値に一致するディレクトリを選択するか、
ディレクトリを考慮して変数を作成/追加します。
Perl VIO および PM 実行ファイル(動的にリンク)
perl_exc.zip を解凍し、*.exe *.ico -df:/emx.add/bin を実行します。
perl_exc.zip *.dll を解凍します -df:/emx.add/dll
(PATH に「*.exe」のあるディレクトリがあり、LIBPATH に「*.dll」のあるディレクトリがあります)。
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」の影響を受けます)には、これを
ディレクトリとサブディレクトリ ./os2 「PERLLIB」または「PERL5LIB」変数で使用しないでください。
すでに設定されていない場合は「PERL5LIB」を使用してください。Perlの「ENVIRONMENT」を参照してください。
[チェック かどうか この 抽出 ディレクトリにジョブを開始します。 is まだ 適用可能な NEW ディレクトリにジョブを開始します。
構造 レイアウト!
Perlモジュールをコンパイルするためのツール
perl_blb.zip を解凍 -df:/perllib/lib
と同じコメント perl_ste.zip.
Perlとユーティリティのマニュアルページ
perl_man.zip を解凍 -df:/perllib/man
このディレクトリは「MANPATH」に登録されている必要があります。 man アクセスするために
これらのファイル。
Perlモジュールのマニュアルページ
perl_mam.zip を解凍 -df:/perllib/man
このディレクトリは「MANPATH」に登録されている必要があります。アクセスするには、作業中のmanが必要です。
これらのファイル。
Perlドキュメントのソース
perl_pod.zip を解凍 -df:/perllib/lib
これは「perldoc」プログラム(perldocを参照)によって使用され、HTMLを生成するために使用される。
WWW ブラウザで使用できるドキュメントと、その他さまざまな形式のドキュメント:
「info」、「LaTeX」、「Acrobat」、「FrameMaker」など。[ ポッド2ラテックス
等。]
Perlマニュアル .INF 形式でアーカイブしたプロジェクトを保存します.
perl_inf.zip を解凍 -dd:/os2/book
このディレクトリは「BOOKSHELF」に置くほうがよいでしょう。
プドクシュ
perl_sh.zip を解凍します -df:/ binに
これは、次のように明示的にシェルを必要とする外部コマンドを実行するためにPerlによって使用されます。
を使用したコマンド 出力先変更 shell メタキャラクター. の代わりにも使われます
明白な /bin/sh.
移動する場合は「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 file
おそらく最も便利な形式です。OS/2では次のように表示されます。
perl を表示
perl perlfunc を表示
perl の表示を減らす
perl ExtUtils::MakeMaker を表示
(現在、最後の2つは間違った場所に当たる可能性がありますが、すぐに改善される可能性があります)。Win*
「概要」を参照してください。
自分でドキュメントを作成したい場合は、 OS / 2 ツールキット走る
pod2ipf > perl.ipf
in /perllib/lib/pod ディレクトリ、その後
ipfc /inf perl.ipf
(両方の手順で多くのエラーが発生することを想定してください。) 次に、これを BOOKSHELF パスに移動します。
シンプルスタイル 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다.
Perlのドキュメントがソース形式で提供されており、Perlのユーティリティがインストールされており、GNU groff
インストールすると、
perldoc perlfunc
perldoc が少ない
perldoc ExtUtils::MakeMaker
テキスト形式のPerlドキュメントにアクセスするには(より良い結果が得られるかもしれないことに注意してください)
perl のマニュアルページを使用します。
あるいは、pod2textを次のように実行してみてください。 ポッド ファイル。
マンページ
あなたがまだ man システムにインストールされていて、perlのmanページをインストールしている場合は、
このような:
男
男3人減
男性 ExtUtils.MakeMaker
Perl のさまざまなコンポーネントのドキュメントにアクセスします。 皮切りに
男パール
ドット (.) は、パッケージのドキュメントのパッケージ区切り文字として使用されます。
通常、場合によっては、セクションによるシャドウイングを避けるために、上記 3 のセクションを追加する必要があります。
less(1) マンページ.
ディレクトリが 上記の. マニュアルページのあるディレクトリは、次のように「MANPATH」上にあります。
この
MANPATH=c:/man;f:/perllib/man を設定します。
「f:/perllib/man/man1/」などの Perl マニュアルページ用。
HTML
WWWブラウザが利用できる場合は、ソースにPerlドキュメントをインストールしてください。
フォームとPerlユーティリティを使ってHTMLドキュメントを作成できます。 ポッド ファイル、そして
このような
cd f:/perllib/lib/pod
ポッド2html
この後、ブラウザにファイルを送信できます perl.html このディレクトリにあるので先に進みます
次のようにドキュメントを読んでください。
ファイル:///f:/perllib/lib/pod/perl.html を探索します。
あるいは、CPAN からこれらのドキュメントを事前にビルドして入手することもできます。
GNU "情報" ファイル
Emacsのユーザーにとって、特に「CPerl」モードがロードされていると非常に役立つでしょう。
最新の「pod2texi」を「CPAN」から、または、代わりに、事前に構築された情報ページから入手する必要があります。
PDF ファイル
「Acrobat」用のものは CPAN で入手できます (少し古いバージョンの perl 用かもしれません)。
"ラテックス" ドキュメント
「pod2latex」を使用して構築できます。
BUILD
ここでは、OS/2 で Perl をビルドする方法について説明します。
当学校区の 短い ストーリー
あなたは経験豊富なポーターなので、必要な道具はすべて揃っているはずです。
すでにシステムに存在し、Perl ソース配布の入手方法もわかっています。
解凍して、解凍ディレクトリに移動し、
gnupatch -p0 < os2\diff.configure
sh 構成 -des -D プレフィックス=f:/perllib
make
テストを行う
make installを
aout_testを作成する
aout_install を実行する
これにより、実行ファイルがf:/perllib/binに配置されます。手動で「PATH」に移動し、
構築物を移動する 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、同じ
ソート.exe使用状況を確認する
--version を見つける
ソート --version
)。最新バージョンの プディクシュ としてインストール sh.exe.
あなたが持っていることを確認してください BSD ライブラリとヘッダーがインストールされ、オプションで Berkeley DB もインストールされます
ヘッダーとライブラリ、そして暗号化。
ファイルを取得できる場所は次のとおりです:
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, gnugrep.zip, bsddev.zip ksh527rt.zip (またはそれ以降のバージョン)。
これらのユーティリティは LEO から利用可能であることがわかっています。
ftp://crydee.sai.msu.ru/pub/comp/os/os2/leo/gnu/
また、 db.lib db.a EMXディストリビューションの製品は、マルチ
スレッドコンパイル(シングルスレッドのPerlでもマルチスレッドのC RTLを使用するため、
XFree86-OS/2との互換性。正しいものを入手するには
http://www.ilyaz.org/software/os2/db_mt.zip
あなたがまだ 正確に 同じ バージョン of パール すでにインストールされている場合は、コピーがないことを確認してください
またはperlが現在実行されています。古いバージョンが使用されているため、ビルドの後のステップが失敗する可能性があります。
of perl.dll メモリにロードされたファイルが見つかるかもしれません。「make test」の実行は意味をなさなくなります。
テストはPerlの以前のビルドをチェックしているので(この状況は検出され、
によって報告された lib/os2_base.t テスト)。
環境。
また、以下の点もご確認ください。 / tmpに 現在のドライブ上のディレクトリ、および . あなたのディレクトリ
「LIBPATH」。後者の条件を修正するには、
BEGINLIBPATH を設定します。\。
次のようなものを使うと CMD.EXE または最新バージョン 4os2.exe(BEGINLIBPATHの設定
を単に「.」に変更すると、OS/2 カーネルによって無視されます。
gccが「-Zomf」リンクに対応していることを確認してください。「omflibs」スクリプトを実行します。 /emx/lib
ディレクトリにあります。
link386がインストールされていることを確認してください。OS/2には標準で付属していますが、インストールされていない場合もあります。
カスタマイズによりインストールされました。入力する場合
link386
あなたがそれを持っていないことを示す、 選択的な installを選択し、「オブジェクトモジュールをリンク」を選択します。
オプション ユーティリティ/その他link386 プロンプトが表示された場合は、「Ctrl-C」を押して終了します。
取得 パール source
最新のPerlソース(開発者向けリリースを含む)を入手する必要があります。
位置する確率
http://www.cpan.org/src/
http://www.cpan.org/src/unsupported
そうでない場合は、現在のディレクトリでインデックスを検索する必要があるかもしれません。
メンテナ。
開発者のリリースサイクルが速いため、OS/2のビルドが時々壊れることがあります。
http://www.cpan.org/ports/os2/
メンテナーによって公開された最新リリースを示す場合があります。
このリリースには、現在の Perl ソースに適用する追加のパッチがいくつか含まれる場合があります。
このように抽出します
tar vzxf perl5.00409.tar.gz
抽出中にエラーに関するメッセージが表示される場合があります 構成これは、
同様の名前のファイルと競合しています configure.
抽出ディレクトリに変更します。
Application of パッチ
パッチを適用する必要があります ./os2/diff.* このような:
gnupatch -p0 < os2\diff.configure
Perlのバイナリ配布に付属のパッチを適用する必要があるかもしれません。
また、OS/5関連の最新情報については、perl2-portersメーリングリストを参照するのも良いでしょう。
パッチ(参照http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/>) このようなパッチ
通常、文字列「/os2/」と「patch」が含まれているため、これらの文字列を探すのは理にかなっています。
手編集
ファイルを確認してください ./hints/os2.sh 間違いを見つけたら修正してください。
どこかで必要とされるとは思わない。
作成
sh 構成 -des -D プレフィックス=f:/perllib
「プレフィックス」は、生成されたPerlライブラリをインストールする場所を意味します。正しいプレフィックスを指定すると、
「PERLLIB_PREFIX」を指定する必要性を回避するには、「PERLLIB_PREFIX」を参照してください。
無視する メッセージ 自己紹介 行方不明 "ln", 自己紹介 "-NS" オプション 〜へ tr後者は最も
おそらくすでに修正されているはずです。もしあなたがそれを見て、後者の誤った警告がどこにあったのかを追跡できるなら
どこから来たのか教えてください。
Now
make
ある瞬間にビルドが終了し、 バージョン ミスマッチ or できません 〜へ ラン パール.
これは、あなたが . LIBPATHに perl.exe 必要なものが見つからない
perl67B2.dll (これらの16進数字をラインノイズとして扱う)。これが修正されたら、ビルドは次のようになります。
あまり手間をかけずに終了します。
テスト
今すぐ実行する
テストを行う
すべてのテストは成功するはずです(一部はスキップされます)。
Perlがインストールされている場合は、LIBPATHの先頭(または
そうしないと、テストで間違ったバージョンの Perl がテストされる可能性が高くなります。
一部のテストでは、次のような追加メッセージが生成されることがあります。
「悪い無料」がたくさんある
Berkeley DB に関連するデータベース テストで。 この すべき be 固定の 既に。 それであれば
警告が続く場合は、この警告を無効にすることができます。「PERL_BADFREE」を参照してください。
SIGTERM/SIGINTによってプロセスが終了しました
これはOS/2アプリケーションが発行する標準メッセージです。*nixアプリケーションは
サイレントモード。これは機能として認識されています。適切な方法で簡単に無効にすることができます。
シグナルハンドラー。
しかし、テストエンジンは予期せぬ瞬間にこれらのメッセージを画面に表示します。2
この種のメッセージ すべき テスト中に立ち会うこと。
より詳細なテストレポートを入手するには、
perl t/ハーネス
この報告書は io/pipe.t 失敗は次のようになります。
失敗したテストステータスWstat合計失敗失敗失敗した失敗のリスト
-------------------------------------------------- ----------
io/パイプ.t 12 1 8.33% 9
7 つのテストがスキップされ、さらに 56 のサブテストがスキップされました。
1/195テストスクリプトに失敗しました。99.49%は問題ありません。 1/6542サブテストは失敗し、99.98%は大丈夫です。
最も重要なテストをスキップする理由は次のとおりです。
op/fs.t
18 「stat()」の「atime」と「mtime」をチェックする - 残念ながらHPFSは
2秒の時間粒度(FATとの互換性のため?)。
25 書き込み用に開かれたばかりのファイルハンドルの「truncate()」をチェックします - 理由は分かりません
これは機能するはずですし、機能しないはずです。
op/stat.t
「stat()」をチェックします。テスト:
4 「stat()」の「atime」と「mtime」をチェックする - 残念ながらHPFSは
2秒の時間粒度(FATとの互換性のため?)。
装着 内蔵 パール
まだ「perl*.dll」を LIBPATH に移動していない場合は、今すぐ移動してください。
ラン
make installを
生成されたファイルは必要な場所に配置されます。手動で配置する perl.exe, パール__.exeファイル
パール___.exeファイル PATH上の場所に、 perl.dll LIBPATH 上の場所に。
ラン
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 PATH 上の場所に移動します。
ノート。 「perl_」のビルドプロセス ありません 知っています すべての依存関係について、
何かが最新であることを確認する必要があります。
perl_dll を作成する
最初。
建物 a バイナリ ディストリビューション
[このセクションでは簡単な概要のみを説明します...]
インストールしたPerlのバージョンに応じてビルドの進行が異なります。
すでにシステムに存在し使用されているか、まだ使用されていない新しいバージョンです。
以下の説明はバージョンが新しいことを前提としているので、DLLをインストールして .pm ファイル
中間ステップがまだ完了していない場合でも、システムの動作を中断することはありません。
完全に動作します。
その他のケースでは、もう少し複雑な手続きが必要になります。以下では、
Perl の現在のバージョンは 5.8.2 なので、実行可能ファイルはそれに応じて名前が付けられています。
1. Perlディストリビューションを完全にビルドしてテストします。以下のエラーが発生していないことを確認してください。
「test」および「aout_test」ターゲット。Perlおよび検出されたPerlテストスイートのバグを修正します。
これらのテストによって、「all_test」ターゲットが可能な限りクリーンに実行されるようにしてください。
それを確認してください os2/perlrexx.cmd 問題なく動作します。
2. 「installcmd」ターゲットを含むPerlを完全にインストールします。生成されたDLLを以下の場所にコピーします。
「LIBPATH」; 番号付きPerl実行ファイルをコピーします( perl5.8.2.exe)を「PATH」にコピーします
「perl_.exe」を「PATH」に「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
1GHzのプロセッサでは、初回実行時に数時間かかる場合があります。そして、
必ずしもスムーズな手順であるとは限りません。モジュールによっては、必要な手順が指定されていない場合があります。
依存関係があるため、結果が一致するまでこの手順を数回繰り返す必要がある場合があります。
安定させる。
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 〜へ
不審にスキップされたテストやその他の怪しいイベントを見つけます。
心に留めておきます インストール いくつかのモジュールも失敗する可能性があります。例えば、
アップデートはすでにロードされている可能性があります CPAN.pm. 「インストール」ログを調べます(例では
上記の. 00cpan_i_1 など)エラーが発生しないように手動でインストールします。
cd $CPANHOME/.cpan/build/Digest-MD5-2.31
make installを
いくつかのディストリビューションはいくつかのテストに失敗するかもしれませんが、とにかくインストールしたいかもしれません(
上記の方法、または「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ドキュメントのオンラインブック「perl.INF」が生成されます。「BOOKSHELF」パスにインストールしてください。
7. 静的にリンクされた実行ファイルをビルドする perl_.exe これには新たに
「Bundle::OS2_default」モジュール経由でインストールされます。「CPAN.pm」経由でテストを行うと、
XS 拡張ごとに新しい実行ファイルを静的にリンクするため、非常に遅くなります。
回避策としては、トップレベルを作成する メイクファイル.PL in $CPANHOME/.cpan/build/
内容は(「カスタムコレクションで実行ファイルを作成する」と比較してください)
静的にロードされた拡張機能)
ExtUtils::MakeMaker を使用します。
WriteMakefile NAME => 'dummy';
これを次のように実行する
perl_5.8.2.exe メイクファイル.PL
make -k すべてのテスト
繰り返しますが、この手順は必ずしもスムーズに進むわけではありません。「Makefile.PL」の中には、
サブディレクトリにはバグがある可能性があり、「子」スクリプトとして実行されない可能性があります。
モジュールの相互依存性は気になるかもしれませんが、非XSモジュールはすでに
インストールされると、ほとんどのモジュールの前提条件が満たされる可能性が高くなります。
不具合を発見した場合は、問題のあるモジュールのディレクトリを別のディレクトリに移動します。
場所; これらのモジュールが非XSモジュールの場合は無視して構いません。
すでにインストールされています。残りの XS モジュールは、手動で 1 つずつインストールする必要があります。
削除するたびに、「Makefile.PL」/「make」プロセスを再実行する必要があります。通常は
この手順はすぐに収束します。(ただし、必要なすべての外部C
図書館から .lib フォーマットする .a フォーマット: 次のいずれかを実行します
emxaout foo.lib
emximp -o foo.a foo.lib
どちらでも適切です。)また、外部ライブラリのDLLが
「-Zmtd」オプションなしでコンパイルされた実行可能ファイルで使用できます。
いくつかのサブディレクトリだけが失敗の原因になっていることが確実な場合は、以下を追加することをお勧めします。
「make」に「-j4」オプションを追加すると、既に完了しているサブディレクトリをスキップする速度が向上します。
ビルド。
テスト結果に満足したら、ビルドCライブラリをインストールします。
拡張:
インストール |& tee 00aout_i
これでファイル名を変更できます ./perl.exe 最後のフェーズで生成された
perl_5.8.2.exe; それを「PATH」に配置します。XS間に相互依存関係がある場合
モジュールの場合は、この新しい実行ファイルで「テスト」/「インストール」ループを繰り返す必要があるかもしれません。
いくつかのモジュールを除外 - 手順が収束するまで。
これで必要なものはすべて揃いました .a これらのPerlモジュールのライブラリを
Perlビルダーはそれを見つけることができます。Perlビルダーを使用するには、空のディレクトリに移動し、
「ダミー」 メイクファイル.PL もう一度実行します
perl_5.8.2.exe Makefile.PL |& tee 00c
perl を作成 |& tee 00p
これにより実行ファイルが作成されます ./perl.exe 静的にロードされた拡張機能すべて
組み込まれています。生成された perlmain.c ファイルを確認するために
繰り返し処理では、読み込まれる拡張機能の数は増加するだけです。名前を変更する ./perl.exe 〜へ
perl_5.8.2.exe 「PATH」で。
収束すると、次のような関数型が得られる。 perl_5.8.2.exe; コピー先
「perl_.exe」。これでローカル Perl インストールの生成が完了しました。
8. インストールしたモジュールが新しい場所に実際にインストールされていることを確認します。
Perlでは、古いバージョンからの継承のために与えられた@INCのエントリから継承されません。
Perlのバージョン: 「PERLLIB_582_PREFIX」を設定して、新しいバージョンのPerlを
新しい場所に移動し、インストールしたファイルをこの新しい場所にコピーします。テストを再度実行して
Perlの古いバージョンから継承したモジュールのバージョンが
必要です。
実際、ログ出力は ポッド2ipf(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|eg|cfg|html|pub|enc|all|ini|po|pot)$/i または /^\w+$/") | less
インストールツリー(一番上と サイトライブラリ XNUMX)。
すべてのDLLを圧縮する lxlite小さな .exeファイル 「/c:max」で圧縮できます(
バグは、ページの最後の6バイトに修正がある場合にのみ発生します(?)。
小さな実行ファイルはページよりもはるかに小さいため、バグは発生しません。圧縮しないでください。
「perl_.exe」 - DOS では動作しません。
9. これでバイナリ配布物を生成できます。これは、
CPANディストリビューション「OS2::SoftInstaller」。ファイルを調整します テスト.pl レイアウトに合わせて
まず現在のバージョンのPerlをインストールしてください。必要な外部DLLを忘れずにパッケージ化してください。
それに応じて、バグやテストスイートの失敗の説明を含めてください。
修正されません。PerlビルドからPerl実行ファイルの小さなスタックバージョンを組み込みます。
ディレクトリにあります。
含める perl5.def バイナリを保存したままPerl DLLを再リンクできるようにする
互換性を維持したり、互換性DLLを作成したりできます。差分ファイル("diff -pu
他の人があなたのバージョンを再構築できるように、修正した内容(古いもの、新しいもの)をまとめておきます。 perl5.map
リモートデバッグを使用できるようになります。
10. 自分がやったことを他の人と共有しましょう。リラックスしましょう。仕事の成果を楽しみましょう。
11. 感謝、バグ報告、嫌がらせメール、スパムメールが届くことを覚悟してください。
前のステップ。善行は罰せられずにはいられない!
建物 カスタム 。EXE ファイル
Perl実行ファイルはいつでも簡単に再構築できます。さらに、
埋め込み 非常にカスタマイズされた実行ファイルを作成するためのインターフェース (perlembed を参照)。
作成 実行可能ファイル a カスタム コレクション of 静的に ロードされました エクステンション
そうすることで、 減少 静的にロードされたリスト
拡張機能。ここではこのケースについてのみ説明します。
1. 空のディレクトリに移動し、プレースホルダーを作成します。 :
ExtUtils::MakeMaker を使用します。
WriteMakefile NAME => 'dummy';
2. Perl のフレーバーで実行する (perl.exe or perl_.exe) を再構築します。
perl_ Makefile.PL
3. 新しい Perl 実行ファイルを作成するように指示します。
perlを作る
(一部のOSでは、このコマンドラインに「PERLTYPE=-DPERL_CORE」を手動で追加する必要があるかもしれません。
Perlのバージョン。症状は、コマンドラインのグロビングが機能しないことです。
新しくコンパイルされた実行ファイルでOS/2シェルを実行する。
.\perl.exe -wle "@ARGV を印刷" *
).
4. 前のステップで作成した perlmain.c これには以下のリストが含まれています 新しいXS() 近くの呼び出し
終了。不要な呼び出しを削除して再実行します
perlを作る
カスタマイズされた実行可能ファイルが生成されます。
作成 実行可能ファイル a カスタム 検索パス
デフォルトのPerl実行ファイルは、ほとんどの用途に対応できるほど柔軟です。しかし、
さらに柔軟なものが欲しい。例えば、Perl DLLを相対的に探したい場合など。
EXEファイルの場所、または設定時に環境を無視したい場合もある。
Perlライブラリ検索パッチなど
快適に満たすなら 埋め込み インターフェース(perlembedを参照)では、そのようなことは簡単に
「カスタムコレクションで実行ファイルを作成する」で説明した手順を繰り返します。
静的にロードされた拡張機能」と、より包括的な編集を行うことで メイン() of perlmain.c.
Perlを理解する意欲があまりない人は、名前を変更するだけでいい。 メイン()、そして必要なことを行う
カスタムの変更 メイン() 適切なタイミングで名前を変更した関数を呼び出します。
しかし、3つ目の方法があります。perl DLLは メイン() 関数といくつかのコールバック
検索パスをカスタマイズします。以下は「Perlローダー」の完全な例です。
1. ディレクトリ「$exedir/../dll」で Perl DLL を検索します。
2. 上記のディレクトリを「BEGINLIBPATH」の先頭に追加します。
3. 「BEGINLIBPATH」で見つかったPerl DLLがロードされたものと異なる場合は失敗します。
ステップ1; 例えば、別のプロセスが「LIBPATH」または別のディレクトリからロードした可能性があります。
「BEGINLIBPATH」の値。このような場合は、システムの設定を変更する必要があります。
この他のプロセスは実行されないか、または「BEGINLIBPATH」からDLLをロードします。
「LIBPATHSTRICT=T」を使用します(2000 年 XNUMX 月以降のカーネルで利用可能)。
4. 「$exedir/../dll/lib/」から Perl ライブラリをロードします。
5. 「$exedir/../dll/sh/ksh.exe」からBourne シェルを使用します。
最良の結果を得るには、以下の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 ファイルは次のとおりです。
#INCL_DOS を定義する
#INCL_NOPM を定義する
/* os2.h が os2emx.h ではなく os2tk.h をインクルードしている場合、これらはコンパイルに必要です */
#INCL_DOSPROCESS を定義する
#含む
#include "EXTERN.h"
#define PERL_IN_MINIPERLMAIN_C
#include "perl.h"
静的文字 *me;
HMODULE ハンドル;
静的ボイド
die_with(char *msg1, char *msg2, char *msg3, char *msg4)
{
ウロン c;
char *s = " エラー: ";
DosWrite(2, 私, 伸びる(私)、その他
DosWrite(2, s, strlen(s), &c);
DosWrite(2, メッセージ1, 伸びる(メッセージ1)、など)
DosWrite(2, メッセージ2, 伸びる(メッセージ2)、など)
DosWrite(2, メッセージ3, 伸びる(メッセージ3)、など)
DosWrite(2, メッセージ4, 伸びる(メッセージ4)、など)
DosWrite(2, "\r\n", 2, &c);
終了する(255);
}
typedef ULONG (*fill_extLibpath_t)(int type, char *pre, char *post, int replace, char *msg);
typedef int (*main_t)(int type, char *argv[], char *env[]);
typedef int (*handler_t)(void* data, int which);
#ifndef PERL_DLL_BASENAME
# PERL_DLL_BASENAME "perl" を定義する
#endif
静的HMODULE
load_perl_dll(char *ベース名)
{
char buf[300]、失敗[260];
STRLEN l、dirl;
fill_extLibpath_t f;
ULONG rc_fullname;
HMODULE ハンドル、ハンドル1;
_execname(buf, sizeof(buf) - 13) != 0 の場合
die_with("完全なパスが見つかりません: ", strerror(errno), "", "");
/* XXXX 'me' に新しい値を入力します */
l = strlen(buf);
(l && buf[l-1] != '/' && buf[l-1] != '\\') の間
l--;
dirl = l - 1;
strcpy(buf + l, ベース名);
l += strlen(ベース名);
strcpy(buf + l, ".dll");
if ( (rc_fullname = DosLoadModule(fail, sizeof fail, buf, &handle)) != 0
&& DosLoadModule(fail, sizeof fail, basename, &handle) != 0 )
die_with("DLL をロードできません ", buf, "", "");
if (rc_fullname)
ハンドルを返します。/* 短い名前がロードされました。すべて正常です */
if (DosQueryProcAddr(handle, 0, "fill_extLibpath", (PFN*)&f))
die_with(buf, ": DLL はシンボルをエクスポートしません ", "fill_extLibpath", "");
buf[dirl] = 0;
if (f(0 /*BEGINLIBPATH*/, buf /* 先頭に追加 */, NULL /* 末尾に追加 */,
0 /* 古い値を保持 */, me))
die_with(me, ": 先頭に BEGINLIBPATH を付加", "", "");
DosLoadModule(fail, sizeof fail, basename, &handle1) != 0 の場合
die_with(me, ": BEGINLIBPATH 経由で perl DLL を再度検索", "", "");
buf[dirl] = '\\';
if (ハンドル1 != ハンドル) {
if (DosQueryModuleName(handle1, sizeof(fail), fail))
strcpy(失敗, "???");
die_with(buf, ":\n\tBEGINLIBPATH経由のperl DLLが異なります: \n\t",
失敗、
"\n\tグローバルBEGINLIBPATHとLIBPATHSTRICTを操作する必要があるかもしれません"
"\n\t他のコピーが BEGINLIBPATH 経由でロードされるようにします。");
}
ハンドルを返します。
}
int型
main(int argc, char **argv, char **env)
{
main_t f;
ハンドラー_t h;
me = argv[0];
/ ** /
ハンドル = load_perl_dll(PERL_DLL_BASENAME);
DosQueryProcAddr(ハンドル, 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 manglers をインストールできません", "", "");
if (DosQueryProcAddr(ハンドル, 0, "dll_perlmain", (PFN*)&f))
die_with(PERL_DLL_BASENAME, ": DLL はシンボルをエクスポートしません ", "dll_perlmain", "");
f(argc, argv, env) を返します。
}
建設 よくあるご質問
一部 "/" になりました 「\」 in pdksh。
非常に古いpdkshを使用しています。「前提条件」を参照してください。
'errno' - 未解決 外部
MT-safe がありません db.lib「前提条件」を参照してください。
問題 tr or sed
非常に古いバージョンの tr および sed で報告されました。
一部 問題 (忘れる which ;-)
古いバージョンをお持ちです perl.dll LIBPATHに、ビルドが壊れました
拡張機能
ライブラリ ... 発見
「omflibs」を実行していません。「前提条件」を参照してください。
セグメントフォールト in make
古いバージョンのGNU makeを使用しています。「前提条件」を参照してください。
op/sprintf test 失敗
これは、0.9d fix 03 で修正された emx sprintf のバグによって発生する可能性があります。
特定の (誤った)特徴 of OS / 2 ポート
「優先順位の設定」 「優先順位を取得する」
これらの関数は *nix と互換性がありますが、'94 - 95 の古いポートとは互換性がないことに注意してください。
優先度は絶対値で、32から-95までで、低いほど速くなります。0がデフォルトです。
優先度。
警告存在しないプロセスで「getpriority」を呼び出すと、システムがロックされる可能性があります。
Warp3 fixpak22。Warp3以降、Perlは回避策を使用します。 getpriority()
プロセスが存在しない場合は、この処理は実行できません。これは、古いバージョン「2.*」では実行できず、
とにかく競合状態です。
"システム()"
「system()」の複数引数形式では、追加の数値引数が許されます。
この引数については OS2::Process で説明されています。
実行するプログラムを見つけるとき、PerlはまずOSに「PATH」上の実行ファイルを探すように要求します。
(OS/2は拡張機能を追加 .exeファイル 拡張子が存在しない場合は、
拡張子が以下の順序で追加されたスクリプト: 拡張子なし、 。CMD, .btm, 。バット, .pl.
見つかった場合、Perlはファイルの先頭にマジックストリング「#!」と「extproc」があるかどうかを確認します。
見つかった場合、Perlは最初の行の残りをコマンドラインの先頭として使用して実行します。
このスクリプトの最初の行で行われる変更は引数の抽出のみです。
(現在は最大3つ)、「インタープリタ」名のパス部分は無視されます。
完全なパスを使用して見つけることができます。
例えば、「system 'foo', 'bar', 'baz'」はPerlが C:/emx/bin/foo.cmd
最初の行は
外部プロセス /bin/bash -x -c
If /bin/bash.exe 見つからない場合は、Perlは実行ファイルを探す bash.exe 「PATH」に。もし
見つかった C:/emx.add/bin/bash.exe、上記の システム() に翻訳されます
システム qw(C:/emx.add/bin/bash.exe -x -c C:/emx/bin/foo.cmd bar baz)
追加の翻訳が1つ実行されます。 /bin/sh Perlはハードワイヤードまたは
カスタマイズされたシェル (「PERL_SH_DIR」を参照)。
上記の「インタープリター」の検索は再帰的です。 bash 実行ファイルが見つかりませんが、
bash.btm が見つかると、Perlはその最初の行などを調べます。
再帰の深さは暗黙的である。追加引数の数には4の制限がある。
実際の引数の前に挿入されます システム()特に、追加の
引数が「魔法の」最初の行に指定されている場合、深さの制限は 4 になります。
Perlは、現在のセッションがPMタイプではないのに、見つかった実行ファイルがPMタイプであると判断すると、
必要なタイプの別のセッションで新しいプロセスを開始します。
この魔法を無効にするには、「OS2::Process」を使用します。
警告. 説明したロジックにより、明示的に指定する必要があります .com 拡張の場合
必要ありません。さらに、実行ファイルが パール5.6.1 要求された場合、Perlは
perl5.6.1.exe[今後変更される可能性があります。]
「extproc」 on 最初の ライン
Perlスクリプトの最初の文字が「extproc」の場合、この行は「#!」行として扱われます。
したがって、この行のすべてのスイッチが処理されます(スクリプトが
cmd.exe)。perlrun の「DESCRIPTION」を参照してください。
NEW モジュール:
OS2::Process、OS2::DLL、OS2::REXX、OS2::PrfDB、OS2::ExtAttr。これらのモジュールはアクセスを提供します。
「システム」の追加の数値引数と実行中のシステムに関する情報
プロセス、REXXシグネチャを持つ関数を持つDLL、REXXランタイム、OS/2
データベース .INI 形式、および拡張属性。
Andreas Kaiserによる2つの追加拡張機能「OS2::UPM」と「OSXNUMX::FTP」が
「ILYAZ」ディレクトリは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(名前)"
EMX から cwd へのインターフェース。「Cwd::cwd」によって使用されます。
"Cwd::sys_abspath(名前, ディレクトリ)"
実装するのが本当に面倒な関数。ファイルの絶対パス名を返すので、
CWD が "dir" の場合、"name" を持ちます。"Dir" のデフォルトは現在のディレクトリです。
"Cwd::extLibpath([type])"
拡張ライブラリ検索パスの現在の値を取得します。「type」が存在し、正の場合、
「END_LIBPATH」で動作し、負数の場合は「LIBPATHSTRICT」で動作し、それ以外の場合は
「BEGIN_LIBPATH」です。
"Cwd::extLibpath_set( パス [, タイプ ] )"
拡張ライブラリ検索パスの現在の値を設定します。「type」が存在し、正の場合、
と連携負の場合は「LIBPATHSTRICT」で動作し、それ以外の場合は
「BEGIN_LIBPATH」です。
「OS2::Error(do_harderror,do_exception)」
まだ呼び出されていない場合は「undef」を返し、そうでない場合は前回の呼び出し時にビット1がセットされます。
do_harderrorの呼び出しが有効になっている場合、前の呼び出しでdo_exceptionが呼び出された場合はビット2が設定されます。
有効になりました。
この機能は、ハードウェアエラー(ディスクが
準備完了など) およびソフトウェア例外。
ポップアップの状態を確認する方法は知りません これへの最初の呼びかけ
機能。
「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、ページサイズ、
バージョン_メジャー、バージョン_マイナー、バージョン_リビジョン、
MS_COUNT、TIME_LOW、TIME_HIGH、TOTPHYSMEM、TOTRESMEM、
TOTAVAILEMEM、MAXPRMEM、MAXSHMEM、TIMER_INTERVAL、
MAX_COMP_LENGTH、FOREGROUND_FS_SESSION、
フォアグラウンドプロセス
OS2::ブートドライブ()
コロンなしの文字を返します。
「OS2::MorphPM(サーブ)」、「OS2::UnMorphPM(サーブ)」
現在のアプリケーションをPMアプリケーションに変換し、その逆も実行します。引数trueは
実際のメッセージ ループが提供されることを意味します。 OS2::MorphPM() PMを返す
メッセージ キュー ハンドルを整数として指定します。
詳細については、「リソースの集中管理」を参照してください。
「OS2::Serve_Messages(強制)」
未処理のPMメッセージのオンデマンド取得を偽装します。「force」がfalseの場合、取得は実行されません。
実際のメッセージループが存在することが分かっている場合は、メッセージをディスパッチします。
メッセージが取得されました。
WM_QUIT メッセージが取得された場合は、「QUITing...」で終了します。
「OS2::Process_Messages(force [, cnt])」
ウィンドウの作成/破棄までのPMメッセージの取得。「force」がfalseの場合、
実際のメッセージ ループが存在することがわかっている場合は、メッセージをディスパッチしません。
ウィンドウ数の変化を返します。「cnt」が指定された場合は、
取得されたメッセージの数。
WM_QUIT メッセージが取得された場合は、「QUITing...」で終了します。
"OS2::_control87(新規、マスク)"
と同じ _control87(3) EMX。引数として整数を取り、前の
コプロセッサ制御ワードを整数として表す。「new」に含まれるビットのうち、
制御ワード内の「マスク」が変更されます。
OS2::get_control87()
コプロセッサ制御ワードを整数として取得します。
「OS2::set_control87_em(新規=MCW_EM、マスク=MCW_EM)」
の変種 OS2::_control87() 例外マスクの処理に適したデフォルト値:
「mask」がない場合、「new」の例外マスク部分のみを使用します。「new」がない場合、すべての例外マスクを無効にします。
浮動小数点例外。
詳細については、「Misfeatures」を参照してください。
"OS2::DLLname([how [, \&xsub]])"
Perl DLLまたはC関数がバインドされているDLLに関する情報を提供します。
&xsubによる。"how"の意味は次のとおりです: デフォルト(2): フルネーム; 0: ハンドル; 1: モジュール名。
(これらの一部は、最終的には別のライブラリに移動される可能性があることに注意してください)。
事前構築済み 変数:
$OS2::emx_rev
数値はEMXの_emx_revと同じ、文字列値は_emx_vprtと同じ
(「0.9c」と同様)。
$OS2::emx_env
EMX の _emx_env と同じ、0x8001 に似た数値。
$OS2::os_ver
数値「OS_MAJOR + 0.001 * OS_MINOR」。
$OS2::is_aout
Perl ライブラリが AOUT 形式でコンパイルされている場合は true。
$OS2::can_fork
現在の実行ファイルがAOUT EMX実行ファイルの場合、Perlがフォークできる。
これを使用する場合、$Config::Config{dfork} のポータブル チェックを使用します。
$OS2::nsyserror
この変数(デフォルトは1)は、$^Eの内容を強制的に開始するかどうかを制御します。
「SYS0003」のようなIDを持つ。0に設定されている場合、$^Eの文字列値は
OS/2メッセージファイルから入手できます。(このファイル内の一部のメッセージは
(「SYS0003」のような ID が先頭に付加されますが、付加されないものもあります。)
不具合
・ 以来 群れ(3)はEMXに存在しますが機能しません。Perlでエミュレートされています。
エミュレーションを無効にするには、環境変数「USE_PERL_FLOCK=0」を設定します。
· EMX で「壊れている」可能性があるもののリストは次のとおりです (EMX ドキュメントより):
· 機能 受信メッセージ(3) メッセージを送る(3)と、 ソケットペア(3)は実施されていない。
· ソックイニチ(3)は必須ではなく、実施されていない。
· 群れ(3)はまだ実装されていません(ダミー関数)。(Perlには回避策があります。)
· kill(3):PID=0、PID=1、PID=-1の特別な処理は実装されていません。
· 待ってください(3):
追跡されない
実装されていません。
waitpid() は PID の負の値に対しては実装されていません。
「kill -9」は現在のバージョンの EMX では機能しないことに注意してください。
· 「テキスト モードのファイルハンドル」を参照してください。
· OS/2上のUnixドメインソケットは擬似ファイルシステム「/sockets/...」に存在します。
異なる形式の名前でソケットを作成できない場合は、「/socket/」が先頭に追加されます。
ソケット名 (すでにこれで始まっている場合を除く)。
これは、ソケットが「通常の」ファイル経由でアクセスされた場合に、後で問題を引き起こす可能性があります。
「初期」名を使用してシステム コールを実行します。
· どうやらIBMはFPを変更するコンパイラを使用していたようだ('95年頃の一時期?)
マスクの左右。これは それ IBMのプログラムには悪いが、同じコンパイラ
汎用アプリケーションで使用されるDLLに使用されていました。これらのDLLが
が使用される場合、アプリケーション内の浮動小数点フラグの状態は予測できません。
さらに悪いことに、一部のDLLは、 _DLLInitTerm()
(例えば、 TCP32IP)。つまり、たとえあなたが コール DLL内の任意の関数
このDLLをロードするだけでフラグがリセットされます。さらに悪いことに、
コンパイラはいくつかのHOOK DLLをコンパイルするために使用されました。HOOK DLLは
のコンテキスト を システム内のアプリケーションでは、これは完全な予測不可能性を意味します
このようなフックDLLを使用するシステムでは、浮動小数点フラグの。例: GAMESRVR.DLL of DIVE
originは、VIO(ウィンドウ型)のTTYへの書き込みごとに浮動小数点フラグを変更します。
テキストモードのアプリケーション。
FPフラグが変化する他の状況(完全にデバッグされていない)としては、
ビデオドライバ(?)、およびウィンドウの作成に関連するいくつかの操作。
コード OpenGLの これについてはより多くの経験があるかもしれません。
Perlは一般的に、すべての浮動小数点例外が
EMXのデフォルト設定では無視されます。無視されない場合、一部の無害なPerl
プログラムは「SIGFPE」を受け取り、ひどい死を遂げることになります。
これを回避するために、Perlは2つのハックを採用しています。 XNUMXつ 損傷の種類のみ:
DLL をロードするときに FP フラグが変更されました。
ハックの1つは、Perlの起動時に浮動小数点例外を無効にすることです(
EMXのデフォルト)。これは、コンパイル時にリンクされたDLLのフラグを変更する場合にのみ役立ちます。
メイン() 呼ばれる機会がありました。
もう一つのハックは、呼び出し後にFPフラグを復元することです。 dlopen()これは、
DLLによる同様の被害 _DLLInitTerm() 実行時に切り替えます。現在、切り替える方法はありません
これらのハックオフが提供されます。
修正
Perl は、いくつかの標準 C ライブラリ呼び出しを次のように変更します。
「popen」「my_popen」は sh.exe シェルが必要な場合は、「PERL_SH_DIR」を参照してください。
「tmpnam」は、「tempnam」を介して「TMP」または「TEMP」環境変数を使用して作成されます。
「tmpファイル」
現在のディレクトリが書き込み可能でない場合は、変更されたファイルを使用してファイルが作成されます。
「tmpnam」なので、競合状態が発生する可能性があります。
「ctermid」
ダミー実装。
「stat」「os2_stat」の特殊ケース / dev / tty /dev/con.
「mkdir」、「rmdir」
これらのEMX関数は、パスの末尾に「/」が含まれている場合は機能しません。Perl
この問題の回避策が記載されています。
「群れ」以来 群れ(3)はEMXに存在しますが機能しません。perlによってエミュレートされます。
エミュレーションを無効にするには、環境変数「USE_PERL_FLOCK=0」を設定します。
識別 DLL
Perlの現在のバージョンで構築されたすべてのDLLには、名前を識別するID文字列があります。
拡張機能、そのバージョン、およびこのDLLに必要なPerlのバージョン。
この情報を見つけるには、「bldlevel DLL-name」を参照してください。
一元化 管理 of リソース
特定のOS/2 APIを呼び出すには、正しく初期化された「Win」サブシステムが必要なので、
OS/2固有の拡張機能では、「HAB」と「HMQ」の取得が必要になる場合があります。拡張機能で
単独で実行すると、別の拡張機能の初期化に失敗する可能性があります。
Perl はこれらのリソースの集中管理を提供します。
「ハブ」
HABを取得するには、拡張機能はC言語で「hab = perl_hab_GET()」を呼び出す必要があります。その後、
呼び出しが実行されると、「hab」は「Perl_hab」としてアクセスできるようになります。解放する必要はありません。
使用後のHAB。
何らかの理由で perl.h 含めることはできません。
外部 int Perl_hab_GET(void);
を代わりにお使いください。
「HMQ」
XNUMXつのケースがあります:
· 拡張機能には「HMQ」が必要です。これは、一部のAPIが動作しないためです。
以下は「serve = 0」です。
· 拡張機能はPMイベントループを実行するため、「HMQ」が必要です。
以下は「serve = 1」です。
「HMQ」を取得するには、拡張機能はC言語で「hmq = perl_hmq_GET(serve)」を呼び出す必要があります。
この呼び出しが実行されると、「hmq」は「Perl_hmq」としてアクセスできるようになります。
HMQが不要になったことをPerlに通知するには、「perl_hmq_UNSET(serve)」を呼び出します。Perl
HMQがPMプロセスに変形/変形されていない場合、プロセスは自動的にPMプロセスに変形/変形解除されます。
必要/不要。Perlは実行中に「WM_QUIT」メッセージを自動的に有効/無効にします。
メッセージ キューが処理されているか処理されていない場合はシャットダウンします。
注意シャットダウン中にWM_QUITを無効にしなかったメッセージキューがある場合、
受信したWM_QUITメッセージを処理しなかった場合は、シャットダウンが実行されます。
自動的にキャンセルされます。電話しないでください。 perl_hmq_GET(1)処理するつもりがない限り
メッセージを順番に送信します。
OS/2 APIによって報告されたエラーの処理
2つの主要な慣例があります(「Dos*」と「Win*」と呼ぶと便利です)
ただし、関数シグネチャのこの部分は、関数の名前によって常に決定されるわけではない。
API)はOS/2 APIのエラー状態を報告する。ほとんどの「Dos*」APIは
呼び出しの結果としてのエラーコード(0は成功を意味し、多くの種類があります)
エラー)。ほとんどの「Win*」API は、結果が「TRUE」/「FALSE」になることで成功/失敗を報告します。
失敗の原因を見つけるには、 WinGetLastError() APIです。
いくつかの「Win*」エントリポイントは、エラーで「意味のある」戻り値をオーバーロードします。
インジケータ。戻り値が0の場合はエラーを示します。しかし、他の「Win*」エントリ
ポイントはさらに負荷をかけ、戻り値0は呼び出しが成功したことを意味する可能性がある。
有効な値0とエラー状態を返します。0が返された場合
呼び出すべき値 WinGetLastError() 成功した呼び出しと失敗した呼び出しを区別するAPI
1つ失敗。
慣例により、OS/2 APIへのすべての呼び出しは、リセットすることで失敗を示す必要があります。
$^E. OS/2 APIを呼び出すPerlでアクセス可能なすべての関数は、XNUMXつに分けられます。
クラス: 一部 死にます()APIエラーが発生した場合、もう一方はエラーを報告します。
偽の戻り値(もちろん、これはPerlでアクセス可能な関数には関係しません。
期待する OS/2 API 呼び出しの失敗 (いくつかの回避策がコード化されている)。
明らかに、OS/2 APIのシグネチャの最後のタイプの状況では、
障害が次のように表示されると、ユーザーにとってより便利になります。 死にます()ing: 人は
何か問題が起きたかどうかを知るために$^Eをチェックする必要はありません。しかし、この解決策では
何らかの理由で望ましくない場合は、問題のコードは$^Eを0にリセットする必要があります。
このOS/2 API呼び出しを行うと、このPerlアクセス可能な関数の呼び出し元は
成功だが戻り値が0の値を失敗と区別する機会。(
エラーを報告する別の方法として undef を使用します。
このタイプのエラー伝播を簡素化するマクロは
"CheckOSError(式)"
エラーの場合はtrueを返し、$^Eを設定します。 式() 「Dos*」スタイルの API の呼び出しになります。
"CheckWinError(式)"
エラーの場合はtrueを返し、$^Eを設定します。 式() 「Win*」スタイルの API の呼び出しになります。
"SaveWinError(式)"
"expr"を返し、$^Eを WinGetLastError() 「expr」が偽の場合。
"SaveCroakWinError(expr,die,name1,name2)"
"expr"を返し、$^Eを WinGetLastError() 「expr」が偽の場合、 死にます()sの場合
「die」と$^Eは真です。dieへのメッセージは連結された文字列「name1」です。
そして、$^E の内容から「:」で区切られた「name2」が出力されます。
「WinError_2_Perl_rc」
「Perl_rc」を戻り値に設定する WinGetLastError().
「FillWinError」
「Perl_rc」を戻り値に設定する WinGetLastError()を設定し、$^Eを
対応する値。
「FillOSError(rc)」
「Perl_rc」を「rc」に設定し、$^E を対応する値に設定します。
DLL の読み込みと DLL 内の序数
一部のDLLはOS/2の一部のバージョン、またはOS/XNUMXの一部の構成にのみ存在します。
OS/2。エクスポートされたエントリポイントの一部は、一部のバージョンに同梱されているDLLにのみ存在します。
OS/2のDLLとエントリポイントがPerlアプリケーションに直接リンクされていた場合、
実行ファイル/DLLまたはPerl拡張機能からこのバイナリは、
指定されたバージョン/セットアップ。これらのエントリポイントが必要ない場合でも、 負荷 of
実行可能ファイル (または DLL) は失敗します。
例えば、OS/2 v2には多くの新しい便利なAPIが存在しません。多くのPM関連のAPIは
フロッピー ブート セットアップでは利用できない DLL が必要です。
これらの呼び出しを失敗させるには の を特定いたします。 呼び出し 実行されたこれらのAPIを呼び出す必要があります
動的リンクAPIを介して。Perlには、このようなタイプのリンクを簡素化するサブシステムがあります。
呼び出し。このようなリンクに使用できるエントリポイントが多数用意されています(
「entries_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()
提供されているOS/2関連モジュールのヘッダーファイルとCコードを参照してください。
これらの機能の使用法の詳細。
これらの関数の中には、ダイナローディングセマンティクスとエラー伝播を組み合わせたものもある。
上で説明した意味。
パール 味
OS/2の特異性のため、すべての卵を同じバスケットに入れることはできません(ただし
EMX環境はこの制限を克服しようと努力しているので、状況は何とか
改善されます。ディストリビューションでは Perl の実行ファイルが 4 つ提供されています。
perl.exe
主力のマシン。これはキメラ実行ファイルであり、「a.out」形式でコンパイルされる。
実行可能だが、「omf」スタイルの動的ライブラリにリンクされている perl.dll、ダイナミックCRT搭載
DLL。この実行ファイルは VIO アプリケーションです。
Perlの動的拡張をロードすることができ、 フォーク().
ノート。 心に留めておきます フォーク() 自分自身へのパイプを開くために必要です。
perl_.exe
これは静的にリンクされた「a.out」形式の実行ファイルです。動的なPerlをロードすることはできません。
拡張機能。バイナリ配布で提供される実行ファイルには多くの拡張機能があります
事前に構築されているため、上記の制限はカスタムビルドの拡張機能を使用する場合にのみ重要です。
この実行ファイルは VIO アプリケーションです。
この is の 実行ファイル ありません 必要とする OS / 2。 「M$」の世界に閉じ込められた友人たち
この実行ファイルがDOS、Win0.3*、Win0.95、WinNTで動作することを歓迎します。
適切なエクステンダーが必要です。「その他のOS」を参照してください。
パール__.exeファイル
これは、 パール___.exeファイルただし、これは PM アプリケーションです。
ノート。 通常(起動時に明示的にリダイレクトされない限り)STDIN、STDERR、およびSTDOUT
PMアプリケーションのリダイレクト先 ヌルしかし、 あなたが
コンソールウィンドウをエミュレートするPMプログラムから「perl__.exe」を起動します。 シェル(Shell) モード of
EmacsまたはEPM。つまり is 可能 Perlデバッガ(perldebug参照)を使用してPMをデバッグする
アプリケーション(ただし、メッセージループのロックアップに注意してください。
メッセージキューにサービスが接続されていない限り、 getc() の機能
デバッガ)。
PMプログラムの出力を確認するもう一つの方法は、次のように実行することです。
pm_prog 引数 2>&1 | cat -
殻付き 今とは異なる from cmd.exeを、VIO間のリンクを作成しないようにします
セッションと「pm_porg」のセッション。(このようなリンクはVIOウィンドウを閉じます。)例えば、
と連携 sh.exe - または Perl で!
P を開き、 'pm_prog args 2>&1 |' または die;
印刷しながら;
味 パール__.exeファイル VIOウィンドウなしでプログラムを起動したい場合に必要です
存在しますが、「デタッチ」されていません(詳細については「help detach」を実行してください)。拡張機能には非常に便利です
「Perl/Tk」や「OpenGL」のようにPMを使用するもの。
PMとVIO実行ファイルの違いは、 デフォルト
行動。始めることができる どれか 実行可能ファイル どれか 引数を使用してセッションの種類を指定する
「/fs」、「/pm」または「/win」スイッチは、コマンド「start」( CMD.EXE または同様のシェル)。
あるいは、Perl関数「system」の最初の数値引数を使うこともできる(
OS2::Process)。
パール___.exeファイル
これは「omf」形式の実行ファイルであり、動的にリンクされています。 perl.dll およびCRT DLL。
この実行ファイルが「perl.exe」よりも優れている点は何もないが、 フォーク() 全然。まあ、
1 つの利点は、ビルド プロセスが「perl.exe」ほど複雑ではないことです。
VIOアプリです。
Why 奇妙な 名前?
Perlは「#!」行を処理するので(perlrunの「説明」、
perlrun、perldiagで「入力にPerlスクリプトが見つかりません」というエラーが表示される場合、プログラムがいつ実行されるかを知る必要があります。 is a
パールPerlが正しい行と間違った行を区別できるように、命名規則があります。
間違った名前は存在しません。上記の名前は、この規約で認められている名前の中で、
数字(意味がまったく異なる)を含まない。
Why ダイナミック リンク?
まあ、同じ巨大なライブラリに複数の実行ファイルを動的にリンクさせるのは、
利点はありますが、コンパイルするための追加作業の価値を裏付けるものではありません。
理由は、開発者にとっては複雑だが、ユーザーにとっては非常に速くて便利な「難しい」ことだ。
OS/2 で使用される動的リンク。
OS/2のダイナミックリンクモデルにはXNUMXつの特徴があります。まず、
外部関数への参照はコンパイル時に解決されます。次に、
DLLがメモリにロードされた後のランタイム修正。最初の機能は
他のモデルに比べて大きな利点があります。複数のDLLを1つのアプリケーションで使用する場合の競合を回避できます。
同じ名前のアプリケーションエクスポートエントリが存在する場合、他の動的モデルが
リンクは、ランダムな基準を使用して、これらの2つのエントリポイントのいずれかを選択するだけです。
結果として予測可能な災害が発生する。しかし、ビルドに必要なのは2番目の機能である。
of perl.dll.
DLLのアドレステーブルは、ロード時に一度だけパッチされます。
DLLへのエントリポイントは、DLLを使用するすべてのプログラムで同じであることが保証されています。
同じDLLです。これによりランタイムフィックスアップが削除され、DLLがロードされると、そのコードは読み取り専用になります。
これにより、ある程度の(重要な?)パフォーマンス上の利点が得られますが、作業がはるかに困難になります。
開発者にとって、上記の方式ではDLLを他のアプリケーションに「リンク」することが不可能になるため、
のシンボル 。EXE ファイル。実際、異なる再配置を行うDLLが必要になる。
この DLL を使用する (さまざまな) 実行可能ファイルのテーブル。
しかし、動的にロードされるPerl拡張機能は、Perlのいくつかのシンボルを強制的に使用する必要がある。
実行可能ファイル、例えば関数の引数を見つける方法を知るには、引数は
Perlの内部評価スタックに、
インタープリタをDLLに変換し、 。EXE このDLLをメモリにロードするだけのファイルです
コマンド引数を提供します。拡張DLLは、以下のシンボルにリンクできません。 。EXEしかし、それは持っている
シンボルへのリンクは問題ありません 。Dllファイル.
この 大いに アプリケーションの読み込み時間(および
コンパイル)。インタープリタはDLL内にあるため、C RTLは基本的に
DLLも同様です(そうしないと拡張機能はCRTを使用できません)。
異なる種類のPerlを使用する場合の利点としては、 perl.exe パール__.exeファイル
同時に:彼らは記憶を共有している perl.dll.
注意DLLの無駄を増やすもう一つの要因は、DLLがロードされることです。
共有メモリ領域は、512MBの壁を考えると希少なリソースである。
「標準」OS/2仮想メモリ。 。EXE ファイルはすべての
特定の 。EXEしかし、それらは「プライベートアドレス空間で共有される」
プロセスの「アドレス」は、
。EXE ファイルがロードされるかどうかはコンパイル時に決定されるため、すべてのプロセスはこれらを持っている
同じアドレスにセクションがロードされ、内部リンクの修正は行われない 。EXE is
必要です。
DLLは実行時にロードされる可能性があるため、DLLに同じメカニズムを持たせるには、
アドレス範囲は どれか of ロードされました システム内のDLLが利用可能になる in を
ラボレーション 特定のDLLをまだロードしていないため、DLLは
共有メモリ領域。
Why キメラ 建てる?
現在のEMX環境では、Unix系の「a.out」形式でコンパイルされたDLLは
データ(または少なくとも一部のデータタイプ)のエクスポートシンボル。これにより「omf」スタイルのコンパイルが強制されます。
of perl.dll.
現在のEMX環境では 。EXE 「omf」形式でコンパイルされたファイルは フォーク().
フォーク() 正確には 3 つの Perl 操作が必要です。
· 明示的 フォーク() 脚本では、
· "オープンFH、"|-""
· 「open FH, "-|"」、つまり、自分自身へのパイプを開きます。
これらの手術は生死に関わる問題ではないが、多くの
便利なスクリプト。これにより、a.out形式のコンパイルが強制されます。 perl.exe.
ENVIRONMENT
ここではOS/2、DOS、Win*固有の環境変数、または
OS/2 では他の OS よりも重要です。
"PERLLIB_PREFIX"
EMXポート専用。次の形式になります。
パス1;パス2
or
パス1 パス2
あらかじめ構築されたパスの先頭が一致する場合 パス1は、次のように置き換えられます。 パス2.
Perlライブラリをデフォルトの場所から移動する場合に使用する必要があります。
"パー(5)LIB」は@INCに間違ったエントリを残さないためです。例えば、
コンパイルされたバージョンのperlは@INCを f:/perllib/libをインストールしたい場合
図書館 h:/opt/gnu、I
PERLLIB_PREFIX=f:/perllib/lib;h:/opt/gnu を設定します。
これにより、Perlはあらかじめ構築された@INCを使用して
f:/perllib/lib/5.00553/os2
f:/perllib/lib/5.00553
f:/perllib/lib/site_perl/5.00553/os2
f:/perllib/lib/site_perl/5.00553
.
次の @INC を使用します。
h:/opt/gnu/5.00553/os2
h:/opt/gnu/5.00553
h:/opt/gnu/site_perl/5.00553/os2
h:/opt/gnu/site_perl/5.00553
.
"PERL_BADLANG"
0の場合、perlは無視します setlocale() 失敗。奇妙なものには役立つかもしれない ローカルs.
"PERL_BADFREE"
0の場合、Perlは不当な場合に警告を出さない。 自由()古いPerlでは、これは
動的にリンクされたときにバグがあったDB_Fileモジュールと組み合わせて使用すると便利です。
OMF 製。
新しいPerlでは設定しないでください。一部の情報が隠れてしまう可能性があります。 リアル 問題は。
"PERL_SH_DIR"
EMXポートに特有のもの。場所のディレクトリ部分を指定します。 sh.exe.
"USE_PERL_FLOCK"
EMXポート専用。 群れ(3)はEMXに存在するが機能しない。
Perlによってエミュレートされます。エミュレーションを無効にするには、環境変数「USE_PERL_FLOCK=0」を設定してください。
「TMP」 or 「温度」
EMXポート専用。一時ファイルの保存場所として使用されます。
進化
ここでは、驚かれるかもしれない主な変更点をリストします。
テキストモード ファイルハンドル
バージョン 5.8 以降、Perl はテキスト モード ファイルに対して組み込みの翻訳レイヤーを使用します。
これは、効率の良い十分にテストされたEMXレイヤーを、最適なコードに置き換えます。
「クイックハック」として特徴付けられます。
バグの可能性や翻訳ポリシーの変更に追従できないことに加えて
TERMIO 翻訳のオン/オフスイッチを使用すると、重大な互換性のない変更が発生します。
sysread() テキストモードのファイルハンドルは翻訳層を通過していましたが、現在は
しないでしょう。
優先順位
「setpriority」と「getpriority」は、Andreas Kaiser による以前の移植版とは互換性がありません。
「setpriority、getpriority」を参照してください。
DLL 名 マングリング: プレ 5.6.2
リリース5.003_01では、動的ロード可能なライブラリは、
異なるバージョンのPerlがコンパイルされます。特に、DLL( perl.dll)は現在
チェックサムを含む名前で作成されるため、OS/2スキームの回避策が可能になります。
DLL をキャッシュします。
簡単な回避策をコーディングすることは可能かもしれない。
· 古い @INC を調べて古い DLL を見つけます。
· 新しい Perl のスキームに従って名前を変更し、DLL をこれらの名前にコピーします。
· DLLの内部の「LX」テーブルを編集して、名前の変更を反映させる(おそらく
Perl拡張DLLには内部的にコード化された名前は使用されない。
「特定の」 DLL ではなく、「グローバル」 DLL にのみ使用されます。
· 内部の「IMPORT」テーブルを編集し、「古い」テーブルの名前を変更します。 perl????.dll から
"新着" perl????.dll.
DLL 名 マングリング: 5.6.2 越えて
実際には DLLはOS/2の誤解により行われた
ダイナミックローディングモデル。OS/2 は (事実上) ロードされた DLL の XNUMX つの異なるテーブルを維持します。
グローバルDLL
「LIBPATH」から基本名によってロードされるもの(リンク時に関連付けられたものを含む)。
特定のDLL
フルネームでロードされます。
グローバルDLLの要求を解決する場合、既にロードされている特定のDLLのテーブルは
(事実上)無視されます。さらに、特定のDLLは 常に 規定のパスからロードされます。
このスキームを脆弱にする小さなひねりがあります。それは、ロードされたDLLをどうするかということです。
from
「BEGINLIBPATH」と「ENDLIBPATH」
(プロセスによって異なります)
. 「LIBPATH」から
which 効果的に プロセスによって異なります(ただし、「LIBPATH」はすべてのプロセスで同じです)
プロセス)。
「LIBPATHSTRICT」が「T」に設定されていない限り(そしてカーネルが2000/09/01以降の場合)、そのようなDLLは
グローバルとみなされます。グローバルDLLをロードする場合、まず以下のテーブルが参照されます。
既にロードされているグローバルDLL。そのため、1つの実行ファイルがDLLをロードしたという事実は、
「BEGINLIBPATH」と「ENDLIBPATH」から、または . 「LIBPATH」からの影響 which DLLがロードされました
を特定いたします。 別の 実行可能ファイルは同じ名前の DLL を要求します。 この の理由です
perl DLL の DLL 名のバージョン固有のマングリング。
Perl拡張DLLは常にフルパスでロードされるので、
バージョン固有の方法で名前を変更する:ディレクトリはすでに
対応するバージョンのperlと@INCは古いバージョンのperlとのバイナリ互換性を考慮します。
バージョン5.6.2以降、名前マングリングスキームはPerlと同じになるように修正されました。
5.005_53(一般的なバイナリリリースと同じ)。これにより、新しいPerlは 解決する
名 @INC がディレクトリの検索を許可している場合は、古い拡張 DLL も検索します。
しかし、それでもこれらのDLLがロードされることが保証されるわけではありません。その理由は、
名前の改ざん パール DLL拡張DLLはPerlとリンクしているので
DLL、古いバージョンの拡張DLLは古いPerl DLLをロードし、ほとんどの場合
おそらくセグメント違反です (この DLL 内のデータが適切に初期化されていないため)。
部分的な回避策があります(新しいOS/2カーネルで完了できます)。
Perlの旧バージョンのDLLと同じ名前の転送DLLで、
エントリポイントは新しいPerlのDLLを指しています。このDLLを(例えば)
新しいPerl実行ファイルの「BEGINLIBPATH」。新しい実行ファイルが古いPerlの
拡張DLLの場合、古いPerlのDLLを名前で要求し、代わりにフォワーダーを取得します。
これにより、現在実行中の (新しい) Perl DLL と効果的にリンクされます。
これは 2 つの方法で壊れる可能性があります:
· 新しい実行ファイルが実行中に古いPerl実行ファイルが起動され、
古い実行ファイル用にコンパイルされた拡張機能(うわっ!)。この場合、古い実行ファイルは
古いperl DLLの代わりにフォワーダーDLLを取得するので、新しいperlとリンクします。
DLL。直接的に致命的ではありませんが、新しい実行ファイルと同じように動作します。これは
古い実行ファイルを明示的に起動する目的。
· 新しい実行ファイルは、古いPerlが古い実行ファイル用にコンパイルされた拡張機能をロードします。
実行ファイルが実行中です。この場合、拡張機能はフォワーダーを取得しません -
致命的な結果を招きます。
「LIBPATHSTRICT」のサポートにより、DLLの1つが開始されない限り、これを回避できる可能性があります。
from . 「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' 初期化インスタンス終了インスタンス
説明 '@#[メール保護]:5.006001#@ 5.00553 用 Perl モジュール -> Perl 5.6.1 フォワーダー'
コードロードオンコール
データロードオンコール非共有複数
輸出
必要に応じてバージョン/名前を変更します。実行
perl -wnle "next if 0../EXPORTS/; print 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」は無視します)。
ねじ切り
リリース5.003_01以降、perlはマルチスレッドC RTL DLLにリンクされています。perl自体が
マルチスレッド対応でコンパイルされているので、Perlの malloc()ただし、拡張機能では
複数のスレッドは自己責任で行ってください。
これは、XFree86-OS/2 用の「Perl/Tk」をすぐにコンパイルし、DLL とリンクするために必要でした。
その他の便利なライブラリは、通常「-Zmt -Zcrtdll」でコンパイルされます。
コール 〜へ 外部 プログラム
多くの要望により、Perlの外部プログラム呼び出しがAndreasに対して変更されました。
カイザーの港。 If perlは外部プログラムを呼び出す必要がある 、 shell f:/bin/sh.exe
が呼び出されるか、またはオーバーライドされるものについては、「PERL_SH_DIR」を参照してください。
つまり、あなたはいくつかのコピーを入手する必要があるということです sh.exe (私はpdkshのものを使用しています)。
path F:/ binに 上記の値はビルド中に自動的に正しい値に設定されます。
ビルダーマシンですが、実行時にオーバーライドできます。
理由: 「perl5-porters」のコンセンサスは、perlはオーバーライドできないシェルをXNUMXつ使用すべきだというものでした。
プラットフォームごとに。OS/2の明らかな選択肢は cmd.exeを sh.exe. Perlビルド
それ自体は不可能だろう cmd.exeを シェルとして「sh.exe」を選択しました。
*nixのスクリプトとのほぼ100%の互換性を保証します。追加の利点として
pdksh の DOS 対応ポートを使用する場合、これは DOS でも同様に動作します (「前提条件」を参照)。
短所: 現在 sh.exe pdkshは外部プログラムを呼び出す フォーク()/exec(),
がある いいえ 機能します exec() OS/2 の場合。 exec() EMXは非同期呼び出しによってエミュレートされます
呼び出し元は子プロセスの完了を待機します (「pid」が変更されなかったと見なすため)。
これは、1 余分な のコピー sh.exe アクティブ化されるのは フォーク()/exec()につながる可能性があります
システムから一部のリソースが奪われる(追加の作業は考慮しないとしても)
フォーク()ing)。
これは、スポーンしない場合はそれほど問題にならないことに注意してください sh.exe 必要でない限り(メタ文字
見つかった)。
いつでも始められる cmd.exeを 明示的に
システム 'cmd'、'/c'、'mycmd'、'arg1'、'arg2'、...
使用する必要がある場合 cmd.exeを何千ものスクリプトを手動で編集したくない場合は、
p5-pで提案されている長期的な解決策は指令を持つことである
OS2::Cmd を使用します。
上書きされます システム(), exec()、"``"、および"open(,'...|')"。現在のPerlでは、
オーバーライドのみ システム(), readpipe() - 「``」の明示的なバージョン、そしておそらく exec()を選択します。
コードは1つの引数の呼び出しを システム() "CORE::system('cmd.exe', '/c',
シフト)"。
もし「OS2::Cmd」の動作するコードをお持ちでしたら、私に送ってください。
配布。そのようなモジュールは必要ないのでテストできません。
外部プログラムの呼び出しに関する現在の状況の詳細については、「
Perl での OS/2 (および DOS) プログラム」。いくつかの機能について説明します。
· 外部スクリプトはベース名で呼び出すことができます。Perlは同じ拡張子を試します。
処理するときのように -S コマンドラインスイッチ。
· "#!" または "extproc " で始まる外部スクリプトは、
最初の行の残りの部分に指定されたプログラムを呼び出して、シェルを呼び出します。
メモリ 配分
Perlは独自の malloc() OS/2では、インタープリタは通常、速度のためにmallocに依存しており、
しかし、Perlはmallocが非常に高速なので、そうではありません。Perlのメモリ使用量を調整したベンチマーク
PerlのmallocはEMXのmallocより5倍速いということを示す。説得力のあるデータはない。
メモリ使用量についてだが、(かなりランダムな)ベンチマークではPerlのメモリ使用量は5%であることが示された。
より良い。
Perlの組み合わせ malloc() DLLの名前解決が厳格すぎると特別な問題が発生する
戻り値が期待されるライブラリ関数では 自由()システムによってd 自由().
このような関数を呼び出す必要がある拡張機能を容易にするために、システムメモリ割り当て
関数は、接頭辞「emx_」を追加することで引き続き利用可能です。(現在、DLL perlのみが
これは、 perl_.exe まもなく。
スレッド
「-D usethreads」オプションを指定することで、スレッドサポートを有効にしたPerlをビルドすることができます。
構成現在、OS/2 のスレッド サポートはまだ初期段階です。
最も顕著な問題:
「条件付き待機」
競合状態が発生する可能性がある(ただし、OS/2 のエッジトリガーの性質により、競合状態は発生しない可能性が高い)
イベントセマフォ)。(待機スレッドの連鎖に関して再実装が必要、
リンク リストはスレッドごとの構造に格納されますか?)?)
os2.c
OS/2固有の関数で使用される静的変数がいくつかあります。(移動する必要があります
スレッドごとの構造にするか、シリアル化するか?
これらの問題は、実験を阻むものではないことに注意してください。
小規模なプログラムに影響を与える可能性。
onworks.net サービスを使用してオンラインで perlos2 を使用する