EMXRT.DOC(日本語訳)


===============================================================================
emxrt.doc    emx 0.9d FIX 03     USER'S GUIDE TO THE EMX RUNTIME    29-Apr-2000
===============================================================================
                                     Copyright (c) 1990-2000 by Eberhard Mattes

も く じ


1 はじめに

これは emx ランタイムパッケージのためのドキュメントです。 emx ランタイムは、386 CPU(もしくはそれ以降のもの)搭載マシンの OS/2 2.x と OS/2 3.x(OS/2 と略す)、そして MS-DOS と PC DOS(DOS と略す)のもとでの、32ビットプログラム実行環境です。

OS/2 では、以下のように入力し、本ドキュメントの .inf 版を見ることができます。

view \emx\book\emxrt

環境変数 BOOKSHELF に \emx\book を追加してあれば、以下のように入力することでオンラインブックを閲覧できます。

view emxrt

1.1 ハードウェア要件

emx は 80386 CPU(30886DX、80386SX、i486 もしくはそれ以降)を必用とします。

1.2 ランタイムパッケージに含まれるファイル

emx ランタイムパッケージは以下のファイルを含んでいます。

  \emx\bin\emx.exe              DOS 用の emx ランタイム
  \emx\bin\emxbind.exe          emx 用プログラム設定ツール (DOS, OS/2)
  \emx\bin\emxfpemu             数値演算プロセッサのエミュレータ (DOS)
  \emx\bin\emxl.exe             emx ローダ (emxbind が使用)
  \emx\bin\emxload.exe          OS/2 プログラムのメモリ常駐用サーバ
  \emx\bin\emxrev.cmd           emx リビジョン表示ツール (OS/2)
  \emx\bin\emxstack.exe         旧プログラムのスタックサイズ修正ツール
  \emx\bin\emxupd.exe           使用中 DLL の更新ツール
  \emx\bin\emxuzdll.cmd         emxpud を使い、DLL 展開およびインストールを行う
  \emx\book\emxrt.inf           あなたが読んでいるこのテキスト (VIEW 版)
  \emx\dll\emx.dll              OS/2 用の emx ランタイム
  \emx\dll\emxio.dll            OS/2 下での I/O ポートアクセスサポート
  \emx\dll\emxlibc.dll          emxlibcm.dll への転送 DLL (forwarder DLL)
  \emx\dll\emxlibcm.dll         マルチスレッド C ライブラリ (OS/2)
  \emx\dll\emxlibcs.dll         シングルスレッド C ライブラリ (OS/2)
  \emx\dll\emxwrap.dll          16-bit OS/2 ファンクションへのインターフェース
  \emx\doc\COPYING              GNU General Public License
  \emx\doc\COPYING.EMX          emx コピーライト情報
  \emx\doc\emxrt.doc            あなたが読んでいるこのテキスト (テキスト版)
  \emx\etc\termcap.dat          termcap を使うプログラムのための端末データベース
  \emx\etc\emclibcm.map         emxlibcm.dll のマップファイル
  \emx\etc\emclibcm.tdf         emxlibm.dll トレース定義ファイル
  \emx\etc\emclibcs.map         emxlibcs.dll のマップファイル
  \emx\etc\emclibcs.tdf         emxlibs.dll のトレース定義ファイル
  \emx\etc\trc00f8.tff          emxlibcs.dll のトレースフォーマットファイル
  \emx\etc\trc00f9.tff          emxlibcm.dll のトレースフォーマットファイル

.map、.tdf、.tff ファイルはデバッグ時に用います。 これらのファイルが emxrt.zip 内に収められているのは、DLL との整合性を保つためです。


2 ライセンス

(訳注:この部分は原文そのまま)

emx is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.

emx is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with emx; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

See \emx\doc\COPYING.EMX and \emx\doc\COPYING for details.

Please note that source code for parts of the contents of emxrt.zip is contained in emxfix03.zip.


3 ランタイムパッケージを OS/2 にインストールする

3.1 せっかちな OS/2 ユーザのための要約

  1. もし Siegfried Hanisch のスクリーンセーバを使っているなら、スクリーンセーバをバージョン 2.6 にアップグレードするか、禁止する
  2. LIBPATH に \emx\dll を追加 (いつでも DLL ファイルの最新コピーを使おう!)
  3. PATH に \emx\bin を追加
  4. 再起動

3.2 OS/2 ユーザのための詳しい手順

OS/2 バージョン 1.x、そして OS2 の DOS モードでは emx は動作しません。

config.sys を変更する前にバックアップコピーを取っておくこと!

0.9c 以上の emx は、Siegfried Hanisch のスクリーンセーバを破壊します。 0.9c 以上の emx をインストールする前に、スクリーンセーバをバージョン 2.6 にアップグレードするか禁止してください。 さもないとシステムがフリーズします。

OS/2 下では、emx ランタイムはダイナミックライブラリの集合体として実装されています。

emx.dll
emx 実行環境のサポート
emxio.dll
OS/2 下で emx プログラムにハードウェアポートをアクセスさせる
exlibc.dll
emxlibc.dll を使うアプリケーションのための、emxlibcm.dll への 転送 DLL(emxlibc.dll はかつて、emxlibcm.dll にリネームされている)
emxlibcm.dll
マルチスレッド C ライブラリ
emxlibcs.dll
シングルスレッド C ライブラリ
emxwrap.dll
16-bit OS/2 ファンクションのための、32-bit ラッパー (wrapper)

config.sys 中の LIBPATH ステートメントに記載されたディレクトリ中から、OS/2 はダイナミックリンクライブラリを探します。 LIBPATH が環境変数でないことに注意!

いつでもたいてい、単一のバージョンのダイナミックライブラリがロードされます。 LIBPATH ステートメントに記載されたディレクトリ中に、異なるバージョンのダイナミックリンクライブラリがある場合、先頭に記載されたディレクトリにあるものがロードされます。 すでに emx のダイナミックリンクライブラリがインストールされている場合、最終リビジョンのダイナミックリンクライブラリを使うように心がけてください。 以前の emx プログラムは新しい emx ダイナミックリンクライブラリで動作しますが(emxstack を当てる必用があるかもしれませんが)、新しい emx プログラムは古い emx ダイナミックリンクライブラリで動作しません。 インストール済の emx ダイナミックリンクライブラリについて調べるには、

cd \emx\bin
emxrev
と入力します。 もし emx のダイナミックリンクライブラリが何もインストールされていなければ、何も出力されません。 インストールされた emx ダイナミックライブラリがあれば、例えばこんな風に、名前とリビジョン番号が表示されます。
EMX : revision = 30
EMXIO : revision = 30
EMXLIBC : revision = 30
EMXLIBCM : revision = 30
EMXLIBCS : revision = 30
EMXWRAP : revision = 30

LIBPATH ステートメント中に記載されたディレクトリのみが検索されます。 もし C ドライブに emx ランタイムパッケージを置いているのであれば、以下のように入力して、そのパッケージのダイナミックリンクライブラリのリビジョン番号を調べます。

emxrev -d c:\emx\dll

emxrev 実行後、ダイナミックリンクライブラリを解放するため、

quit
と入力して、コマンドプロセッサを終了します(emxrev は REXX 手続きですので、ライブラリは cmd.exe によってロードされています)。 さもないと、それらのファイルをリネーム、上書き、削除できません。 あるプログラムによって emx ダイナミックリンクライブラリのひとつが使用中の場合、これと同じことが起こります。 もし emxrt.zip の展開時に、SYS0032 エラーメッセージ、もしくは
error: cannot create emx/dll/emx.dll
というメッセージを unzip から受け取ったら、
pstat /L
を使って、現在動作中のプログラムが使っているダイナミックリンクライブラリを調べてください。 emx.dll, emxio.dll, emxlibc.dll, emxlibcm.dll, emxlibcs.dll, emxwrap.dll を使っているすべてのプログラムを終了してください。
emxload -qw
で、emxload.exe によってメモリに常駐したプログラムがアンロードされます。

それでもだめなら、emxuzdll を使って emx の DLL をインストールします。 作業用ディレクトリを作成し、emxrt.zip のパス名と emx の DLL をインストールするディレクトリ名を与えた上で、作業用ディレクトリで emxuzdll をコマンドラインから実行します。

mkdir \emxtmp
chdir \emxtmp
emxuzdll a:\emxrt.zip c:\emx\dll
chdir ..
rmdir emxtmp

これで、DLL が使用中であっても、c:\emx\dll 中の DLL が emxrt.zip 中の DLL で置き換えられます。 DLL を参照する最後のプロセスが終了した直後、もしくは次回の再起動時に、新版の DLL が有効になります。 ですから、emxuzdll 実行後は再起動すべきで、そうしないと新版がいつ有効になるのかわかりません。 (本当のところ、作業用ディレクトリは必用ではなく、DLL がひとつもないディレクトリでなら大丈夫でしょう)

emx ダイナミックライブラリの最終リビジョン版(つまり、番号がいちばん大きいもの)を config.sys の LIBPATH ステートメントに記載されているディレクトリにコピーするか、できれば、LIBPATH ステートメントを変更して、emx ダイナミックリンクライブラリの最終リビジョン版が置いてあるディレクトリを入れてください。

LIBPATH ステートメントのディレクトリはセミコロンで区切られています。 LIBPATH ステートメントに c:\emx\dll を追加するため、config.sys の

LIBPATH=
で始まる行の終わりに――まだセミコロンがなければ――セミコロンをつけ足します。

そして、ディレクトリの絶対パスを入力します。 例:

LIBPATH=.;C:\OS2\DLL;C:\OS2\MDOS;C:\;C:\OS2\APPS\DLL;D:\EMX\DLL

なんでしたら、最後尾にセミコロンをつけることもできます。

次に、config.sys の

SET PATH=
で始まる行を変更して、\emx\bin ディレクトリを入れます。 たとえば、
SET PATH=C:\OS2;C:\OS2\SYSTEM;C:\OS2\MDOS\WINOS2;C:\OS2\INSTALL;C:\;C:\OS2\MDOS;C:\OS2\APPS
これを、このように変えます。
SET PATH=C:\OS2;C:\OS2\SYSTEM;C:\OS2\MDOS\WINOS2;C:\OS2\INSTALL;C:\;C:\OS2\MDOS;C:\OS2\APPS;D:\EMX\BIN

LIBPATH でのように、パス名ごとの間にセミコロンを置かねばならず、最後尾のセミコロンは任意です。 最後の2例が2行で表わされている点に注意してください。 config.sys 中では、しかしながら、正しい SET ステートメントは1行に収めなければなりません。 (訳注:原文のプレーンテキスト中では、上の2例がそれぞれ2行に分かち書きされていた)

オンライン文書を簡単に見るため、環境変数 BOOKSHELF に \emx\book を追加したくなるかもしれません。 たとえば、config.sys ファイルの

SET BOOKSHELF=C:\OS2\BOOK;
の行を以下のように変えます。
SET BOOKSHELF=C:\OS2\BOOK;D:\EMX\BOOK

PATH でのように、パス名ごとの間にはセミコロンを置かねばならず、最後尾のセミコロンは任意です。

それでは、再起動して config.sys の内容を有効にしましょう。 再起動後、

emxrev
を実行して emx の最新版が有効になっているか確認してください。

もし OS/2 が、

SYS1804: ファイル EMX が見つかりません
と言ってきた場合、config.sys の LIBPATH ステートメントが正しく設定されていません。 上記の内容をよく確認してください。

古いプログラム(スタックサイズが小さすぎる場合、emx.dll がスタックオブジェクトを作成すると仮定しているもの)の実行時、以下のようなエラーメッセージを受け取ります。

emx.dll: Stack size too small.  Run
  emxstack -f D:\BIN\PROGRAM.EXE
and try again.

エラーメッセージの指示通り emxstack を実行し、プログラムのスタックサイズを修正してください。 もし(ファイル書き込み権限がないので)それができない場合は、

set emxopt=-I
と入力し、emx.dll にこの問題を無視させます。 しかし、スタックサイズ不足により、プログラムはおそらくクラッシュします。 -I オプションの使用はおすすめいたしません!


4 ランタイムパッケージを DOS にインストールする

4.1 せっかちな DOS ユーザのための要約

  1. \emx\bin を PATH に追加するか、\emx\bin\emx.exe を指すように環境変数 EMX を設定
  2. もし DPMI を実装しているメモリマネージャを使っているなら、VCPI を有効にする
  3. config.sys から BREAK=ON を除去
  4. 再起動

4.2 DOS ユーザのための詳しい手順

DOS 版の emx プログラムには2種類あります。 別ファイルの emx.exe を読み込むものと、アプリケーションプログラムの実行ファイル中に一体化された emx ランタイムの emx.exe を持つものです。

config.sys と autoexec.bat 変更の前に、これらのファイルをバックアップコピーしておくこと!

emx.exe を読み込むプログラムを利用したい場合、emx.exe を環境変数 PATH に示されたディレクトリ内に置くか、(autoexec.bat 中の)環境変数 PATH を変更し、emx.exe のあるディレクトリを含めなければなりません。 仮に、autoexec.bat ファイルが

path c:\dos;d:\bin
という行を含み、emx ランタイムを D ドライブにインストールしてある場合、この行を以下のように変更します。
path c:\dos;d:\bin;d:\emx\bin

パス名の間にはセミコロンを置かねばなりません。

そのかわりに環境変数を設定し、実行ファイル emx.exe を直接指定することもできます。 この方法を使うと、プログラムはより迅速に emx.exe の位置を確定できます。 emx ランタイムを D ドライブにインストールした場合、autoexec.bat ファイルに以下の行を追加してください。

set emx=d:\emx\bin\emx.exe
中途半端なディレクトリ名にはご注意を――emx.exe の完全なファイル名を入力しなければなりません。

二番目の種類のプログラムは、emx.exe と一体化しており、環境変数 PATH に \emx\bin を追加したり、環境変数 EMX を設定したりする必要のないものです。 このプログラム自体は、しかしながら、autoexec.bat の変更を必用するかもしれません。 プログラム付属のドキュメントを見てください。 それら両方の種類のプログラムに必要とされるステップを以下に示します。

もし(QEMM、EMM386、386Max のような)メモリマネージャを使っていて、それが DPMI(DOS Protected Mode Interface)を実装している場合、emx は DPMI をサポートしていないので、そのメモリマネージャの設定を変更して VCPI を有効にしてください。 詳細はあなたのマシンのメモリ環境のドキュメントを見てください。 メモリマネージャが DPMI だけしかサポートしていない(VCPI も)場合、メモリマネージャを取り除くか無効化しておかねばなりません。 別の方法として rsx を使うことができますが、これは 6.3 章に示します。 emx は XMS と VCPI をサポートしています。

config.sys ファイルを確認しましょう。

BREAK=ON
もしこのような行があったなら、この行は emx ならびにその他の多くのプログラムでトラブルを引き起こすので、取り除いておくべきでしょう。

もし、ほんとうにもし、8088 ペースの PC で `Intel Inboard 386/PC' の拡張ボードをお使いになっていたら、autoexec.bat に以下の行を追加してください(このような拡張ボードを使っているというのは、ほとんど考えられないことですが)。

set emxopt=-m3

指定したディレクトリ、あるいは指定したドライブにスワップファイル(物理メモリを使い切ったとき、メモリページをディスクに待避するために使う)を置きたい場合は、autoexec.bat にて環境変数 EMXTMP を設定します。 例:

set emxtmp=c:\tmp

それでは、再起動して config.sys と autoexec.bat への変更を有効にしましょう。


5 環境変数(OS/2 および DOS)

いくつかの環境変数によって、emx および emx を使うプログラムの動作が制御されます。 以下のうちひとつ以上の環境変数を設定しなければならないこともあります。

INIT
termcap.dat 検索のために termcap が使う

TERM
端末型定義のために termcap が使う

EMXOPT
emx のオプション設定(下記参照)

EMXSHELL
環境変数 COMSPEC の置き換え。 emx プログラムから代替コマンドプロセッサ(シェル)を起動する場合に使う。

EMXPATH
プログラムの検索パス(ふつうはいらない)

PATH
プログラムの検索パス(EMXPATH での検索が失敗すると使われる)

TERMCAP
termcap.dat 検索のために termcap が使う

TZ
タイムゾーン選択

5.1 環境変数 TZ の設定

環境変数 TZ は、現地時間から協定世界時(UTC 別名グリニッジ平均時 GMT)を計算する方法を統括します。 (注記すると、Unix ではシステムクロックに UTC が用いられるので、UTC から現地時間への計算に TZ を使います。 OS/2 と DOS では、システムクロックに現地時間が用いられます)

TZ の内容は以下のような書式となります。

<TZ1>[<OFF>,[<TZ2>[,<SM>,<SW>,<SD>,<ST>,<EM>,<EW>,<ED>,<ET>,<SHIFT>]]]

<TZ1> は3文字の標準時名です。

<OFF> は UTC へのオフセット値で、正の値は本初子午線の西、負の値は本初子午線の東となります。 オフセット値は、時、時:分、もしくは時:分:秒で指定されます。 時、分、秒はコロンで区切ります。 <OFF> が指定されていない場合、オフセット値 0 が使われることになります(将来変わるかもしれません)。

<TZ2> は3文字の夏時間名です。 <TZ2> が指定されていない場合、夏時間は使われません。 <TZ2> が指定された場合は夏時間が使われ、TZ の残りの部分は、夏時間への変更および復帰の時期と方法を指定します。 <SM> から <ST> までは標準時間から夏時間へ切り替わる時期を現地時間で定め、<EM> から <ET> までは夏時間から標準時間へ切り替わる時期を現地時間で定めます。 (南半球では、夏時間終了日のほうが、開始日よりも前の日付になります)  <SHIFT> は時間をずらす秒数です。

<SM> は切替え月を(1 から 12 で)指定します。 <SW> は切替える週を指定し、これがゼロの場合、<SD> はその月の何日めかを指定します(1 から 31 で)。 <SW> が正(1 から 4)の場合、指定月の <SW>週目の <SD>曜日(0 = 日曜 から 6 = 土曜)に夏時間へ切り替わります。 最初の日曜日のある週が、その月の最初の週とみなされます。 <SW> が負(-1 から -4)の場合、指定月月末から数えて -<SW>週目(つまり、-1 はその月の最後の週を表わす)の <SD>曜日(0 = 日曜 から 6 = 土曜)に夏時間へ切り替わります。 最後の日曜日のある週が、その月の最後の週とみなされます。 <ST> は夏時間に切り替える時刻を秒数で指定します。 注意してほしいのは、<ST> が現地の標準時間で指定され、<ET> が現地の夏時間で指定されることです。 例を挙げます:

CET-1CED,3,-1,0,7200,10,-1,0,10800,3600

この例では、標準時名が CET、夏時間名が CED です。 夏時間は3月最後の日曜の午前 2:00 に始まり、10月最後の日曜の午前 3:00 に終わります。 夏時間のあいだ、時刻は1時間ずれます。

<TZ2> の後に文字が続かない場合、`,4,1,0,3600,10,-1,0,7200,3600' が使われることになり、4月の最初の土曜日の午前 1:00 から夏時間が始まり、10月最後の日曜の午前 2:00 に終わります。 夏時間のあいだ、時刻は1時間ずれます。

5.2 環境変数 (DOS)

EMX
emx.exe のパス名で、emx.exe の代わりにプログラムに結合された emxl.exe(emx ローダ)が使う。 emx.exe の読み込みの高速化、あるいは特定バージョンの emx.exe を読み込むために EMX を設定する

EMXTMP
スワップファイルのディレクトリ

TMP
EMXTMP が設定されていない場合に使われる


6 DOS での注意点

6.1 注意点の概略

6.2 緊急終了

もし emx 動作中にコンピュータがフリーズした場合、Ctrl-Break を1秒間に5回叩いてみてください。 DOS コール処理中で、Ctrl-Break 処理がブロックされていなければ、それで emx(および emx によって実行されたすべての emx プロセス) が終了します。 DOS コール処理中でブロックされている場合、DOS コールからの復帰後に emx が終了します。

6.3 emx の代わりに rsx を使う

rsx は DPMI 依存の DOS エクステンダで、emx とほぼ互換性があります。 さらに、rsx は浮動小数点エミュレータを内蔵しています。 rsx はフリーソフトウェアで、Rainer Schnittker によって書かれました。 これを書いている時点では、以下の anonymous ftp で rsx が入手可能です。

  ftp.uni-bielefeld.de: /pub/systems/msdos/misc/rsx510.zip
  ftp.leo.org:          /pub/comp/os/os2/leo/gnu/emx+gcc/contrib/rsx510.zip

emx ローダ emxl.exe が DPMI サーバを発見し、しかし VCPI サーバがない場合は、 emx.exe のかわりに rsx.exe を実行しようとします。 rsx.exe の位置指定には、環境変数 EMX のかわりに環境変数 RSX が使われます。

DPMI サーバと VCPI サーバが存在していても、emx.exe のかわりに rsx.exe をロードするには(たとえば rsx の浮動小数点エミュレーションが必要な場合)、rsx.exe を指すように環境変数 EMX を設定します。 rsx が DPMI サーバを必用とすることに注意してください。

(訳注:ここに書かれた rsx のバージョンはだいぶ古く、該当ファイルはもう存在しません。 rsx の最新版は RSXNT や RSXNTDJ のパッケージ中に含まれています。 Rainer Schnittker 氏のページ http://www.mathematik.uni-bielefeld.de/~rainer/ その他で公開されています)


7 emx のオプション

環境変数 EMXOPT を設定して、emx をカスタマイズできます。 この環境変数はコマンドラインオプションと同様のオプションリストを格納します。 オプションはすくなくともひとつの空白で区切らなければなりません。 例を挙げます:

set emxopt=-c -h40

7.1 emx のオプション (OS/2)

-c
シグナル、例外によって発生するコアダンプを禁止します。

-h#
OS/2 のファイルハンドル数上限を # に設定します。 # で示される数字は 10 から 65536 の間でなければなりません。

-n
例外発生時のポップアップを抑止します。 emx.dll がエラーメッセージを肩代わりしてコア (core) を吐くため、ポップアップは必須ではありません。

-q
すべてのコマンドライン引数を加工せずに子プロセスに引き渡します、つまり、オプション -q が有効なプロセスの子プロセスでは、ワイルドカード展開とレスポンスファイルが作動しません。

-r*
絶対パス名にドライブレター * を考慮させます。 / で始まるけれども // や /dev/、/pipe/ で始まらないパス名の場合、後ろにコロン (:) を続けた * が先頭につきます。 -rd が与えられた場合、ファイル名 \mydir\abc は d:\mydir\abc に変換されます。
注:このオプションは予期せぬ事態を招くことがあります。

-t*
ファイル名を 8.3 フォーマット(8文字+ドット+3文字の形式)に切りつめます。 ドット以前にある先頭からの8文字と、ドット以降にある先頭3文字を取り出して、パス名の各部分を 8.3 フォーマットに切りつめます。 最小限の変更でプログラムを FAT ファイルシステム上でコンパイルする場合、これは便利です。

(-t の後に)引数がなければ、-t は全ドライブと UNC パス名で切りつめを有効にします。

-t オプションには付加引数がつき、それは切りつめられるファイル名のあるドライブ名のリストです。 特別なドライブ名 '/' は UNC パス名を切りつめるかどうかを制御します。 たとえば、'-tc/' では、C ドライブと UNC のパス名が切りつめられます。

-t オプションの引数が `-' の場合、全ドライブと UNC パス名で切りつめが禁止されます。 これがデフォルト設定です。 引数が `-' で始まる場合、書かれたすべてのドライブで切りつめが禁止されます。 たとえば、'-t -t-d' では、D ドライブを除いた全ドライブのファイル名と UNC パス名が切りつめられます。

-x
コマンドライン引数の受け渡しに `MKS Korn shell' の手法が使われた場合、ワイルドカード展開とレスポンスファイルを抑止します。

-E
デバッガと同じセッション(ウィンドウ)で、デバッグ対象プログラム (debuggee) を実行します。

-I
スタックサイズが小さすぎるプログラムに対しても特に何も言いません。 オプション -I がなければ、こういったプログラムに emx.dll はエラーメッセージを表示し、emxstack を使ってスタックサイズを修正する方法を教えます。 オプション -I があると、この問題にもかまわずプログラムは実行されます。 しかし、スタックサイズ不足のためにプログラムはおそらくクラッシュします。 -I オプションの使用はおすすめいたしません!

-K
DosKillThread を使用しません。 OS/2 のバグのため、DosKillThread は問題を引き起こしがちです。 emx.dll は、バージョン 2.1 もしくはそれ以前の OS/2 の DosKillThread を自動的に回避します。 OS/2 2.11 およびそれ以降では、オプション -K を使って DosKillThread の使用を禁止することができます。 今のところ、DosKillThread は emx.dll で使われておらず、本オプションは何ら効力を持ちません。

7.2 emx のオプション (DOS)

-c
シグナル、例外によって発生するコアダンプを禁止します。

-d
拡張メモリを使用しません。

-e
標準エラーハンドル (2) を標準出力 (1) にリダイレクトします。

-h#
DOS のファイルハンドル数上限を # に設定します。 # で示される数字は 10 から 65536 の間でなければなりません。 バージョン 3.30 より前の DOS では、本オプションは無視されます。 本オプションは emx のプロセス単位ファイル数の上限を変更しません――上限はいつでも 40 です。

-m1
富士通 FM-R70 で動作します(未実装)。

-m2
NEC PC-98x1 で動作します(未実装)。

-m3
Intel Inboard 386/PC で動作します。

-o
例外のレジスタダンプを標準出力に送信します。 -o がなければ、レジスタダンプは CON デバイスに送信されます。 レジスタダンプをファイルにリダイレクトするには -o が必用です。

現在の emx はレジスタダンプのかわりにコアダンプファイルを(core という名前で)作成します。 そのプログラムの作者がデバッグに必用とする場合に備えて、そのファイルを残しておいてください。

-q
すべてのコマンドライン引数を加工せずに子プロセスに引き渡します、つまり、オプション -q が有効なプロセスの子プロセスでは、ワイルドカード展開とレスポンスファイルが作動しません。

-r*
絶対パス名にドライブレター * を考慮させます。 / で始まるけれども // や /dev/、/pipe/ で始まらないパス名の場合、後ろにコロン (:) を続けた * が先頭につきます。 -rd が与えられた場合、ファイル名 \mydir\abc は d:\mydir\abc に変換されます。
注:このオプションは予期せぬ事態を招くことがあります。

-t*
ファイル名を 8.3 フォーマット(8文字+ドット+3文字の形式)に切りつめます。 ドット以前にある先頭からの8文字と、ドット以降にある先頭3文字を取り出して、パス名の各部分を 8.3 フォーマットに切りつめます。 最小限の変更でプログラムを FAT ファイルシステム上でコンパイルする場合、これは便利です。

(-t の後に)引数がなければ、-t は全ドライブと UNC パス名で切りつめを有効にします。

-t オプションには付加引数がつき、それは切りつめられるファイル名のあるドライブ名のリストです。 特別なドライブ名 '/' は UNC パス名を切りつめるかどうかを制御します。 たとえば、'-tc/' では、C ドライブと UNC のパス名が切りつめられます。

-t オプションの引数が `-' の場合、全ドライブと UNC パス名で切りつめが禁止されます。 これがデフォルト設定です。 引数が `-' で始まる場合、書かれたすべてのドライブで切りつめが禁止されます。 たとえば、'-t -t-d' では、D ドライブを除いた全ドライブのファイル名と UNC パス名が切りつめられます。

-E
387 コプロセッサ(浮動小数点演算ユニット)をチェックしません。 コプロセッサは存在しないとみなします。

-O
XMS のバージョンチェックを無視します。 デフォルトでは、emx は XMS 仕様のバージョン番号が 2.00 以上か、そして XMS ドライバのリビジョン番号が 2.06 以上かをチェックしますが、これはそれより古い himem.sys が正しく動作しないためです。 オプション -O(リビジョンの番号付けが himem.sys と異なるドライバのためのもの)でこのチェックを回避できますが、いずれにせよ、emx はその XMS ドライバで動かないかもしれません。 実のところ、himem.sys 2.05 で emx はテストされていません。 2.04 ではうまくいかず、2.06 では動作します。

-V
emx のバージョンを表示します。 プログラム起動時、emx のバージョンが表示されます。

-X
XMS メモリの使用を禁止します。 VCPI での XMS メモリ使用は emx の新機能です。 これが不具合の原因になる場合は、オプション -X を使用します。


8 emxstack

emxstack はスタックサイズの表示と修正のために使用されます。 スタックサイズが小さすぎる場合に emx.dll がスタックオブジェクトを確保することを、昔のプログラムでは想定しています。 emx.dll はもうそのようなことを行わないので、そういったプログラムのスタックサイズを修正しなければなりません。

emxstack <コマンド> [<オプション>] <ファイル>...

使用可能なコマンドは以下の通りです:

-c
スタックサイズを修正すべきか調べる。 各ファイルごとに、スタックサイズが小さすぎる場合はメッセージが表示される。 スタックサイズが十分大きい場合、メッセージは何も表示されない。

-d
スタックサイズを表示する。 各ファイルごとに、キロバイト単位のスタックサイズが表示される。

-f
スタックサイズを修正する。 各ファイルごとに、スタックサイズが小さすぎれば修正される。

-s<size>
スタックサイズを設定する。 それぞれのファイルで、スタックサイズが <size> キロバイトに設定される。

-u<size>
スタックサイズを更新する。 それぞれのファイルで、スタックサイズが <size> キロバイト未満の場合、<size> キロバイトに設定される。 スタックサイズが <size> キロバイト未満ではない場合、スタックサイズは変更されない。

使用可能なオプションは以下の通りです:

-p
PATH 中の全ファイルを対象にする。 環境変数 PATH に書かれたディレクトリ中の各ファイルにコマンドが受け付けられる。 コマンドラインにファイル名を指定してはならない。

-q
寡黙になる。 メッセージは何も表示されない。 しかし、エラーメッセージは抑止されない。

-v
口数が多くなる。 追加メッセージを表示する。

例:

emxstack -f *.exe


9 emxupd

現在使用中の DLL を、emxupd で入れ替え(および削除)できます。 (EXE ファイルに対しても)  その DLL を現在使っているすべてのアプリケーションが終了するまで、古いバージョンの DLL はそれを使うプログラムによって使用状態に置かれ、メモリ内にとどまります。 そして終了後、新しい DLL が使われるようになります。 新しい DLL には再起動することでも切り替わります。

9.1 DLL を入れ替える

DLL を入れ替えるには、以下のように入力します。

emxupd <元ファイル> <出力パス>

このコマンドで、<元ファイル> を <出力パス> のディレクトリに(もしくはそのファイル名で)コピーします。 例:

emxupd c:\tmp\emx.dll c:\emx\dll
このコマンドでは c:\tmp\emx.dll を c:\emx\dll\emx.dll にコピーします。
(訳注:この説明は、C ドライブに \emx\dll というディレクトリがあることを仮定している。もし c:\emx\dll というディレクトリが存在しない場合、c:\tmp\emx.dll は c:\emx ディレクトリ上に dll という名前でコピーされる)
emxupd abc.dll d:\dll\new.dll
このコマンドでは abc.dll を d:\dll\new.dll にコピーします。

9.2 DLL を削除する

DLL を削除するには、以下のように入力します。

emxupd -d <削除ファイル>
<削除ファイル> は、削除する DLL のパス名です。

9.3 emxupd を使って ZIP ファイルから DLL を展開し、インストールする

ZIP ファイル中の全 DLL を展開し、DLL が使用中でも emxpud で入れ替えつつ、単一のディレクトリにインストールするには、以下のように入力します。

emxuzdll <ZIPファイル> <DLLディレクトリ>
<ZIPファイル> は DLL 展開元の ZIP ファイルのパス名で、<DLLディレクトリ> は ZIP ファイルの 全 DLL を置くディレクトリです。 emxuzdll を使えるのは、カレントディレクトリに DLL ファイルがひとつもない場合だけです。


10 困ったときは

この章では、emx ランタイムにかかわる、ありがちな不具合の解決法を示します。

10.1 警告メッセージ `WARNING: emx 0.9d or later required'

このメッセージが出た場合、現行バージョン以前の emx.dll が動作状態になっています。 emx.dll の最新版が config.sys の LIBPATH ステートメントで指定されたディレクトリにあるか、確認してください。 c:\config.sys の LIBPATH ステートメントで検索できる範囲にあるすべての emx ダイナミックリンクライブラリを表示するには、

emxrev -p c:\config.sys
を使います(c: のかわりに、起動ドライブのドライブレターを当てはめます)。 話を簡単にするなら、各 DLL を同一のバージョンにしておくべきでしょう。 古いプログラムは新しい emx の DLL で動作しますが、逆はそうでもありません。

10.2 unzip.exe が `cannot create emx/dll/emx.dll' と言ってきた

emx.dll を使うプログラムの動作中、emxrt.zip を展開しようとした時にこうなります。 emx.dll を使用するすべてのプログラムを終了し、もう一度やってみてください。 emxrev を実行した場合、コマンドインタプリタが終了するまで emx.dll はロードされたままになります。 したがって、emxrev を実行したすべての OS/2 ウィンドウセッションと OS/2 全画面セッションを閉じるべきでしょう。 emxlibcm.dll その他でもまったく同じことが起こります。

10.3 emx.dll が削除もリネームも上書きもできない

上記不具合を参照。

10.4 エラーメッセージ `SYS1804: ファイル EMX が見つかりません (The system cannot find the file EMX.)'

config.sys の LIBPATH ステートメントを正しく設定しておらず、そのため emx.dll が見つけられないのです。

10.5 エラーメッセージ `rsx not found, DPMI not supported by emx'

emx の現行バージョンは DPMI を使えません。 そこでローダは rsx をそのかわりに使おうとしますが、rsx が見つかりませんでした。
対策:rsx をインストールする、もしくは DPMI サーバ(MS Windows)と手を切る。

10.6 エラーメッセージ `emx.dll: Stack size too small...'

旧式のプログラム(スタックサイズが小さすぎる場合、emx.dll がスタックオブジェクトを作成すると仮定しているもの)を実行しようとしました。

エラーメッセージの指示通り emxstack を実行し、プログラムのスタックサイズを修正してください。 それができない(ファイルへの書き込み権限がないので)場合は、

set emxopt=-I
と入力し、emx.dll に不具合を無視させます。 しかし、スタックサイズ不足により、プログラムはおそらくクラッシュします。 -I オプションの使用はおすすめいたしません!

10.7 DOS のメッセージ 「セクタが見つかりません」 (`Sector not found')

ファイルを二重にオープンした場合(おそらく読み込みオープン1回、書き込みオープン1回)、DOS がそんなメッセージを表示するようです。 たとえば、gcc が作業ファイルを使い切ったときに、このようなことが起こります。 cca00002、ccz00002 といった名前(数字は違うかも)のファイルを作業用ディレクトリから探して、消去してください。


11 emx の出力メッセージ

11.1 emx の出力メッセージ (OS/2)

core dumped
致命的なエラー(例外 exception)により、プログラムが続行できない。 プログラムのメモリイメージが `core' という名前のファイルに書き込まれる。 そのプログラムの作者がデバッグに必用とする場合に備えて、そのファイルを残しておいてください。

emx.dll: Stack size too small...
旧式のプログラム(スタックサイズが小さすぎる場合、emx.dll がスタックオブジェクトを作成すると仮定しているもの)を実行しようとした。 emxstack を実行し、スタックサイズを修正せよ。

Invalid option in EMXOPT
環境変数 EMXOPT に書かれたオプションが、emx に理解できない。

Invalid syscall function code
emx によって実行されたプログラムが、有効でないシステム機能を呼び出した。 いちばんありがちなのは、もう古くなった emx.dll を使っている場合。

WARNING: emx 0.9d or later required
プログラムが emx.dll 0.9d もしくはそれ以降を要求する。 しかしそれより古いバージョンの emx.dll が動作している。 config.sys の LIBPATH ステートメントで指定されたディレクトリに emx.dll の最新版があるか確認すること。 c:\config.sys の LIBPATH ステートメントで検索できる範囲にあるすべての emx ダイナミックリンクライブラリを表示するには、
emxrev -p c:\config.sys
を使う(c: のかわりに、起動ドライブのドライブレターを当てはめる)。 話を簡単にするなら、各 DLL を同一のバージョンにしておくべきである。 古いプログラムは新しい emx の DLL で動作するが、その逆はそうとも限らない。

11.2 emx の出力メッセージ (DOS)

Abnormal program termination
プログラムが SIGABRT シグナルを受け取った。 abort() 関数が呼び出された、もしくは SIGABRT シグナルが送出された。

Bad environment
環境セグメント中からプログラム自身の名前が見つけられなかった、もしくは環境セグメントが 32768 バイトを越えている。 実際には発生しないはず。

Cannot create swap file
スワップファイルが作れなかった。
対策:環境変数 EMXTMP(もしくは TMP)で指定したディレクトリにスワップファイルが作れるか確認する。 EMXTMP と TMP が設定されていない場合、emx はカレントドライブのルートディレクトリにスワップファイルを作成する。

Cannot enable A20
emx は A20 アドレスラインを有効にしようとして失敗した。
対策:作者に報告を。

Cannot enable A20 via XMS
emx は XMS ドライバを呼び出して A20 アドレスラインを有効にしようとした。 不幸にして A20 は有効化できなかった。
対策:知らん。 (訳注:原文は unknown。「不明」というより「知らん」という感じなので。ほんとかよ)

Cannot open program file
emx のコマンドライン引数として与えられたプログラムファイルが見つけられなかった、もしくは開けなかった。
対策:正しいファイル名を入力せよ。 (emxl.exe や emx.exe を結合化したプログラムでは、これは出ないはず)

Cannot read program file
プログラムファイル読み込みの途中でエラーが発生した。
対策:emx のコマンドライン引数として与えられたプログラムファイルを確認(emxl.exe や emx.exe を結合化したプログラムでは無関係)。 おそらく何か別のプログラムがそのファイルにアクセスしている。

core dumped
致命的なエラー(例外 exception)により、プログラムが続行できない。 プログラムのメモリイメージが `core' という名前のファイルに書き込まれる。 そのプログラムの作者がデバッグに必用とする場合に備えて、そのファイルを残しておいてください。

DPMI not supported
emx の現行バージョンは DPMI を使えない。 たぶんいつか将来のバージョンでは使えるだろう。
対策:DPMI サーバ(MS Windows)と手を切るか、rsx を使う。

emx not found
emx ローダ (emxl.exe) が emx.exe の探索に失敗した。 環境変数 PATH に書かれたディレクトリ中に emx.exe があるか確認すること。 でなければ、環境変数 EMX に emx.exe の完全なパス名を設定するのでもよい。

Exception ...
emx によって実行されたプログラムが、emx もしくはプロセッサにとって何か不正とみなされることを行おうとした。
対策:プログラムの配布元に報告を。

Illegal moucall function
emx によって実行されたプログラムが、有効でないシステム機能を呼び出した。
対策:プログラムの配布元に報告を。

Illegal syscall function
emx によって実行されたプログラムが、有効でないシステム機能を呼び出した。
対策:プログラムの配布元に報告を。

Illegal viocall function
emx によって実行されたプログラムが、有効でないシステム機能を呼び出した。
対策:プログラムの配布元に報告を。

Invalid arguments for DOS function xx
emx によって実行されたプログラムが、システムファンクションにとって有効でない引数を使っていた。
対策:プログラムの配布元に報告を。

Invalid emx option
EMXOPT の中、もしくは emxbind によって設定されたオプションが emx に理解できない。
対策:EMXOPT のチェック。 emxbind -i を用いて、emxbind によって設定されたオプションを表示。

Invalid program file
emx のコマンドライン引数として与えられた(もしくは結合された)プログラムファイルが壊れている。
対策:プログラムをディスケットからもう一度コピーする。 これでもお手上げなら、プログラム配布元に連絡をとるしかないだろう。

Invalid special function code: xx
emx によって実行されたプログラムが、有効でないシステム機能を呼び出した。
対策:プログラムの配布元に報告を。

Linear address space exhausted
emx によって実行されたプログラムが、あまりに大量のメモリを使っている。
対策:作者に文句を。

Nonmaskable interrupt (NMI) at xxxx:yyyyyyyy
ノンマスカブル割り込みが発生した。 おそらくメモリエラーが原因。
対策:もし DESQView を使っているなら、保護レベル (protection level) を 0 にするか、QEMM-386 の WATCHDOG=0 オプションを使う。 そうでなければ、メモリテストプログラムを実行せよ。

Out of memory
emx 実行に十分なメモリがない。
対策:ドライバ、あるいは(それと同時に)常駐プログラムをいくつか除去する。 もしくはマシンにメモリを追加。

Out of stacks
emx が自前のスタックを使い切った。
対策:作者に文句を。

Out of memory or swap space
ディスクがいっぱいなので、emx がスワップファイルに書き込めない。
対策:スワップファイルを置くドライブに十分な容量があるか確認する。 スワップファイルの作成位置を emx に知らせるには、環境変数 EMXTMP(あるいは TMP)を使う。 EMXTMP も TMP も設定されていない場合、emx はカレントドライブのルートディレクトリにスワップファイルを作成する。

Out of swap space
ディスクがいっぱいなので、emx がスワップファイルに書き込めない。
対策:スワップファイルを置くドライブに十分な容量があるか確認する。 スワップファイルの作成位置を emx に知らせるには、環境変数 EMXTMP(あるいは TMP)を使う。 EMXTMP も TMP も設定されていない場合、emx はカレントドライブのルートディレクトリにスワップファイルを作成する。

Process terminated by SIGINT
Ctrl-C もしくは Ctrl-Break を叩いて、プログラムを停止させた。

Process terminated by SIG...
シグナルもしくは例外が原因でプログラムが停止された。 ふつう、プログラム中での致命的エラーを示す。

Program aborted
致命的エラー発生後、「中断(A) Abort」を選んでプログラムを中断した。

rsx not found, DPMI not supported by emx
emx の現行バージョンは DPMI を使えない。 そこでローダは rsx をそのかわりに使おうとしたが、rsx を発見できなかった。
対策:rsx をインストールする、もしくは DPMI サーバ(MS Windows)と手を切る。

Swap file I/O error
emx がスワップファイルを読み書きできなかった。

This program does not run in DOS mode of OS/2
OS/2 の DOS エミュレーションは emx をサポートしない。
対策:DOS をブートするか、OS/2 ウィンドウ上でプログラムを実行する。

This program requires an 80386 CPU
emx の実行には 30386DX、80386SX、i486、もしくはそれ以降の CPU が必用である。
対策:別のコンピュータを入手せよ。

This program requires DOS 3.0 or later
emx をアプリケーションプログラムと結合してひとつの実行ファイルにしてある場合、実行には DOS 3.0 以上が必須とされる。

Too many processes
emx はプロセスを4つまでサポートする。 5つ以上のプロセスを起動しようとした。

Unexpected interrupt
これは起こり得ない。
対策:作者に報告を。

Unsupported VDISK.SYS version
使っている vdisk.sys を emx がサポートしない。
対策:VDISK.SYS を除去するか違うバージョンを使う。 vdisk.sys 3.3 もしくはそれ以降で emx は動作するはずである。

Unsupported XMS version
emx は himem.sys 2.06 以上を要求する(これより古いバージョンはかなり buggy)。
対策:新しい himem.sys を入手する。 himem.sys を使っていない場合は、emx のオプション -O を用い、動いたかどうかを作者に教えられたし。

Unusable interrupt vector mappings set by VCPI server
VCPI サーバ(EMS ドライバ)の設定が不正。
対策:EMS ドライバのマニュアルを読んでね。

Use emxbind
emxl.exe を実行してみたが、それは何もしなかった。 emxbind で実行ファイルと結合されるように、emxl.exe は設計されている。

Virtual mode not supported without VCPI
CPU が仮想 86 モードの場合、emx の実行には VCPI サーバが必須である。 VCPI をサポートしていない EMS ドライバ(EMS エミュレータ)を使っている場合、もしくは EMS を禁止してある場合にこのメッセージを受け取ることになる。
対策:EMS ドライバを除去する、もしくは VCPI をサポートする EMS ドライバを使う、あるいは EMS を禁止していた場合は許可する(たとえば EMS ドライバのコマンドラインからキーワード NOEMS を取り除く)。

Wrong emx version
コンパイルされたプログラムのバージョンと emx.exe のバージョンが一致しない。
対策:プログラムについてくる emx.exe のコピーを使う。 それぞれ異なるバージョンの emx.exe を要求する複数のプログラムを使っている場合、デフォルトと異なるバージョンの emx.exe を要求するプログラムを実行する前に、環境変数 EMX をしかるべきバージョンの emx.exe のパス名に設定すること。 emxbind -u を使って、emx.exe のしかるべきバージョンを実行ファイルに埋め込むこともできる。


12 すべての emx パッケージを手に入れるには

以下の anonymous ftp で emx が入手可能です。


  ftp.leo.org:          /pub/comp/os/os2/leo/gnu/emx+gcc/
  ftp-os2.cdrom.com:    /pub/os2/emx09d/
  ftp-os2.nmsu.edu:     /pub/os2/dev/emx/v0.9d/


13 emx の作者

emx の作者は、


    Eberhard Mattes
    Teckstrasse 81                                      (TeX: Teckstra\ss e)
    D-71696 Moeglingen                                  (TeX: M\"oglingen)
    Germany

Internet E-Mail:

    mattes@azu.informatik.uni-stuttgart.de  (変わるかも)
    mattes@windhager.de

どうか電話はかけてこないでください!  ここで言っておかねばなりませんが、返信住所を書いた封筒と返信郵便料金(ドイツ国外なら国際返信切手)を同封していない場合、手紙には返事を出しません。
(訳注:international postal reply coupon に相当するものが日本でどうなっているのかはよく知りません。気になる人は郵便局で調べてみましょう)


Copyright (c) 1990-2000 by Eberhard Mattes