diff --git a/ja/man/man1/cpio.1 b/ja/man/man1/cpio.1 index 1fb6821fb4..d563c9c0f3 100644 --- a/ja/man/man1/cpio.1 +++ b/ja/man/man1/cpio.1 @@ -1,361 +1,361 @@ .TH CPIO 1L \" -*- nroff -*- .\" jpman %Id: cpio.1,v 1.2 1997/05/22 04:01:20 bobson Stab % .SH 名称 cpio \- アーカイブファイルへのファイルのコピーや、アーカイブファイルからファイルへのコピーをおこなう .SH 書式 .B cpio {\-o|\-\-create} [\-0acvABLV] [\-C bytes] [\-H format] [\-M message] [\-O [[user@]host:]archive] [\-F [[user@]host:]archive] [\-\-file=[[user@]host:]archive] [\-\-format=format] [\-\-message=message] [\-\-null] [\-\-reset-access-time] [\-\-verbose] [\-\-dot] [\-\-append] [\-\-block-size=blocks] [\-\-dereference] [\-\-io-size=bytes] [\-\-quiet] [\-\-force\-local] [\-\-help] [\-\-version] < name-list [> archive] .B cpio {\-i|\-\-extract} [\-bcdfmnrtsuvBSV] [\-C bytes] [\-E file] [\-H format] [\-M message] [\-R [user][:.][group]] [\-I [[user@]host:]archive] [\-F [[user@]host:]archive] [\-\-file=[[user@]host:]archive] [\-\-make-directories] [\-\-nonmatching] [\-\-preserve-modification-time] [\-\-numeric-uid-gid] [\-\-rename] [\-\-list] [\-\-swap-bytes] [\-\-swap] [\-\-dot] [\-\-unconditional] [\-\-verbose] [\-\-block-size=blocks] [\-\-swap-halfwords] [\-\-io-size=bytes] [\-\-pattern-file=file] [\-\-format=format] [\-\-owner=[user][:.][group]] [\-\-no-preserve-owner] [\-\-message=message] [\-\-force\-local] [\-\-no\-absolute\-filenames] [\-\-sparse] [\-\-only\-verify\-crc] [\-\-quiet] [\-\-help] [\-\-version] [pattern...] [< archive] .B cpio {\-p|\-\-pass-through} [\-0adlmuvLV] [\-R [user][:.][group]] [\-\-null] [\-\-reset-access-time] [\-\-make-directories] [\-\-link] [\-\-quiet] [\-\-preserve-modification-time] [\-\-unconditional] [\-\-verbose] [\-\-dot] [\-\-dereference] [\-\-owner=[user][:.][group]] [\-\-no-preserve-owner] [\-\-sparse] [\-\-help] [\-\-version] destination-directory < name-list .SH 解説 このマニュアルは、GNU 版の .BR cpio について説明します。 .B cpio は、cpio 形式もしくは tar 形式のアーカイブファイルに格納されたファイルを 取り出したり、その逆を行なったりします。アーカイブファイルとは、格納される ファイルそのものに加え、それら個々のファイルについてのファイル名や所有者、 タイムスタンプ、アクセス権限のような情報を含むようなファイルです。 アーカイブファイルは、ディスク上のファイルでも、 磁気テープ上に格納してあるファイルでも、もしくはパイプであっても構いません。 .B cpio は、3つの操作モードを持っています。 .PP コピーアウトモードでは、 .B cpio はファイルをアーカイブファイルにコピーします。cpio は、標準入力から ファイル名のリストを1行ずつ読み込み、標準出力にそのファイルのアーカイブを 書き出します。ファイルリストの作成には、 .B find コマンドが多く使われます。 .B find コマンドでは、\-d オプションを付加して、ディレクトリの属性によって 読み込み不可であったり、検索が出来なかったりする問題を最小限に抑えるように して下さい。 .PP コピーインモードでは、 .B cpio はファイルをアーカイブファイルからファイルを(取り出して)コピーしたり、 アーカイブの内容のリストを表示したりします。 cpioは、アーカイブを標準入力から読み込みます。オプションでない コマンドラインの引数は、すべてシェルによって展開される文字列として 解釈されます。これにより、アーカイブ内のファイル名が、この文字列によって 指定されるパターンにマッチするファイルのみを展開することができます。 また、シェルでの解釈とは違い、ファイル名の先頭に`.'を含むファイル名は、 取り出すファイルとして指定したパターンの最初にワイルドカードを含む場合、 パターンが一致します。また、ファイル名に `/'を含むファイル名も ワイルドカードによって一致します。パターンが指定されない場合には、 全てのファイルが展開対象となります。 .PP コピーパスモードでは、 .B cpio はファイルをあるディレクトリから別のディレクトリにコピーします。実際には、 アーカイブファイルを用いないで、コピーアウトモードとコピーインモードを 組み合わせて実行するような形になります。cpio は、コピーするファイルリストを 標準入力から読み込みます。これらのファイルのコピー先のディレクトリについては、 オプション以外の引数で与えられます。 .PP .B cpio は、 binary, old ASCII, new ASCII, crc, HPUX binary, HPUX old ASCII, old tar, POSIX.1 tar の各形式のアーカイブフォーマットをサポートします。 binary フォーマットは、異なるマシンアーキテクチャ間では互換性のない方法で、 ファイルの情報をエンコードするので、ほとんど使われません (つまり、binary フォーマットは、異なるマシンアーキテクチャ間で、 互換性のないアーカイブを生成するので、あまり使われないということです)。 old ASCII フォーマットは、異なるマシンアーキテクチャの間での互換性は 保たれますが、65536 個を超える i-nodes を備えるシステムで使われることを 想定してません。 new ASCII フォーマットは、異なるマシンアーキテクチャの間でのアーカイブの 互換性は保たれます。old ASCII フォーマットのように、ファイルシステムの サイズの制限はありませんが、全てのバージョンの .BR cpio でこの形式をサポートするわけではありません。現状でこのフォーマットを サポートする cpio は、GNU cpio と、Unix System V R4 の cpio のみです。 crcフォーマットは、new ASCIIフォーマットと似てますが、アーカイブ作成時に .B cpio が各ファイルについてチェックサムを計算し、アーカイブ内に含めるところが 異なります。このチェックサムは、アーカイブからファイルを取り出す時の ベリファイに使用されます。 HPUX フォーマットは、デバイスファイルを格納する形式が他の cpio と異なる HPUX の cpio 形式との互換性を持たせるために存在します。 .PP tarフォーマットは、 .B tar との互換性を持たせるために存在します。tar フォーマットでは、アーカイブされる ファイル名としては、100 文字を超えるものは使えません。また、 スペシャルファイル(ブロックデバイスややキャラクタデバイス)をアーカイブする こともできません。 POSIX.1 tar フォーマットは、アーカイブされるファイル名としては、255 文字を 超えるものは使えません。(ちょうどその場所に、"/"が含まれる場合は除きます)。 .PP デフォルトでは、 .B cpio は古い .B cpio との互換性を保つためにバイナリフォーマットアーカイブを作成します。 アーカイブを展開する場合には、 .B cpio は自動的に読み込まれたアーカイブの種類を認識するので、異なるバイトオーダの マシンで作成されたアーカイブを読むことができます。 .PP .B cpio のオプションには、操作モードを指定するものもあります。 どのオプションがどのモードに対応するかについては、 書式のセクションを見て下さい。 .SS オプション .TP .I "\-0, \-\-null" コピーアウトおよびコピーパスモードにおいて、改行のかわりにヌル文字で終了する ファイル名のリストを読み込みます。これにより、改行を含むファイル名を持つ ファイルをアーカイブできます。 GNU .B find を使うことで、ヌル文字で終了するファイル名のリストを生成することができます。 .TP .I "\-a, \-\-reset-access-time" ファイルを読み込んだ後に、それらのファイルのアクセスタイムの再設定を 行ないます。これは、これらのファイルがその時点で読み込まれたもののように 見えないようにするためです。 .TP .I "\-A, \-\-append" すでに存在するアーカイブファイルに追加書き込みをします。 このオプションはコピーアウトモードでのみ使用することができます。 このオプションを使うためには、アーカイブファイルが、 .I \-O または、 .I "\-F (\-\-file)" オプションで指定した名前のディスク上の(アーカイブ)ファイルで なければなりません。 .TP .I "\-b, \-\-swap" コピーインモードにおいて、データ中の1ワード(32 ビット)データの上下 16 ビット を入れ換え、1 ハーフワード(16 ビット)の上下 8 ビットを入れ換えます。本オプショ ンは、 .IR "\-sS" と同等です。 このオプションは、ビッグエンディアンマシンとリトルエンディアンのマシンの間で 32ビット整数を変換するために用います。 .TP .I "\-B" I/O ブロックサイズを 5120 バイトに設定します。ブロックサイズの初期値は 512 バイトです。 .TP .I "\-\-block-size=BLOCK-SIZE" I/Oブロックサイズを BLOCK-SIZE * 512 バイトに設定します。 .TP .I "\-c" アーカイブ形式として、old ASCII フォーマット (つまり古い互換アーカイブフォーマット)を用います。 .TP .I "\-C IO-SIZE, \-\-io-size=IO-SIZE" I/O ブロックサイズを IO-SIZE で指定したバイト数に設定します。 .TP .I "\-d, \-\-make-directories" 必要に応じてディレクトリを作成します。 .TP .I "\-E FILE, \-\-pattern-file=FILE" コピーインモードにおいて、ファイル名 FILE から展開したり、ファイルリストを 表示したりするために、ファイル名を特定するパターン指定を読み込みます。 ファイル名 FILE で特定できるファイルに記述された各行は、 .B cpio のオプション以外の文字列で指定されたもののように扱われます。 .TP .I "\-f, \-\-nonmatching" 与えられたパターンのいずれにも一致しないファイルのみ扱います。 .TP .I "\-F, \-\-file=archive" 標準入力もしくは標準出力のかわりに、指定されたアーカイブファイルを 用います。他のマシンのテープドライブをアーカイブファイルとして扱う 場合には、 `HOSTNAME:'で始まるファイル名を使用して下さい。 ホスト名は、そのユーザとしてリモートテープドライブをアクセスするために ユーザネームと '@'を先に書いても構いません(典型的には、そのユーザの `~/.rhosts'エントリにエントリが存在するマシンであることが多いようです)。 .TP .I "\-\-force-local" With .IR \-F 、 .IR \-I 、 もしくは .IR \-O オプションを用いた場合に、コロン文字を含むファイル名をローカルファイル名と みなして扱います。通常、コロン文字は、リモートホスト名とその上の ローカルファイル名を区切る場合に使用されます。 .TP .I "\-H FORMAT, \-\-format=FORMAT" アーカイブフォーマットとして、FORMATのものを用います。 FORMAT の部分に指定できる文字列を以下に示します。 これらの名前は、すべて大文字の場合でも認識されます。 コピーインモードでのデフォルトは、入力ファイルの内容から 自動的にアーカイブフォーマットを判定するもので、コピーアウトモードでは、 "bin"フォーマットがデフォルトです。 .RS .IP bin binaryフォーマットです。ほとんど使われません。 .IP odc old ASCII (POSIX.1 互換)フォーマットです。 .IP newc new ASCII(SVR4 互換)フォーマットです。 new ASCII フォーマットは、65536 個を超える i-nodes を備える ファイルシステムをサポートします。 .IP crc crc フォーマットです。crcフォーマットは、new ASCII フォーマットと似ていますが、 チェックサムを含みます。 .IP tar old tar フォーマットです。 .IP ustar POSIX.1 tar フォーマットです。GNU .B tar アーカイブも取り扱うことができます。POSIX.1 tar と GNU tar は、 よく似ていますが、同じではありません。 .IP hpbin HPUXの cpio で使用されている、あまり使われない binary フォーマットです。 (他の cpio とは異なる形式で、デバイスファイルを保存します)。 .IP hpodc HPUX の cpio で使用されている互換フォーマットです(他のcpioとは異 なる形式で、デバイスファイルを保存します)。 .RE .TP .I "\-i, \-\-extract" コピーインモードで動作します。 .TP .I "\-I archive" 標準入力のかわりに、指定されたアーカイブファイル名を用います。他のマシンの テープドライブをアーカイブファイルとして扱う場合には、`HOSTNAME:'で始 まるファイル名を使用して下さい。 ホスト名は、そのユーザとしてリモートテープドライブをアクセスするために ユーザネームと '@'を先に書いても構いません(典型的には、そのユーザの `~/.rhosts'エントリにエントリが存在するマシンであることが多いようです)。 .TP .I \-k 無視されます。他のバージョンの .BR cpio との互換性を保つためにのみ存在します。 .TP .I "\-l, \-\-link" 可能であれば、ファイルをコピーするかわりにリンクを張ります ( .I \-p オプションと共に指定するときのみ使用できます)。 .TP .I "\-L, \-\-dereference" シンボリックリンクを参照を利用しません。 シンボリックリンクファイルをコピーするかわりに、 シンボリックリンクファイルの指す実体のファイルをコピー します。 .TP .I "\-m, \-\-preserve-modification-time" コピー先のファイル生成時に、コピー元のファイルの更新時刻を保持します。 .TP .I "\-M MESSAGE, \-\-message=MESSAGE" バックアップ媒体(テープやフロッピーディスクなど)のボリューム終端まで 到達した場合に、MESSAGEで指定された文字列を出力します。この指定をすることで、 ユーザに新しい媒体の挿入指示を出すことが可能になります。MESSAGE で指定される文字列に"%d"が含まれる場合には、"%d"文字列は、現在の媒体通番 (1からはじまります)に置き換えられます。 .TP .I "\-n, \-\-numeric-uid-gid" 冗長モードで内容のリストを出す場合に、UID および GID を、その ID の 対応するユーザ名 / グループ名でなく、数字で表示します。 .TP .I " \-\-no-absolute-filenames" -コピーモードで、 +コピーインモードで、 アーカイブ中に絶対ファイル名で格納されていたとしても、 現在のディレクトリからの相対でファイルを生成します。 .TP .I " \-\-no-preserve-owner" コピーインモードおよびコピーパスモードにおいて、ファイルの所有者を 変更しません。これは、展開後のファイルの所有者は、実際にファイルの展開を 行なっているユーザとなることを示します。このオプションは、スーパユーザ以外の ユーザが使用する場合にはデフォルトで有効になります。これは、System V のユーザが、誤ってファイルの所有権を手放さないようにするためです。 .TP .I "\-o, \-\-create" コピーアウトモードで動作します。 .TP .I "\-O archive" 標準出力のかわりに、指定したアーカイブファイルを用います。他のマシンの テープドライブをアーカイブファイルとして扱う場合には、`HOSTNAME:'で 始まるファイル名を使用して下さい。ホスト名は、そのユーザとして リモートテープドライブをアクセスするためにユーザネームと '@'を先に 書いても構いません(典型的には、そのユーザの`~/.rhosts'エントリに エントリが存在するマシンであることが多いようです)。 .TP .I " \-\-only-verify-crc" コピーインモードで CRC フォーマットのアーカイブを読み込む時に、 アーカイブ内の各ファイルの CRC をベリファイするだけで、 実際にファイルを取り出しません。 .TP .I "\-p, \-\-pass-through" コピーパスモードで動作します。 .TP .I "\-\-quiet" コピーされたブロック数を表示しません。 .TP .I "\-r, \-\-rename" 対話的にファイル名を変更します。 .TP .I "\-R [user][:.][group], \-\-owner [user][:.][group]" コピーアウトモードおよびコピーパスモードにおいて、全ての生成ファイルの 所有権を指定したユーザ、グループに設定します。ユーザもしくはグループの どちらか、もしくは両方とも指定される必要があります。もしグループの指定は 省略されたが、":"もしくは"."セパレータが指定された場合には、ユーザの ログイングループがグループとして設定されます。 スーパーユーザのみがファイルの所有権を変更することが可能です。 .TP .I "\-\-sparse" コピーアウトモードおよびコピーパスモードにおいて、ゼロから成る大きなブロックを 持つファイルを疎なファイルとして書きます。 .TP .I "\-s, \-\-swap-bytes" コピーインモードにおいて、ファイル中のデータの16ビットの上位8ビットと下位 8ビットを入れ換えます。 .TP .I "\-S, \-\-swap-halfwords" コピーインモードにおいて、ファイル中のデータの 32 ビットの上位 16 ビットと 下位 16 ビットを入れ換えます。 .TP .I "\-t, \-\-list" 入力ファイル名の一覧を出力します。 .TP .I "\-u, \-\-unconditional" すでに存在している新しいファイルを古いファイルで置き換えるかどうかの 問い合わせをすることなく、全てのファイルを上書きします。 .TP .I "\-v, \-\-verbose" 処理されたファイル名を表示します(冗長モードということです)。 .IR \-t オプションが同時に指定された場合には、`ls \-l'形式の表示を得ることが できます。ustar フォーマットのアーカイブから得られる表示においては、 ローカルシステムに存在しないユーザ名およびグループ名のファイルについては、 アーカイブ内に格納された UID および GID の値に対応するローカルでのユーザ名、 グループ名に置き換えてその部分を表示します。 .TP .I "\-V \-\-dot" 各ファイルを処理するごとに、"."を表示します。 .TP .I "\-\-version" .B cpio のプログラムバージョンを表示して終了します。 diff --git a/ja/man/man1/crontab.1 b/ja/man/man1/crontab.1 index d2b0fa4cb1..02ac2503b0 100644 --- a/ja/man/man1/crontab.1 +++ b/ja/man/man1/crontab.1 @@ -1,120 +1,120 @@ .\"/* Copyright 1988,1990,1993 by Paul Vixie .\" * All rights reserved .\" * .\" * Distribute freely, except: don't remove my name from the source or .\" * documentation (don't take credit for my work), mark your changes (don't .\" * get me blamed for your possible bugs), don't alter or remove this .\" * notice. May be sold if buildable source is provided to buyer. No .\" * warrantee of any kind, express or implied, is included with this .\" * software; use at your own risk, responsibility for damages (if any) to .\" * anyone resulting from the use of this software rests entirely with the .\" * user. .\" * .\" * Send bug reports, bug fixes, enhancements, requests, flames, etc., and .\" * I'll try to keep a version up to date. I can be reached as follows: .\" * Paul Vixie uunet!decwrl!vixie!paul .\" */ .\" .\" %Id: crontab.1,v 1.5 1998/03/23 08:21:29 charnier Exp % .\" jpman %Id: crontab.1,v 1.2 1997/04/18 06:38:25 yugawa Stab % .\" .Dd December 29, 1993 .Dt CRONTAB 1 .Os .Sh 名称 .Nm crontab .Nd 個人用の crontab の編集を行う (V3) .Sh 書式 .Nm crontab .Op Fl u Ar user .Ar file .Nm crontab .Op Fl u Ar user { .Fl l | .Fl r | .Fl e } .Sh 解説 .Nm crontab は、 Vixie Cron の .Xr cron 8 デーモンが扱うテーブル内のエントリの -追加、削除、およびリスト表示を行います。各ユーザは、自分用の contab +追加、削除、およびリスト表示を行います。各ユーザは、自分用の crontab ファイルを持つことができます。このファイルは .Pa /var 内にありますが、 これはエディタで直接変更するためのものではありません。 .Pp もし .Pa allow ファイル .Pq Pa /var/cron/allow が存在した場合、このコマンドを 使うためには、あなたの名前がこの .Pa allow ファイルになければなりません。また、 .Pa allow ファイルは存在しないが .Pa deny ファイル .Pq Pa /var/cron/deny が存在した場合に、 このコマンドを使うためには、あなたの名前がこの .Pa deny ファイルにあっては .Em いけません 。 どちらのファイルも存在しない場合、サイト依存の設定パラメータにより スーパーユーザだけがこのコマンドを使うことができるか、 すべてのユーザがこのコマンドを使うことができるかが決定されます。 .Pp このコマンドの最初の書式は file から新しい crontab をインストールする 場合に使います。ファイル名として ``-'' が指定された時は、標準入力から 読み込みます。 .Pp 以下のオプションを使用可能です: .Bl -tag -width indent .It Fl u 指定した -.I user +ユーザ の crontab ファイルに対して操作を行います。 このオプションがない場合には、コマンドを実行した人 の crontab ファイルに対しての操作になります。 .Xr su 8 をしている場合は混乱する可能性がありますから、正確を期するため、この場合には .Fl u をつねにつけるようにすべきです。 .It Fl l 現在の crontab ファイルを標準出力に表示します。 .It Fl r 現在の crontab ファイルを削除します。 .It Fl e 現在の crontab を編集します。環境変数 .Ev VISUAL もしくは .Ev EDITOR があれば、この環境変数で指定したエディタを利用します。 エディタを終了すれば、crontab ファイルが自動的にインストールされます。 .El .Sh 関連項目 .Xr crontab 5 , .Xr cron 8 .Sh 関連ファイル .Bl -tag -width /var/cron/allow -compact .It Pa /var/cron/allow .It Pa /var/cron/deny .El .Sh 規格 .Nm コマンドは .St -p1003.2 準拠です。 この新しい文法は以前の Vixie Cron のものとも 古典的な SVR3 のものとも異なっています。 .Sh 診断 誤ったコマンドラインを与えて実行した場合、 使用法についてのかなり有益なメッセージが出力されます。 .Sh 作者 .An Paul Vixie Aq paul@vix.com diff --git a/ja/man/man1/dialog.1 b/ja/man/man1/dialog.1 index 89cc58f456..9072026ecc 100644 --- a/ja/man/man1/dialog.1 +++ b/ja/man/man1/dialog.1 @@ -1,368 +1,368 @@ .TH DIALOG 1 "2 October 1998" .\" jpman %Id: dialog.1,v 1.3 1997/07/27 11:54:02 horikawa Stab % .SH 名称 dialog \- シェルスクリプトからダイアログボックスを表示する .SH 書式 .B dialog --clear .br .BI "dialog --create-rc " file .br .B dialog [ .BI "\-\-title " title ] [ .B \-\-clear ] [ .BI "\-\-hline " line ] [ .BI "\-\-hfile " file ] .B box-options .SH 解説 .B dialog はシェルスクリプトから、 質問形式、メッセージ表示形式など、 いろいろな種類のダイアログボックスを表示するプログラムです。 現在サポートされているダイアログボックスは 以下のとおりです。 .LP .BR yes/no " ボックス、" " menu" " ボックス、" " input" " ボックス、" .BR message " ボックス、" " text" " ボックス、" " info" " ボックス、" .BR checklist " ボックス、" " program" " ボックス、" .BR ftree " および " tree " ボックスです。" .SH オプション .TP .B \-\-clear 終了時に画面をクリアします。 .TP .BI \-\-create-rc " file" .B dialog -はランタイムコンフィグレーションをサポートしています。 +はランタイムコンフィギュレーションをサポートしています。 .I file にサンプルの設定ファイルを書き出します。 .TP .BI \-\-title " title" ダイアログボックスの最上行に表示する文字列 .I title を指定します。 .TP .BI \-\-hline " line" ダイアログボックスの最下行に表示する文字列 .I line を指定します。 .TP .BI \-\-hfile " file" ? キーか F1 キーをタイプしたときに 表示する .I file を指定します。 .TP .B ボックスオプション .TP .BI \-\-yesno " text height width" 縦 .I height 横 .I width のサイズの .BR yes/no ダイアログボックスを表示します。 .I text で指定された文字列はダイアログボックスの内部に 表示されます。 この文字列が長すぎて、1行で表示できない場合は、 自動的に複数行に分割されます。 .I text が文字列 .I "\en" もしくは改行文字 .I `\en\' を含んでいる場合、その場所で 改行します。 このダイアログボックスは ユーザに yes あるいは no という返答を求める 際に役に立ちます。 ダイアログボックスは .B Yes と .B No のボタンを持っており、 .IR TAB キーで選択することができます。 .TP .BI \-\-msgbox " text height width" .B message ボックスは .B yes/no ボックスと似ていますが、 .B message ボックスの場合、 .B OK ボタンしか表示されません。 このダイアログボックスを使って、メッセージを表示 することができます。 ユーザはこのメッセージを読んだ後、 .I ENTER キーを押して、 .B dialog を終了し、シェルスクリプトの実行を続けることになります。 .TP .BI \-\-infobox " text height width" .B info ボックスは基本的に .B message ボックスと同じですが、メッセージを表示すると すぐに終了します。 .B dialog の終了時に画面はクリアされません。 メッセージはシェルが後で画面をクリアするまで残ります。 これは終了までに時間のかかる処理を行うことを、 ユーザに知らせるときに便利です。 .TP .BI \-\-inputbox " text height width" .B input ボックスはユーザに文字列を入力させる ときに役に立ちます。入力時に .I バックスペース キーを 押すことで、タイプミスを訂正することができます。 入力文字列がダイアログボックスより長くなった 場合は、入力フィールドがスクロールします。 終了時には入力された文字列を .IR stderr に出力します。 .TP .BI \-\-textbox " file height width" .B text ボックスは、テキストファイルの内容をダイアログボックスの中に 表示するためのものです。これは簡単なテキストファイルビュアーの ようなものです。 表示中は、 .IR UP/DOWN "、" PGUP/PGDN "、" HOME/END キーを使ってファイル中を移動できます。 1 行がダイアログボックスより長い場合は、 .I LEFT/RIGHT で左右にスクロールできます。 より便利に使うために、 前方検索、後方検索の機能も実装されています。 .IP "\fB\-\-menu \fItext height width menu-height \fR[ \fItag item \fR] \fI..." .B menu ボックスは、その名のとおりダイアログボックスにリストを表示して ユーザに選ばせるものです。 各メニューは .I tag と .I item で構成されます。 .I tag は他の項目と区別するためのものです。 .I item はその項目が表す内容を短く記述したものです。 ユーザは .I UP/DOWN キー、または .I tag の先頭文字、 .I 1-9 を押すことで項目を選べます。 .I menu-height は一度に表示できるメニューの数を設定します。 .I menu-height より多くの項目がある場合、メニューがスクロールします。 .B dialog を終了するとき、 選択されたメニューの .I tag が .I stderr に出力されます。 .TP .BI \-\-prgbox " command height width" .B program ボックスは .B command の出力をダイアログボックスに表示します。 .IP "\fB\-\-checklist \fItext height width list-height \fR[ \fItag item status \fR] \fI..." .B checklist ボックスは、 メニューから項目を選ぶという点で .B menu ボックスと似ていまが、 項目のなかから 1 つを選ぶのではなく、 ユーザが各項目をオン・オフに設定することができます。 各項目のオン・オフの初期設定は .I status で設定できます。 終了時には、 ステータスがオンになっている項目の .I tag が .I stderr に出力されます。 .IP "\fB\-\-ftree \fIfile FS text height width menu-height" .B ftree ボックスは、 ファイル .I file に記述されたデータをもとにツリーを表示するダイアログボックスです。 ファイル内のデータは、find(1) の出力形式のように見えます。 find の出力の場合、フィールドセパレータ .I FS は .IR \'/\' になります。 .I height および .I width が正の値の場合、 .B ftree ボックス全体の絶対的な大きさを設定します。 .I height および .I width が負の値の場合、 .B ftree ボックスの大きさは、自動的に選択されます。 .I menu-height は、 .B ftree ボックス内部のツリーサブウィンドウの高さを設定しますので、 指定する必要があります。 .I text は、 .B ftree ボックス内部のツリーサブウィンドウ上部に表示され、 行を分割するために改行文字 .I '\en\' を含めることが可能です。 .IR UP/DOWN " または " \'+\'/\'-\' "、" PG_UP/PG_DOWN " または " \'b\'/SPACE .RI "、そして" HOME/END " または " \'g\'/\'G\' を押すことにより、ツリー内部を移動することが可能です。 リーフの選択は、 .IR TAB " または " LEFT/RIGHT で .B OK ボタンに移動してから .I ENTER を押します。 選択したリーフ (より正確には、ツリーのルートからリーフまでの完全なパス) が .I stderr に表示されます。 .B Cancel の後に .I ENTER を押すと、 .I stderr には何も表示されません。 .I file には find(1) 形式の出力を含めることが可能ですが、 find(1) を .I -d オプション付きで起動した出力のような形式も使用可能です。 ツリーのリーフへの中間のパスは、無くてもかまいません。 そのようなデータは、ファイルからの読み込み時に修正されます。 .IP "\fB\-\-tree \fIFS text height width menu-height \fR[ \fIitem \fR] \fI..." .B tree ボックスは、 .B ftree に似ていますが、例外があります。 第 1 に、データはファイルから入力されるのではなく、コマンドラインから .I item item ... の形式で読み込まれます。 第 2 に、データの修正はいかなる場合にも行われません。 よって、find(1) を .I -d オプション付きで起動した形式のデータは不正に見えます。 .SH ランタイムコンフィギュレーション .TP 4 1. 以下のように、サンプルの設定ファイルを作成します。 .LP .in +1i "dialog --create-rc " .TP 4 2. .B dialog は以下のように読み込む設定ファイル決定します。 .RS .TP 4 a) 環境変数 .B DIALOGRC が設定されている場合、その値は設定ファイル名として扱われます。 .TP 4 b) (a) で指定されたファイルが存在しなかった場合、 .I $HOME/.dialogrc が設定ファイルとして扱われます。 .TP 4 c) (b) のファイルが存在しなかった場合、 デフォルトの設定で起動します。 .RE .TP 4 3. サンプルの設定ファイルを編集して、 2 を参考に .B dialog が見付けることができる場所にコピーします。 .SH 環境変数 .TP 15 .B DIALOGRC 独自に設定をする場合は、設定ファイル名を指定します。 .SH 関連ファイル .TP 20 .I $HOME/.dialogrc デフォルトの設定ファイル .SH 診断 .BR dialog が .BR Yes か .BR OK を押されて終了した場合は 0 を、 .BR No か .BR Cancel を押されて終了した場合は 1 を返します。 また、 .B dialog の内部でエラーが起こるか、 .B dialog を .I ESC キーを押して終了させた場合、-1 を返します。 .SH 関連項目 dialog(3) .SH バグ .I タブ キャラクタを含むテキストファイルを .B text ボックス で表示すると、うまく表示されません。 テキストファイルの中の .I タブ キャラクタは 事前にスペースに変換しておかなくてはなりません。 .sp 1 画面の書き換えには時間がかかります。 .sp 1 .B ftree および .B tree のボックスでは、ツリーを左右に動かすことができません。 よって、多階層のデータの場合、見えなくなる階層が生じます。 80 文字の標準的な画面では、17 個の階層を見せることができます。 より深い階層は見えません。 それでも、ツリー内の移動と、リーフの選択は動作します。 .SH 作者 Savio Lam (lam836@cs.cuhk.hk) .sp 1 Anatoly A. Orehovsky (tolik@mpeks.tomsk.su) が更新しました (ftree と tree ボックス)。 diff --git a/ja/man/man1/gcc.1 b/ja/man/man1/gcc.1 index a8ea408dbc..6015f1d30b 100644 --- a/ja/man/man1/gcc.1 +++ b/ja/man/man1/gcc.1 @@ -1,4019 +1,4019 @@ .\" Copyright (c) 1991, 1992, 1993, 1994 Free Software Foundation -*-Text-*- .\" See section COPYING for conditions for redistribution .\" .\" jpman %Id: gcc.1,v 1.4 1997/10/11 07:52:34 horikawa Stab % .\" Set up \*(lq, \*(rq if -man hasn't already set it up. .if @@\*(lq@ \{\ . ds lq " . if t .ds lq `` . if !@@\(lq@ .ds lq "\(lq .\} .if @@\*(rq@ \{\ . ds rq " . if t .ds rq '' . if !@@\(rq@ .ds rq "\(rq .\} .de Id .ds Rv \\$3 .ds Dt \\$4 .. .de Sp .if n .sp .if t .sp 0.4 .. .Id %Id: gcc.1,v 1.4 1993/10/13 23:19:12 pesch Exp % .TH GCC 1 "\*(Dt" "GNU Tools" "GNU Tools" .SH 名称 gcc, g++ \- GNU プロジェクト C コンパイラ および C++ コンパイラ (v2.7) .SH 書式 .B gcc .RI "[ " option " | " filename " ].\|.\|." .br .SH 注意 このマニュアルに書かれた情報は GNU C コンパイラの完全な ドキュメンテーションからの抜粋であり、オプションの意味の記述にとどめます。 .PP このマニュアルはボランティアのメンテナンスが行なわれた時にのみ更新され るもので、常に最新の情報を示しているわけではありません。 もしこのマニュアルと実際のソフトウェアの間に矛盾点があれば、 正式なドキュメントである Info ファイルのほうを参照して下さい。 .PP このマニュアル中の古い記述が重大な混乱や不具合をきたすことになれば、 このマニュアルページの配布は中止します。 GNU CCのメンテナンス作業の都合上、 Info ファイルを更新した時にマニュアルページも併せて更新することは できません。マニュアルページは時代遅れであり、 これに時間をかけるべきではないと GNU プロジェクトでは考えています。 .PP 完全な最新のドキュメンテーションが必要な場合は、Info ファイルの`\|\c .B gcc\c \&\|' またはマニュアルの .I Using and Porting GNU CC (for version 2.0)\c \& を参照して下さい。この双方は Texinfo のソースファイル .B gcc.texinfo から生成されます。 .SH 解説 C と C++ のコンパイラは統合されています。どちらの場合も、入力ファイル は、プリプロセス、コンパイル、アセンブル、リンクの 4 つの処理ステージの うちの 1 つ以上のステージを踏んで処理されます。 ソースファイル名の拡張子によってソースの言語を識別しますが、 デフォルトの動作は、どちらの名前でコンパイラを使うかに依存しています: .TP .B gcc プリプロセス済みの (\c .B .i\c \&) ファイルを C のファイルと仮定し、C スタイルのリンクを行います。 .TP .B g++ プリプロセス済みの(\c .B .i\c \&) ファイルを C++ のファイルと仮定し、C++ スタイルのリンクを行います。 .PP ソースファイル名の拡張子は、その言語が何であるかと、どのような処理が行われる べきかを示します: .Sp .nf .ta \w'\fB.cxx\fP 'u \&\fB.c\fP C言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 \&\fB.C\fP C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 \&\fB.cc\fP C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 \&\fB.cxx\fP C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 \&\fB.m\fP Objective-C 言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 \&\fB.i\fP プリプロセッサにかけられたC言語ソースです。コンパイラ、アセンブラにかけられます。 \&\fB.ii\fP プリプロセッサにかけられたC++言語ソースです。コンパイラ、アセンブラにかけられます。 \&\fB.s\fP アセンブリ言語ソースです。アセンブラにかけられます。 \&\fB.S\fP アセンブリ言語ソースです。プリプロセッサ、アセンブラにかけられます。 \&\fB.h\fP プリプロセッサファイルです。通常はコマンドラインには現れません。 .Sp .fi その他の拡張子を持つファイルはリンカに渡されます。以下のものがあります。 .Sp .nf \&\fB.o\fP オブジェクトファイルです。 \&\fB.a\fP アーカイブファイルです。 .br .fi .Sp リンクは、オプション .BR \-c , .BR \-S , .B \-E を指定して抑制しないかぎり(もしくはコンパイルエラーによってすべての処理が中断 しないかぎり)、常に最終ステージで実行されます。 リンクのステージにおいては、ソースファイルに対応した全ての .B .o ファイルと、 .B \-l で指定したライブラリと、認識されなかったファイル名 (名前に .B .o のついたオブジェクトファイルや .B .a のついたアーカイブを含む) は、 コマンドラインに並べられた順番でリンカに渡されます。 .SH オプション オプションは分割されていなければなりません。すなわち `\|\c .B \-dr\c \&\|' は `\|\c .B \-d \-r \&\|'とは異なった扱いを受けます。 .PP ほとんどの `\|\c .B \-f\c \&\|' と `\|\c .B \-W\c \&\|' 形式のオプションには、 .BI \-f name と .BI \-fno\- name\c \& (または .BI \-W name と .BI \-Wno\- name\c \&) の形式の、対照的な表現があります。ここではデフォルトでない形式の みを示します。 .PP すべてのオプションを種類別に分けてまとめました。詳しい解説は 以下の節で行ないます。 .hy 0 .SH FreeBSD 固有のオプション .TP .BI "\-pthread" スレッド化ユーザプロセスに libc の代りに libc_r をリンクします。 スレッド化ユーザプロセスにリンクされるオブジェクトは -D_THREADSAFE 付きで コンパイルする必要があります。 .TP .BI "\-kthread" スレッド化カーネルプロセスに libc に加えて libpthread をリンクします。 スレッド化カーネルプロセスにリンクされるオブジェクトは -D_THREADSAFE 付きで コンパイルする必要があります。 .na .TP .B 全体的なオプション .br \-c \-S \-E .RI "\-o " file \-pipe \-v .RI "\-x " language .TP .B 言語オプション \-ansi \-fall\-virtual \-fcond\-mismatch \-fdollars\-in\-identifiers \-fenum\-int\-equiv \-fexternal\-templates \-fno\-asm \-fno\-builtin \-fno\-strict\-prototype \-fsigned\-bitfields \-fsigned\-char \-fthis\-is\-variable \-funsigned\-bitfields \-funsigned\-char \-fwritable\-strings \-traditional \-traditional\-cpp \-trigraphs .TP .B 警告オプション \-fsyntax\-only \-pedantic \-pedantic\-errors \-w \-W \-Wall \-Waggregate\-return \-Wcast\-align \-Wcast\-qual \-Wchar\-subscript \-Wcomment \-Wconversion \-Wenum\-clash \-Werror \-Wformat .RI \-Wid\-clash\- len \-Wimplicit \-Winline \-Wmissing\-prototypes \-Wmissing\-declarations \-Wnested\-externs \-Wno\-import \-Wparentheses \-Wpointer\-arith \-Wredundant\-decls \-Wreturn\-type \-Wshadow \-Wstrict\-prototypes \-Wswitch \-Wtemplate\-debugging \-Wtraditional \-Wtrigraphs \-Wuninitialized \-Wunused \-Wwrite\-strings .TP .B デバッグオプション \-a .RI \-d letters \-fpretend\-float \-g .RI \-g level \-gcoff \-gxcoff \-gxcoff+ \-gdwarf \-gdwarf+ \-gstabs \-gstabs+ \-ggdb \-p \-pg \-save\-temps .RI \-print\-file\-name= library \-print\-libgcc\-file\-name .TP .B 最適化オプション \-fcaller\-saves \-fcse\-follow\-jumps \-fcse\-skip\-blocks \-fdelayed\-branch \-felide\-constructors \-fexpensive\-optimizations \-ffast\-math \-ffloat\-store \-fforce\-addr \-fforce\-mem \-finline\-functions \-fkeep\-inline\-functions \-fmemoize\-lookups \-fno\-default\-inline \-fno\-defer\-pop \-fno\-function\-cse \-fno\-inline \-fno\-peephole \-fomit\-frame\-pointer \-frerun\-cse\-after\-loop \-fschedule\-insns \-fschedule\-insns2 \-fstrength\-reduce \-fthread\-jumps \-funroll\-all\-loops \-funroll\-loops \-O \-O2 .TP .B プリプロセッサオプション .RI \-A assertion \-C \-dD \-dM \-dN .RI \-D macro [\|= defn \|] \-E \-H .RI "\-idirafter " dir .RI "\-include " file .RI "\-imacros " file .RI "\-iprefix " file .RI "\-iwithprefix " dir \-M \-MD \-MM \-MMD \-nostdinc \-P .RI \-U macro \-undef .TP .B アセンブラオプション .RI \-Wa, option .TP .B リンカオプション .RI \-l library \-nostartfiles \-nostdlib \-static \-shared \-symbolic .RI "\-Xlinker\ " option .RI \-Wl, option .RI "\-u " symbol .TP .B ディレクトリオプション .RI \-B prefix .RI \-I dir \-I\- .RI \-L dir .TP .B ターゲットオプション .RI "\-b " machine .RI "\-V " version .TP .B コンフィギュレーション依存オプション .I M680x0\ オプション .br \-m68000 \-m68020 \-m68020\-40 \-m68030 \-m68040 \-m68881 \-mbitfield \-mc68000 \-mc68020 \-mfpa \-mnobitfield \-mrtd \-mshort \-msoft\-float .Sp .I VAX オプション .br \-mg \-mgnu \-munix .Sp .I SPARC オプション .br \-mepilogue \-mfpu \-mhard\-float \-mno\-fpu \-mno\-epilogue \-msoft\-float \-msparclite \-mv8 \-msupersparc \-mcypress .Sp .I Convex オプション .br \-margcount \-mc1 \-mc2 \-mnoargcount .Sp .I AMD29K オプション .br \-m29000 \-m29050 \-mbw \-mdw \-mkernel\-registers \-mlarge \-mnbw \-mnodw \-msmall \-mstack\-check \-muser\-registers .Sp .I M88K オプション .br \-m88000 \-m88100 \-m88110 \-mbig\-pic \-mcheck\-zero\-division \-mhandle\-large\-shift \-midentify\-revision \-mno\-check\-zero\-division \-mno\-ocs\-debug\-info \-mno\-ocs\-frame\-position \-mno\-optimize\-arg\-area \-mno\-serialize\-volatile \-mno\-underscores \-mocs\-debug\-info \-mocs\-frame\-position \-moptimize\-arg\-area \-mserialize\-volatile .RI \-mshort\-data\- num \-msvr3 \-msvr4 \-mtrap\-large\-shift \-muse\-div\-instruction \-mversion\-03.00 \-mwarn\-passed\-structs .Sp .I RS6000 オプション .br \-mfp\-in\-toc \-mno\-fop\-in\-toc .Sp .I RT オプション .br \-mcall\-lib\-mul \-mfp\-arg\-in\-fpregs \-mfp\-arg\-in\-gregs \-mfull\-fp\-blocks \-mhc\-struct\-return \-min\-line\-mul \-mminimum\-fp\-blocks \-mnohc\-struct\-return .Sp .I MIPS オプション .br \-mcpu=\fIcpu type\fP \-mips2 \-mips3 \-mint64 \-mlong64 \-mlonglong128 \-mmips\-as \-mgas \-mrnames \-mno\-rnames \-mgpopt \-mno\-gpopt \-mstats \-mno\-stats \-mmemcpy \-mno\-memcpy \-mno\-mips\-tfile \-mmips\-tfile \-msoft\-float \-mhard\-float \-mabicalls \-mno\-abicalls \-mhalf\-pic \-mno\-half\-pic \-G \fInum\fP \-nocpp .Sp .I i386 オプション .br \-m486 \-mno\-486 \-msoft\-float \-mrtd \-mregparm \-msvr3\-shlib \-mno\-ieee\-fp \-mno\-fp\-ret\-in\-387 \-mfancy\-math\-387 \-mno\-wide\-multiply \-mdebug\-addr \-mno\-move \-mprofiler\-epilogue \-reg\-alloc=LIST .Sp .I HPPA オプション .br \-mpa\-risc\-1\-0 \-mpa\-risc\-1\-1 \-mkernel \-mshared\-libs \-mno\-shared\-libs \-mlong\-calls \-mdisable\-fpregs \-mdisable\-indexing \-mtrailing\-colon .Sp .I i960 オプション .br \-m\fIcpu-type\fP \-mnumerics \-msoft\-float \-mleaf\-procedures \-mno\-leaf\-procedures \-mtail\-call \-mno\-tail\-call \-mcomplex\-addr \-mno\-complex\-addr \-mcode\-align \-mno\-code\-align \-mic\-compat \-mic2.0\-compat \-mic3.0\-compat \-masm\-compat \-mintel\-asm \-mstrict\-align \-mno\-strict\-align \-mold\-align \-mno\-old\-align .Sp .I DEC Alpha オプション .br \-mfp\-regs \-mno\-fp\-regs \-mno\-soft\-float \-msoft\-float .Sp .I System V オプション .br \-G \-Qy \-Qn .RI \-YP, paths .RI \-Ym, dir .TP .B コード生成オプション .RI \-fcall\-saved\- reg .RI \-fcall\-used\- reg .RI \-ffixed\- reg \-finhibit\-size\-directive \-fnonnull\-objects \-fno\-common \-fno\-ident \-fno\-gnu\-linker \-fpcc\-struct\-return \-fpic \-fPIC \-freg\-struct\-return \-fshared\-data \-fshort\-enums \-fshort\-double \-fvolatile \-fvolatile\-global \-fverbose\-asm .ad b .hy 1 .SH 全体的なオプション .TP .BI "\-x " "language" このオプションに続く入力ファイルの言語を .I language\c \& であると明示的に指定します (拡張子に基づくデフォルトの選択よりも優先されます)。このオプションは、 次の `\|\c .B \-x\c \&\|' オプションが出てくるまで、後続する全ての入力ファイルに対して 適用されます。\c .I language\c \& としては、 `\|\c .B c\c \&\|', `\|\c .B objective\-c\c \&\|', `\|\c .B c\-header\c \&\|', `\|\c .B c++\c \&\|', `\|\c .B cpp\-output\c \&\|', `\|\c .B assembler\c \&\|', `\|\c .B assembler\-with\-cpp\c \&\|' を指定することが可能です。 .TP .B \-x none 言語の指定を解除します。このオプションのあとに続くファイルは、それらの拡張子に 基づいて (あたかも何の `\|\c .B \-x\c \&\|' オプションも使用されたことがないように) 処理されます。 .PP もし、4 つのステージ (プリプロセス、コンパイル、アセンブル、リンク) の うちの一部のみが必要な場合は、 `\|\c .B \-x\c \&\|' オプション (またはファイル名の拡張子) を使用して \c .B gcc\c \& に対してどのステージから開始するかを伝え、さらに `\|\c .B \-c\c \&\|', `\|\c .B \-S\c \&\|', `\|\c .B \-E\c \&\|' のオプションのうちのどれかを使用して .B gcc\c \& に対してどこで処理を停止させるかを指定します。ここで、 いくつかの組み合わせ (例えば `\|\c .B \-x cpp\-output \-E\c \&\|') は \c .B gcc\c \& に対して何の動作も行なわないように指定することになることに注意してください。 .TP .B \-c ソースファイルを、コンパイルまたはアセンブルまではしますが、リンクはしません。 コンパイラの出力は、それぞれのソースファイルに対応したオブジェクトファイル となります。 .Sp デフォルトでは、GCC はオブジェクトファイルのファイル名として、 ソースファイルの拡張子 `\|\c .B .c\c \&\|', `\|\c .B .i\c \&\|', `\|\c .B .s\c \&\|' 等を `\|\c .B .o\c \&\|' で置き換えたものを使用します。 .B \-o\c \& オプションを使用することによって、他の名前を指定することも可能です。 .Sp GCC は .B \-c オプションを使用した場合は、理解できない入力ファイル (コンパイルやアセンブル を必要としないファイル) を無視します。 .TP .B \-S コンパイルが終った所で処理を停止し、アセンブルは行いません。 アセンブラコードではない入力ファイルが指 定された場合は、出力はアセンブラコードのファイルになります。 .Sp デフォルトでは、GCC はアセンブラファイルのファイル名として、 ソースファイルの拡張子 `\|\c .B .c\c \&\|', `\|\c .B .i\c \&\|' 等を `\|\c .B .s\c \&\|' で置き換えたものを使用します。 .B \-o\c \& オプションを使用することによって、他の名前を指定することも可能です。 .Sp GCC はコンパイルを必要としない入力ファイルを全て無視します。 .TP .B \-E プリプロセス処理が終了したところで停止します。コンパイルはしません。 出力はプリプロセス済みのソースコードであり、標準出力へと送られます。 .Sp GCC はプリプロセスを必要としない入力ファイルを全て無視します。 .TP .BI "\-o " file 出力先を \c .I file\c \& に指定します。このオプションは GCC が実行可能ファイル、 オブジェクトファイル、アセンブラファイル、プリプロセス済み C コードなどの、 いかなる種類の出力を行なう場合にも適用可能です。 .Sp 出力ファイルは 1 つしか指定できないため、 `\|\c .B \-o\c \&\|' を複数の入力ファイルをコンパイルする際に使用することは、実行ファ イルを出力する時以外は無意味です。 .Sp `\|\c .B \-o\c \&\|'オプションを指定しなかった場合のデフォルトは、実行ファイルを作る場 合は `\|\c .B a.out\c \&\|' という名前であり、`\|\c .I source\c .B \&.\c .I suffix\c \&\c \&\|' の形式のファイル名を持ったソースファイルのオブジェクトファイルは `\|\c .I source\c .B \&.o\c \&\|' であり、アセンブラのファイルは `\|\c .I source\c .B \&.s\c \&\|' です。 プリプロセス済みの C 言語は、全て標準出力に送られます。 .TP .B \-v (標準エラー出力に対して) コンパイルの各ステージで実行されるコマンドを 表示します。コンパイラドライバ、プリプロセッサおよび本来のコンパイラの 各バージョン番号も表示します。 .TP .B -pipe コンパイル時のステージの間のデータの受け渡しに、テンポラリファイルではなく パイプを使用します。いくつかのシステムではアセンブラがパイプからの入力を受け 付けることができないために、このオプションを指定すると失敗します。 GNU アセンブラでは問題なく使用できます。 .PP .SH 言語オプション .TP 以下のオプションは、コンパイラが受け付ける C の方言に関する制御を行ないます: .TP .B \-ansi 全ての ANSI 標準の C プログラムをサポートします。 .Sp このオプションは、GNU C が持つ ANSI C との非互換な機能を全て排除します。 例えば、\c .B asm\c \&, \c .B inline\c \&, \c .B typeof などのキーワードや、\c .B unix\c \& や \c .B vax などの現在使用しているシステムを規定する定義済みマクロなどが抑制されます。 さらに、好ましくなくかつほとんど使用されない ANSI のトライグラフの機能を使 用可能とし、さらに `\|\c .B $\c \&\|' を識別子の一部として使用できないようにします。 .Sp 代替キーワードである\c .B _\|_asm_\|_\c \&, \c .B _\|_extension_\|_\c \&, .B _\|_inline_\|_\c \&, \c .B _\|_typeof_\|_\c \& は、 `\|\c .B \-ansi\c \&\|' が指定された場合でも使用することが可能です。もちろん、 これらを ANSI C プログラムで使用することが望ましくないのは当然ですが、`\|\c .B \-ansi\c \&\|' をつけてコンパイルされる場合でも、インクルードされるヘッダファイル中に これらが記述できるということは有用です。 \c .B _\|_unix_\|_\c \& や \c .B _\|_vax_\|_\c \& などの代替定義済みマクロは、 `\|\c .B \-ansi\c \&\|' を指定する場合でも指定しない場合でも、利用可能となっています。 .Sp `\|\c .B \-ansi\c \&\|' オプションは、ANSI 準拠でないプログラムを不必要に拒否することは ありません。もしこのような動作を行なわせたい場合には`\|\c .B \-ansi\c \&\|'に加えて\c .B \-pedantic\c \&\|' オプションを指定する必要があります。 .Sp プリプロセッサ定義済みマクロ \c .B _\|_STRICT_ANSI_\|_\c \& が `\|\c .B \-ansi\c \&\|' オプションを使用した際には定義されます。いくつかのヘッダファイルは、この マクロを識別して、ANSI 標準が望まない関数やマクロの定義を抑制します。 これは、 それらの関数やマクロと同じ名前を別の目的で使用するプログラム を混乱させないようにするためです。 .TP .B \-fno\-asm \c .B asm\c \&, \c .B inline\c \&, \c .B typeof\c \& をキーワードとして解釈しません。 これらの単語は識別子として解釈されるようになります。これらの代用として \c .B _\|_asm_\|_\c \&, \c .B _\|_inline_\|_\c \&, \c .B _\|_typeof_\|_\c \& が使用できます。 `\|\c .B \-ansi\c \&\|' を指定すると、暗黙のうちに `\|\c .B \-fno\-asm\c \&\|' を指定したものとみなされます。 .TP .B \-fno\-builtin ビルトイン関数のうち、2 つのアンダースコアで始まるもの以外を認識しなくなり ます。現在、この指定は\c .B _exit\c \&, .B abort\c \&, \c .B abs\c \&, \c .B alloca\c \&, \c .B cos\c \&, \c .B exit\c \&, .B fabs\c \&, \c .B labs\c \&, \c .B memcmp\c \&, \c .B memcpy\c \&, \c .B sin\c \&, .B sqrt\c \&, \c .B strcmp\c \&, \c .B strcpy\c \&, \c .B strlen\c \& の関数に影響を及ぼします。 .Sp `\|\c .B \-ansi\c \&\|' オプションを指定すると、\c .B alloca\c \& と \c .B _exit\c \& はビルトイン関数として扱われなくなります。 .TP .B \-fno\-strict\-prototype `\|\c .B int foo ();\c \&\|' のような、引数を指定しない関数宣言を、C 言語のように引数の数や 型について何の仮定もしないという扱いにします (C++ のみ)。通常はこのよう な宣言は、C++ では \c .B foo\c \& という関数が 1 つも引数をとらないことを意味します。 .TP .B \-trigraphs ANSI C のトライグラフを使用可能とします。`\|\c .B \-ansi\c \&\|' オプションを指定すると、暗黙のうちに `\|\c .B \-trigraphs\c \&\|' を指定したものとみなされます。 .TP .B \-traditional 伝統的な C コンパイラのいくつかの特徴をサポートします。詳しくは GNU C の マニュアルを参照してください。以前はここにそのリストの複製を載せていましたが、 それらが完全に時代遅れになった時に我々に文句が来ないように削除してしまいま した。 .Sp しかし、C++ のプログラムだけについて (C ではありません) 特記しておくこと が 1 つあります。 `\|\c .B \-traditional\c \&\|' オプションは C++ に対して 1 つだけ特別な効果を持ちます。それは、 .B this への代入を許可するというものです。これは `\|\c .B \-fthis\-is\-variable\c \&\|'オプションの指定が及ぼす効果と同一のものです。 .TP .B \-traditional\-cpp 伝統的な C プリプロセッサのいくつかの特徴をサポートします。これは上に挙 げた中で特にプリプロセッサに関係したものを含みますが、 `\|\c .B \-traditional\c \&\|' の指定によって引き起こされる以外の効果を及ぼすことはありません。 .TP .B \-fdollars\-in\-identifiers 識別子中の `\|\c .B $\c \&\|' の使用を許可します (C++ のみ)。 `\|\c .B \-fno\-dollars\-in\-identifiers\c \&\|' を使用することによって、明示的に `\|\c .B $\c \&\|'の使用を禁止することも可能です。(GNU C++ では、デフォルトで `\|\c .B $\c \&\|' を許可しているシステムと禁止しているシステムがあります)。 .TP .B \-fenum\-int\-equiv \c .B int\c \& から列挙型への暗黙の変換を許可します (C++ のみ)。通常は GNU C++ は \c .B enum\c \& から \c .B int\c \& への変換は許可していますが、 逆は許していません。 .TP .B \-fexternal\-templates テンプレート関数について、その関数が定義された場所にのみ単一のコピー を生成することによって、テンプレート宣言に対してより小さなコードを生成 します (C++ のみ)。このオプションを使用して正しいコードを得るためには、 テンプレートを使用する全てのファイルにおいて、`\|\c .B #pragma implementation\c \&\|' (定義) または `\|\c .B #pragma interface\c \&\|' (宣言) を記述しておく必要があります。 `\|\c .B \-fexternal\-templates\c \&\|' を指定してコンパイルを行なう場合には、全てのテンプレートの 実体は external となります。全ての使用される実体はインプリメンテーション ファイル中にまとめて記述しておかなければなりません。これはその必要とされ る実体に対応した \c .B typedef\c \& 宣言を行なうことによって実現できます。 逆に、デフォルトのオプション `\|\c .B \-fno\-external\-templates\c \&\|' でコンパイルした場合には全てのテンプレートの実体は internal と なります。 .TP .B \-fall\-virtual 可能な限り全てのメンバ関数を暗黙のうちに仮想関数として扱います。 全てのメンバ関数 (コンストラクタと .B new , .B delete メンバ演算子を除きます) は、出現した時点でそのクラスの仮想関数とし て扱われます。 .Sp これは、これらのメンバ関数への全ての呼び出しが仮想関数のための内部 テーブルを参照して間接的に決定されるということを意味しません。特定の状況 においては、コンパイラは与えられた仮想関数への呼び出しを直接決定できます。 このような場合にはその関数呼び出しは常に直接呼び出しとなります。 .TP .B \-fcond\-mismatch 条件演算子の第 2, 第 3 引数の型が異なる記述を許します。このような式の型は void となります。 .TP .B \-fthis\-is\-variable \c .B this\c \& への代入を許可します (C++ のみ)。ユーザ定義による記憶管理が可 能となった現在では、 `\|\c .B this\c \&\|' への代入は時代遅れのものとなりました。従ってデフォルトでは、クラスの メンバ関数からの \c .B this\c \& への代入は不当なものとして扱われています。しかし、後方互換性のために、 `\|\c .B \-fthis-is-variable\c \&\|' を指定することによってこの効果を得ることができます。 .TP .B \-funsigned\-char \c .B char\c \& 型を \c .B unsigned char\c \& のように符号無しとして扱います。 .Sp それぞれのマシンには \c .B char\c \& がどちらであるべきかというデフォルトがあります。 デフォルトで \c .B unsigned char\c \& であることもあれば、デフォルトで .B signed char\c \& であることもあります。 .Sp 理想的には、可搬性のあるプログラムは、オブジェクトの符号の有無に依 存する記述を行なう場合には常に \c .B signed char\c \&、もしくは .B unsigned char\c \& を使用すべきです。 しかし実際には多くのプログラムが単なる \c .B char\c \& を用いて記述されており、さらにそのプログラムを記述した 環境に依存して、符号付きである、あるいは符号無しであるという暗黙の仮定が 行なわれています。このオプション、あるいはこの逆のオプションは、デフォル トと逆の動作を行なわせることにより、これらのプログラムを正しく動作させ ることを可能にします。 .Sp \c .B char\c \& 型は常に .B signed char\c \& あるいは \c .B unsigned char\c \& とは区別された型として扱われます。常にそれらの振舞いがそのどち らかと全く同じであるということに関わらず、このような扱いを行います。 .TP .B \-fsigned\-char \c .B char\c \& 型を \c .B signed char\c \& 型のように符号付きとして扱います。 .Sp ただし、このオプションは `\|\c .B \-fno\-unsigned\-char\c \&\|' と等価です。これは `\|\c .B \-funsigned\-char\c \&\|'の否定形です。同様に `\|\c .B \-fno\-signed\-char\c \&\|' は `\|\c .B \-funsigned\-char\c \&\|' と等価です。 .TP .B \-fsigned\-bitfields .TP .B \-funsigned\-bitfields .TP .B \-fno\-signed\-bitfields .TP .B \-fno\-unsigned\-bitfields これらのオプションは、明示的に `\|\c .B signed\c \&\|' または `\|\c .B unsigned\c \&\|' の指定が行なわれていないビットフィールドに対して、符号つきであるかある いは符号なしであるかを制御します。デフォルトではこのようなビットフィール ドは符号つきとなっています。なぜなら、 .B int\c \& のような基本的な型は符号つきであるという点で、整合性がとれるからです。 .Sp ただし、`\|\c .B \-traditional\c \&\|' を指定した場合は、ビットフィールドは常に全て符号無しであるとされます。 .TP .B \-fwritable\-strings 文字列定数を書き込み可能なデータセグメントに配置し、同内容の文字列を 1 つの共有オブジェクトにする処理を行いません。これは、文字定数に書き込む ことができることを仮定した昔のプログラムとの互換性をとるために提供され ています。`\|\c .B \-traditional\c \&\|' オプションも同様の効果を含みます。 .Sp 文字定数に書き込むという考えは非常によくない考えです。\*(lq定数\*(rq はまさに定数であり、変化すべきではありません。 .PP .SH プリプロセッサオプション これらのオプションは C プリプロセッサを制御します。 各 C ソースファイルは、実際にコンパイルする前に、C プリプロセッサに かけられます。 .PP `\|\c .B \-E\c \&\|' オプションを使用すると、GCC はプリプロセス以外の処理を行いません。 以下に示すオプションのうちのいくつかは、`\|\c .B \-E\c \&\|' と同時に使用された時のみ意味をもちます。なぜならば、これらのオプション によって、実際のコンパイルには不適当なプリプロセッサ出力が生成されるためです。 .TP .BI "\-include " "file" \c .I file\c \& を、通常の入力ファイルが処理される前に処理します。結果的に \c .I file\c \& に含まれる内容は、一番最初にコンパイルされることになります。コマンドラ インに指定されたすべての `\|\c .B \-D\c \&\|' や `\|\c .B \-U\c \&\|' オプションは、その記述された順番に関わらず常に `\|\c .B \-include \c .I file\c \&\c \&\|' が処理される前に処理されます。全ての `\|\c .B \-include\c \&\|' や `\|\c .B \-imacros\c \&\|' オプションは、それらが記述された順番通りに処理されます。 .TP .BI "\-imacros " file 通常の入力ファイルを処理する前に\c .I file\c \& を入力として処理しますが、その結果の出力を捨てます。 .I file\c \& によって生成された出力は捨てられるため、`\|\c .B \-imacros \c .I file\c \&\c \&\|' の処理結果の影響は、\c .I file\c \& 中に記述されたマクロがメインの入力ファイル中で使用可能になることだけです。 プリプロセッサは、`\|\c .B \-imacros \c .I file\c \&\|' が記述された順番に関わらず、これを処理する前に、 コマンドラインから与えられた全ての `\|\c .B \-D\c \&\|' や `\|\c .B \-U\c \&\|' オプションを評価します。全ての `\|\c .B \-include\c \&\|' および `\|\c .B \-imacros\c \&\|' オプションは、それらが記述された順番通りに処理されます。 .TP .BI "\-idirafter " "dir" ディレクトリ \c .I dir\c \& を第 2 インクルードパスに加えます。第 2 インクルードパス中のディレクトリは、 メインインクルードパス (オプション `\|\c .B \-I\c \&\|' によって追加されます) 中にヘッダファイルを探した結果発見できな かった場合に検索されます。 .TP .BI "\-iprefix " "prefix" \c .I prefix\c \& を、その後に続く `\|\c .B \-iwithprefix\c \&\|' オプション用のプレフィックスとして使用します。 .TP .BI "\-iwithprefix " "dir" ディレクトリを第 2 インクルードパスに追加します。ディレクトリ名は \c .I prefix\c \& と \c .I dir\c \& を連結することによって得られます。ここで \c .I prefix は、`\|\c .B \-iprefix\c \&\|' オプションによって指定されたものです。 .TP .B \-nostdinc ヘッダファイルのための標準のシステムディレクトリを検索しません。`\|\c .B \-I\c \&\|' オプションによって指定したディレクトリ (またはカレントディレクト リ) のみを検索します。 .Sp `\|\c .B \-nostdinc\c \&\|' と `\|\c .B \-I\-\c \&\|'を使用することにより、インクルードファイルの検索パスを明示的に指 定したディレクトリのみに限定することが可能となります。 .TP .B \-nostdinc++ ヘッダファイルの検索に、C++\-固有の標準ディレクトリを用いません。ただ しそれ以外の標準ディレクトリは検索されます。 (このオプションは `\|\c .B libg++\c \&\|' の構築に使用されます。) .TP .B \-undef 標準でない定義済みマクロ(アーキテクチャフラグも含めて)を定義しません。 .TP .B \-E C プリプロセッサの処理のみを行います。指定された全ての C のソースファイル に対してプリプロセスを行ない、標準出力、または指定された出力ファイルに 対して出力を行います。 .TP .B \-C プリプロセッサに対してコメントの削除を行なわないように指示します。 `\|\c .B \-E\c \&\|' オプションとともに使用されます。 .TP .B \-P プリプロセッサに対して `\|\c .B #line\c \&\|' コマンドを生成しないように指示します。 `\|\c .B \-E\c \&\|' オプションとともに使用されます。 .TP .B \-M\ [ \-MG ] プリプロセッサに対して\c .B make で使用可能な、オブジェクト間の依存関係を記述した出力を生成するように指示 します。それぞれのソースファイルに対して、プリプロセッサは\c .B make\c \& のための規則を 1 つ出力します。この出力は、ターゲットとして そのソースファイルから生成されるオブジェクトファイルのファイル名をとり、 依存するファイルのリストとしては `\|\c .B #include\c \&\|' によってソースファイルに 読み込まれる全てのファイルの名前が並びます。この 規則は 1 行、あるいは長い場合には`\|\c .B \e\c \&\|' と改行を入れて複数行で出力されます。この規則のリストは、プリプロセス済 みの C プログラムのかわりに、標準出力へと出力されます。 .Sp `\|\c .B \-M\c \&\|' は暗黙のうちに `\|\c .B \-E\c \&\|' を含みます。 .Sp `\|\c .B \-MG\c \&\|' を指定すると、見つからないヘッダファイルは生成されたファイルであり、 それらはソースファイルと同じディレクトリに存在するとみなします。 これは `\|\c .B \-M\c \&\|' と同時に指定しなければなりません。 .TP .B \-MM\ [ \-MG ] `\|\c .B \-M\c \&\|' と似ていますが、`\|\c .B #include "\c .I file\c .B \&"\c \&\|'によってインクルードされるユーザ定義のヘッダファイルのみを対象に した出力ファイルを生成します。`\|\c .B #include <\c .I file\c .B \&>\c \&\|' によってインクルードされるシステムヘッダファイルは省略されます。 .TP .B \-MD `\|\c .B \-M\c \&\|' と似ていますが、依存情報は出力ファイル名の最後の `\|\c .B .o\c \&\|' を `\|\c .B .d\c \&\|' に置き換えたファイル名のファイルに対して出力されます。 \&`\|\c .B \-MD\c \&\|' を指定したファイルのコンパイルもこれに加えて行なわれ、 `\|\c .B \-M\c \&\|' のように通常のコンパイルを抑制することはありません。 .Sp Mach のユーティリティである`\|\c .B md\c \&\|' は、これらの複数の `\|\c .B .d\c \&\|' ファイルを `\|\c .B make\c \&\|' コマンドによって使用できる単一の依存記述ファイルへとマージするのに使用 することができます。 .TP .B \-MMD `\|\c .B \-MD\c \&\|' と似ていますが、ユーザヘッダファイルのみを対象とし、システムヘッダ ファイルを無視します。 .TP .B \-H 通常の動作に加えて、使用されたヘッダファイルの名前を表示します。 .TP .BI "\-A" "question" ( answer ) .I question\c に対するアサーション .I answer \& を定義します。これは `\|\c .BI "#if #" question ( answer )\c \&\|' のようなプリプロセッサ条件節によってテストされます。`\|\c .B \-A\-\c \&\|' は標準のアサーション(通常はターゲットマシンに関 する情報を表している)を禁止します。 .TP .BI \-D macro マクロ \c .I macro\c \& に対して文字列 `\|\c .B 1\c \&\|' を定義として与えます。 .TP .BI \-D macro = defn マクロ \c .I macro\c \& を \c .I defn\c \& として定義します。コマンドライン上の全ての `\|\c .B \-D\c \&\|' オプションは `\|\c .B \-U\c \&\|' オプションの処理を行なう前に処理されます。 .TP .BI \-U macro マクロ \c .I macro\c \& の定義を無効にします。`\|\c .B \-U\c \&\|' オプションは全ての `\|\c .B \-D\c \&\|' オプションの処理が終了した後、`\|\c .B \-include\c \&\|' と `\|\c .B \-imacros\c \&\|' オプションの処理の前に処理されます。 .TP .B \-dM プリプロセッサに対して、プリプロセス終了時に有効であったマクロの定義の みを出力するように指示します。`\|\c .B \-E\c \&\|' オプションとともに使用します。 .TP .B \-dD プリプロセッサに対して、全てのマクロ定義を適切な順番で出力中にそのまま 出力するように指示します。 .TP .B \-dN `\|\c .B \-dD\c \&\|' と似ていますが、マクロの引数と内容を削除します。 出力には`\|\c .B #define \c .I name\c \&\c \&\|' のみが含まれます。 .PP .SH アセンブラオプション .TP .BI "\-Wa," "option" \c .I option\c \& をアセンブラに対するオプションとして渡します。\c .I option がコンマを含む場合は、そのコンマで区切られた複数のオプションとして与え られます。 .PP .SH リンカオプション これらのオプションは、コンパイラがオブジェクトファイル群をリンクして 1 つ の実行可能ファイルを出力する際に使用されるものです。これらはコンパイラが リンクステップを行なわない場合には意味を持ちません。 .TP .I object-file-name 特別に認識される拡張子で終っていないファイル名は、オブジェクトファイル、 またはライブラリであると認識されます。(オブジェクトファイルとライブラリ はリンカがその内容を参照することで区別されます。) GCC がリンクステップを 行なう場合は、これらのファイルはリンカへの入力として使用されます。 .TP .BI \-l library 名前が .I library\c \& であるライブラリをリンク時に使用します。 .Sp リンカは、標準のライブラリ用ディレクトリのリスト中から、 実際のファイル名が `\|\c .B lib\c .I library\c \&.a\c \&\|' であるファイルを検索します。リンカはこのファイルを、ファイル 名で直接指定した場合と同様に使用します。 .Sp 検索するディレクトリには、いくつかの標準システムディレクトリと、`\|\c .B \-L\c \&\|' によって指定したディレクトリが含まれます。 .Sp 通常、この方法で発見されるファイルはライブラリファイル、つまりいくつかの オブジェクトファイルをメンバとして含むアーカイブファイルです。 リンカは、アーカイブファイルの中を検索して、 参照されているが定義されていないシンボルを定義しているメンバを 探し出します。 しかし、もしリンカがライブラリでなく通常のオブジェクトファイルを発見した 場合は、そのオブジェクトファイルを通常の方法でリンクします。`\|\c .B \-l\c \&\|' オプションを使用する場合とファイル名を直接指定する場合の違いは、`\|\c .B \-l\c \&\|' の場合が .I library を `\|\c .B lib\c \&\|' と `\|\c .B .a\c \&\|' で囲み、いくつものディレクトリを検索することだけです。 .TP .B \-lobjc Objective C のプログラムをリンクする場合は、この特別な .B \-l オプションを指定する必要があります。 .TP .B \-nostartfiles リンク時に、標準のシステムスタートアップファイルを使用しません。 標準ライブラリは通常通りに使用されます。 .TP .B \-nostdlib リンク時に、標準のシステムライブラリとスタートアップファイルを使用しません。 指定したファイルのみがリンカに渡されます。 .TP .B \-static ダイナミックリンクをサポートするシステムにおいて、このオプションは共有 ライブラリとのリンクを抑制します。それ以外のシステムではこのオプションは 意味を持ちません。 .TP .B \-shared 他のオブジェクトとリンクして実行可能プログラムを形成し得る共有オブジェクトを 生成します。ごく少数のシステムでのみ、このオプションはサポートされ ています。 .TP .B \-symbolic 共有オブジェクトを構築する際に、グローバルなシンボルへの参照をバインド します。全ての解決できなかった参照に対して警告を与えます (ただしリンクエディタオプション `\|\c .B \-Xlinker \-z \-Xlinker defs\c \&\|' によってこれを無効化した場合を除きます)。ごく少数のシステムでのみ、 このオプションはサポートされています。 .TP .BI "\-Xlinker " "option" オプション \c .I option をリンカに対して渡します。リンカに渡すシステム固有のオプションが、 GNU CC が理解できないものである場合に利用できます。 .Sp 引数を持ったオプションを渡したい場合は、 `\|\c .B \-Xlinker\c \&\|' を 2 度使用すれば可能です。1 度目でオプションを渡し、2 度目で引数を 渡します。例えば `\|\c .B \-assert definitions\c \&\|' を渡すには、 `\|\c .B \-Xlinker \-assert \-Xlinker definitions\c \&\|' のように記述すれば可能です。 `\|\c .B \-Xlinker "\-assert definitions"\c \&\|' のように指定した場合は正常に動作しません。なぜならこれは、文字列全 体を 1 つの引数として渡してしまい、リンカの期待する形式と異なってしま うからです。 .TP .BI "\-Wl," "option" オプション \c .I option\c \& をリンカに渡します。\c .I option\c \& がコンマを含む場合は、それらのコンマで複数のオプションとして分割されます。 .TP .BI "\-u " "symbol" シンボル .I symbol が未定義であるかのように振舞います。これは強制的にこのシンボルを定義してい るライブラリモジュールをリンクするために使用します。`\|\c .B \-u\c \&\|' は異なったシンボルに対して複数回使用することができます。これによっ て、さらに多くのライブラリモジュールを読み込ませることができます。 .SH ディレクトリオプション これらのオプションは、ヘッダファイル、ライブラリ、コンパイラの一部を検 索するディレクトリを指定するために使用されます。 .TP .BI "\-I" "dir" ディレクトリ \c .I dir\c \& を、インクルードファイルの検索するディレクトリのリスト中に追加します。 .TP .B \-I\- `\|\c .B \-I\-\c \&\|' オプション指定前に `\|\c .B \-I\c \&\|' オプションによって指定された全てのディレクトリは、`\|\c .B #include "\c .I file\c .B \&"\c \&\|' の形式によってのみ検索されます。 これらのディレクトリは `\|\c .B #include <\c .I file\c .B \&>\c \&\|' によっては検索されません。 .Sp \&\|` .B \-I\-\c \&\|' オプション指定後に `\|\c .B \-I\c \&\|' で指定したディレクトリは、全ての `\|\c .B #include\c \&\|' 命令によって検索されます。(通常は \c .I 全ての\c \& `\|\c .B \-I\c \&\|' で指定されたディレクトリは この方法で検索されます。) .Sp これに加えて `\|\c .B \-I\-\c \&\|' オプションは、カレントディレクトリ (現在の入力ファイルが存在する ディレクトリ) が `\|\c .B #include "\c .I file\c .B \&"\c \&\|' に対する最初の検索対象となることを抑制します。`\|\c .B \-I\-\c \&\|' によるこの効果を上書きする方法はありません。`\|\c .B \-I.\c \&\|' を指定することによって、コンパイラが起動されたディレクトリが検索 されることを指定することは可能です。これはプリプロセッサが行なう デフォルトの動作とは異なりますが、たいていはこれで十分です。 .Sp `\|\c .B \-I\-\c \&\|' は、ヘッダファイルの検索に標準のシステムディレクトリを使うことを抑制 するわけではありません。 従って、`\|\c .B \-I\-\c \&\|' と `\|\c .B \-nostdinc\c \&\|' は 独立です。 .TP .BI "\-L" "dir" ディレクトリ\c .I dir\c \& を `\|\c .B \-l\c \&\|' による検索が行なわれるディレクトリのリストに加えます。 .TP .BI "\-B" "prefix" このオプションはコンパイラ自身の実行形式、ライブラリ、データファイルの 検索場所を指定します。 .Sp コンパイラドライバはサブプログラム `\|\c .B cpp\c \&\|', `\|\c .B cc1\c \&\|' (または C++ においては `\|\c .B cc1plus\c \&\|'), `\|\c .B as\c \&\|', そして `\|\c .B ld\c \&\|' を 1 つ、あるいはそれ以上起動します。コンパイラドライバは、 起動するプログラムのプレフィックスとして .I prefix\c \& に `\|\c .I machine\c .B /\c .I version\c .B /\c \&\|' をつけたものとつけないものの双方を 使用します。 .Sp コンパイラドライバは各サブプログラムの起動時に、 `\|\c .B \-B\c \&\|' プレフィックスの指定がある場合は、それを最初に利用します。もしその 名前が見つからなければ、または `\|\c .B \-B\c \&\|' が指定されていなければ、ドライバは 2 つの標準プレフィックス `\|\c .B /usr/lib/gcc/\c \&\|' と `\|\c .B /usr/local/lib/gcc-lib/\c \&\|' を試します。このどちらにも見つからなければ、コンパイラドライバは、 環境変数 `\|\c .B PATH\c \&\|' のディレクトリリストを利用して、そのプログラム名を検索します。 .Sp ランタイムサポートファイル `\|\c .B libgcc.a\c \&\|' も、必要ならば `\|\c .B \-B\c \&\|' プレフィックスを用いて検索されます。もしそこに見つからなければ、 前記 2 つの標準プレフィックスが試みられますが、それで終りです。この場合は リンクの対象から外されます。ほとんどの場合、またほとんどのマシンでは、`\|\c .B libgcc.a\c \&\|' は実際には必要ではありません。 .Sp これと同じ効果を、環境変数 .B GCC_EXEC_PREFIX\c \& によっても得ることができます。もしこの環境変数が定義されていれば、こ の値がプレフィックスとして同様に使用されます。もし `\|\c .B \-B\c \&\|' オプションと .B GCC_EXEC_PREFIX\c \& 環境変数の双方が存在した場合は、`\|\c .B \-B\c \&\|' オプションが最初に使用され、環境変数は次に使用されます。 .SH 警告オプション 警告は、本質的に間違いであるわけではありませんが、危険な構造を報告したり、 エラーがあるかもしれないような部分を示唆する診断メッセージです。 .Sp 以下のオプションは、GNU CC が生成する警告の量と種類を制御します。 .TP .B \-fsyntax\-only コードの文法エラーをチェックしますが、一切出力は行いません。 .TP .B \-w 全ての警告メッセージを抑制します。 .TP .B \-Wno\-import .BR #import の利用による警告メッセージを抑制します。 .TP .B \-pedantic 厳密な ANSI 標準 C 言語で規定している全ての警告を表示し、許されていない拡張を 使用したプログラムを全て拒否します。 .Sp 正当な ANSI 標準 C プログラムは、このオプションの有無に関わらず コンパイルできるべきです (もっとも、ほんのわずかではありますが `\|\c .B \-ansi\c \&\|' を必要とするものはあります)。しかし、このオプションを使用しない場合、 GNU 拡張や伝統的な C の特徴も、これに加えてサポートされます。このオプション を使用すれば、それらは拒絶されます。このオプションを\c .I 使う\c \&理由はありませんが、こだわりのある人々を満足させるためにのみ 存在しています。 .Sp `\|\c .B \-pedantic\c \&\|' は、始まりと終りとが `\|\c .B _\|_\c \&\|' である代替キーワードの使用については、警告しません。 同様に .B _\|_extension_\|_\c \& に続く表現についても警告しません。しかし、システムヘッダファイルのみ がこの抜け道を使用すべきであり、アプリケーションプログラムはこれを避け るべきです。 .TP .B \-pedantic\-errors `\|\c .B \-pedantic\c \&\|' と似ていますが、警告のかわりにエラーを出します。 .TP .B \-W 以下のイベントに対して、特別な警告メッセージを表示します。 .TP \ \ \ \(bu volatile でない自動変数が .B longjmp\c \& の呼び出しによって変更され得る場合です。これらの警告は、最適化コンパイル の時のみ問題になり得ます。 .Sp コンパイラは .B setjmp\c \& の呼び出しのみを見ています。コンパイラは、どこで \c .B longjmp\c \& が呼び出されるかを知ることはできません。実際には、シグナルハンドラは コード中の任意の場所で .B longjmp\c \& を呼び出すことができます。従って、実際には \c .B longjmp\c \& への呼び出しが危険な部分からはおこなわれていないために問題のないプ ログラムであっても、警告が発せられることになります。 .TP \ \ \ \(bu 関数が、値を伴ってリターンする場合と、値を伴わずにリターンする場合の両方 が起こりうる場合です。 (関数の最後を抜けていくことは、値を伴わずに関数をリターンするとみなされます。) 例えば、次の関数がこの種類の警告を引き起こします。 .Sp .nf foo (a) { if (a > 0) return a; } .Sp .fi ある関数 (\c .B abort\c \& や\c .B longjmp\c \& を含む) が決してリターンしないということを GNU CC が理解できないために、にせの警告 が発生するかもしれません。 .TP \ \ \ \(bu 式文 (expression-statement) またはコンマ式の左部分が 一切の副作用を含まない場合です。 警告を抑制するには、使用しない式を void にキャストして下さい。 例えば `\|\c .B x[i,j]\c \&\|' といった式は警告されますが、`\|\c .B x[(void)i,j]\c \&\|' は警告されません。 .TP \ \ \ \(bu 符号無しの値が 0 と `\|\c .B >\c \&\|' または `\|\c .B <=\c \&\|' で比較される場合です。 .PP .TP .B \-Wimplicit 関数やパラメータに対する暗黙の宣言に対して常に警告します。 .TP .B \-Wreturn\-type 関数の戻り値の型が、デフォルトである \c .B int\c \& に定義された時に常に警告します。また、戻り値の型が \c .B void\c でない関数内に、戻り値のない \c .B return\c \& 文がある場合にも常に警告します。 .TP .B \-Wunused ローカル変数が宣言されたにも関わらず使用されていない場合、静的に宣言さ れた関数の実体が定義されていない場合、計算結果が明らかに 利用されていない場合に常に警告します。 .TP .B \-Wswitch .B switch\c \& 文がインデックスとして列挙型をとっている時、その列挙型中のいくつ かの値に対する \c .B case\c \& が欠けている場合に常に警告します。(\c .B default\c \& ラベルが存在する場合、この警告は出ません。) このオプションを使用した場合 には、列挙型の範囲を越えた \c .B case\c \& ラベルも、常に警告されます。 .TP .B \-Wcomment コメントの開始文字列 `\|\c .B /\(**\c \&\|' がコメント中に現れた時に常に警告します。 .TP .B \-Wtrigraphs トライグラフの出現を常に警告します (トライグラフが使用可能であると仮定します)。 .TP .B \-Wformat .B printf\c \&, \c .B scanf\c \& などへの呼び出しに対して、与えられた引数が、フォーマット文字列の指 定を満足する型を持っているかを検査します。 .TP .B \-Wchar\-subscripts 配列の添字の型が .BR char であった場合に警告します。これはよくある間違いのもとです。 いくつかのマシンにおいてはこの型が符号付きであることを、 プログラマはしばしば忘れてしまいます。 .TP .B \-Wuninitialized 初期化されていない自動変数が使用されています。 .Sp これらの警告は、最適化コンパイルを行なう時のみ発生します。なぜなら、 コンパイラは最適化を行なう時にのみデータフロー情報を必要とするからです。 もし `\|\c .B \-O\c \&\|' を指定しなかった場合は、この警告を得ることはできません。 .Sp これらの警告は、レジスタ割り当ての対象となった変数についてのみ発生します。 従って、\c .B volatile\c \& であると宣言された変数や、アドレス上に割り当てられた変数、サイズが 1, 2, 4, 8 バイト以外の変数に関してはこれらの警告は発生しません。 さらに、構造体、共用体、配列については、たとえそれらがレジスタに 割り当てられたとしても、これらの警告は発生しません。 .Sp ある変数によって計算された値が結局使用されないような変数については、一切の 警告が生じないことに注意して下さい。このような計算は、警告が表示される前に データフロー解析によって削除されます。 .Sp これらの警告をオプションにした理由の一つは、GNU CC がまだあまり賢くなくて、 あるコードが一見間違いを含むかのように見えても それは実は正しいものかもしれない、 ということを GNU CC が理解できない、というものです。 ここにその 1 つの例を挙げます。 .Sp .nf { int x; switch (y) { case 1: x = 1; break; case 2: x = 4; break; case 3: x = 5; } foo (x); } .Sp .fi もし \c .B y\c \& の値が常に 1, 2 あるいは 3 である限りは \c .B x\c \& は常に 初期化されます。しかし GNU CC はこれを知ることはできません。もう 1 つの一般 的な例を挙げます。 .Sp .nf { int save_y; if (change_y) save_y = y, y = new_y; .\|.\|. if (change_y) y = save_y; } .Sp .fi これはバグを含みません。なぜなら \c .B save_y\c \& は、その値が設定された時のみ使用されるからです。 .Sp いくつかのにせの警告は、使用している決してリターンしない関数全てに対して .B volatile\c \& と宣言することによって防ぐことが可能です。 .TP .B \-Wparentheses ある特定の文脈中で括弧が省略されていた場合に警告します。 .TP .B \-Wtemplate\-debugging C++ プログラムにおいてテンプレートを使用している際に、デバッグが完全に 可能でない場合を警告します (C++ のみ)。 .TP .B \-Wall 全ての上に挙げた `\|\c .B \-W\c \&\|' オプションを結合したものです。これらのオプションは全て、 たとえマクロとの組み合わせ であっても、避けたほうがいいと我々が推奨する用法や、 簡単に避けることができると我々が信じている用法に関するものです。 .PP 残りの `\|\c .B \-W.\|.\|.\c \&\|' オプションは `\|\c .B \-Wall\c \&\|' によっては暗黙のうちに指定されません。なぜならこれらは、クリーンなプ ログラムにおいても、ある状況においては使用することが妥当であると我々が 考える構造についての警告を行なうオプションだからです。 .TP .B \-Wtraditional 伝統的な C と ANSI C において異なった振舞いをする特定の構造について警 告します。 .TP \ \ \ \(bu マクロ引数がマクロ本体内の文字列定数に現れるものです。これは、伝統的な C に おいてはその引数で置換しましたが、ANSI C においては定数の一部として扱わ れます。 .TP \ \ \ \(bu ブロック内で外部宣言であると宣言され、かつそのブロックの終端の後で 使用されている関数です。 .TP \ \ \ \(bu オペランドとして \c .B long\c \& 型をとる \c .B switch\c \& 文です。 .PP .TP .B \-Wshadow ローカル変数が他のローカル変数を隠している時に常に警告します。 .TP .BI "\-Wid\-clash\-" "len" 2 つの全く別の識別子の最初の \c .I len 文字が一致した時に警告します。これはある種の旧式な おばかさんコンパイラでコンパイルされ得るプログラムを作る場合に役に立ちます。 .TP .B \-Wpointer\-arith 関数型や \c .B void\c \& の \*(lqサイズ\*(rq に依存するものを全て警告します。GNU C はこれらに対して、 サイズ 1 を割り当てています。これは \c .B void \(**\c \& ポインタと関数へのポインタにおける計算を簡便にするためです。 .TP .B \-Wcast\-qual ポインタが、型修飾子が削除されるようにキャストされる全ての場合に警告します。 例えば \c .B const char \(**\c \& を 普通の \c .B char \(**\c \& にキャストした場合に警告がなされます。 .TP .B \-Wcast\-align ポインタのキャストにおいて、そのターゲットに要求される境界条件が 大きくなるようなキャストを全て警告します。例えば \c .B char \(**\c \& が \c .B int \(**\c \& へとキャストされると、整数が 2、あるいは 4 バイト境界でしかアクセスで きないマシンにおいては警告が発せられます。 .TP .B \-Wwrite\-strings 文字定数に対して、型 \c .B const char[\c .I length\c .B ]\c \& を与え、非-\c .B const\c \& の \c .B char \(** ポインタへのアドレスのコピーに対して警告するようにします。この警告は、 宣言とプロトタイプにおいて \c .B const\c \& の使用を非常に注意深くおこなっていさえすれば、 文字列定数に書き込みをしそうなコードをコンパイル時に発見することを助けますが、 そうでない場合は有害無益な指定です。これが、我々がこの警告を `\|\c .B \-Wall\c \&\|' のリクエストに含めなかった理由です。 .TP .B \-Wconversion 同じ引数が与えられた時に、プロトタイプが存在する場合とプロトタイプが 存在しない場合とで、異なった型変換を引き起こす場合について警告します。 これは固定小数点から浮動小数点への変換やその逆、デフォルトの動作と異なる固定 小数点引数の幅や符号の有無の変換が含まれます。 .TP .B \-Waggregate\-return 構造体や共用体を返す関数を定義した場合や、 それらを呼び出す全ての場合に警告します。 (配列を返すことができる言語においても、これは警告を引き起こします。) .TP .B \-Wstrict\-prototypes 引数の型を指定せずに関数を宣言、あるいは定義した場合に警告します。 (以前に引数の型を指定した宣言が存在する場合には、旧式の関数宣言に対しては 警告をしません。) .TP .B \-Wmissing\-declarations グローバルな関数を、その前にプロトタイプ宣言をせずに定義した場合に 警告します。 この警告は、たとえその定義自身がプロトタイプを含んでいたとしても発生します。 この警告の目的は、ヘッダファイル中にグローバル関数の定義を忘れるこ とを防ぐことにあります。 .TP .B \-Wredundant-decls 同一スコープ中で複数回、同一対象を宣言した場合に、たとえそれが正当で何も 変化させない場合であっても警告します。 .TP .B \-Wnested-externs 関数内で \c .B extern\c \& 宣言を行なった場合に警告します。 .TP .B \-Wenum\-clash 異なる列挙型の間で変換を行なった際に警告します (C++ のみ)。 .TP .B \-Woverloaded\-virtual (C++ のみ。) 導出クラスにおいて、仮想関数の定義は基底クラスで定義された仮想関数の型 の記述と一致していなければなりません。このオプションを使用することによっ て、基底クラスにおける仮想関数と同一の名前を持ち、基底クラスのいかなる 仮想関数とも異なった型の記述を持つ関数に対して警告が行われます。これに よって、導出クラスが仮想関数を定義しようとして失敗する場合を警告するこ とができます。 .TP .B \-Winline 関数がインライン宣言されている、あるいは .B \-finline\-functions オプションが与えられている場合に、関数をインライン展開できなかった場合 に警告します。 .TP .B \-Werror 警告をエラーとして扱います。警告の後にコンパイルを中断します。 .SH デバッグオプション GNU CC は、ユーザのプログラムや GCC の双方をデバッグするために、 多くのオプションを備えています。 .TP .B \-g オペレーティングシステムのネイティブのフォーマット (stabs, COFF, XCOFF, DWARF) でデバッグ情報を生成します。GDB はこのデバッグ情報に基づい て動作することができます。 .Sp stabs フォーマットを使用するほとんどのシステムにおいては、`\|\c .B \-g\c \&\|' を指定すると、GDB だけが使用できる余分なデバッグ情報が使用可能に なります。 この特別の情報は GDB に対してはよりよいデバッグを行なうことを可能 としますが、おそらく他のデバッガに対してはクラッシュ、あるいはそのプログラムを 読めなくしてしまいます。この特別な情報の生成を制御するためには `\|\c .B \-gstabs+\c \&\|', `\|\c .B \-gstabs\c \&\|', `\|\c .B \-gxcoff+\c \&\|', `\|\c .B \-gxcoff\c \&\|', `\|\c .B \-gdwarf+\c \&\|', `\|\c .B \-gdwarf\c \&\|' を使用してください (下記参照)。 .Sp 他の多くの C コンパイラと異なり、GNU CC は `\|\c .B \-g\c \&\|' を `\|\c .B \-O\c \&\|' とともに使用することを許しています。最適化されたコードが通る近道は、 時には驚くべき結果を生み出すかもしれません。 定義したはずの変数が存在しなかったり、 制御の流れが予想もしなかった場所に移動したり、結果が定数とわかる計算や、 結果がすでに手元にある文は実行されなくなり、ある文がループの外に追い出されて 別の場所で実行されたりします。 .Sp それにも関わらず、このオプションは最適化された出力のデバッグを可能とし ています。これによって、バグを含むかもしれないプログラムに対して オプティマイザを使用することができるようになります。 .PP 以下のオプションは、GNU CC を 1 つ以上のデバッグフォーマットを扱 えるように作成してある場合に有益です。 .TP .B \-ggdb (もしサポートされていれば)ネイティブのフォーマットでデバッグ情報を生成 します。これは可能な限りの全ての GDB 拡張を含みます。 .TP .B \-gstabs (もしサポートされていれば) stabs フォーマットでデバッグ情報を生成します。 ただし GDB 拡張は含みません。このフォーマットはほとんどの BSD システム上 の DBX で利用できるフォーマットです。 .TP .B \-gstabs+ (もしサポートされていれば) stabs フォーマットでデバッグ情報を生成します。 ただし GNU デバッガ (GDB) でしか理解できない GNU 拡張を使用します。 この拡張を使用すると、他のデバッガでは、クラッシュや プログラムが読めなくなるなどの影響がおそらく出ます。 .TP .B \-gcoff (サポートされていれば) COFF フォーマットでデバッグ情報を生成します。 これは、System V Release 4 より前の ほとんどの System V 上の SDB で利用できるフォーマットです。 .TP .B \-gxcoff (サポートされていれば) XCOFF フォーマットでデバッグ情報を生成します。こ れは IBM RS/6000 システムにおいて DBX デバッガによって使用される フォーマットです。 .TP .B \-gxcoff+ (もしサポートされていれば) XCOFF フォーマットでデバッグ情報の生成を行 います。ただし、GNU デバッガ (GDB) によってのみ理解され得る GNU 拡張を使 用します。これらの拡張を使用すると、他のデバッガに対してはクラッシュやプ ログラムを読みとり不能にするなどの影響を及ぼし得ます。 .TP .B \-gdwarf (もしサポートされていれば) DWARF フォーマットでデバッグ情報の生成を行 います。これはほとんどの System V Release 4 システムにおいて SDB によっ て使用される形式です。 .TP .B \-gdwarf+ (もしサポートされていれば) DAWRF フォーマットでデバッグ情報の生成を行 います。ただし、GNU デバッガ (GDB) によってのみ理解され得る GNU 拡張を使 用します。これらの拡張を使用すると、他のデバッガに対してはクラッシュや プログラムを読みとり不能にするなどの影響を及ぼし得ます。 .PP .BI "\-g" "level" .br .BI "\-ggdb" "level" .br .BI "\-gstabs" "level" .br .BI "\-gcoff" "level" .BI "\-gxcoff" "level" .TP .BI "\-gdwarf" "level" デバッグ情報を要求しますが、同時に \c .I level\c \& によってどの程度の情報が必要かを指定します。デフォルトのレベルは 2 です。 .Sp レベル 1 は、デバッグを予定しないプログラムの部分に対してバックトレース を生成するに十分な最低限の情報を生成します。これは関数と外部変数の記述 を含みますが、ローカル変数や行番号に関する情報は含みません。 .Sp レベル 3 はプログラムに含まれる全てのマクロ定義などの特別な情報を含みます。 いくつかのデバッガは `\|\c .B \-g3\c \&\|' の使用によってマクロの展開をサポートします。 .TP .B \-p プログラム \c .B prof\c \& によって使用されるプロファイル情報を書き込む特別なコードを生成します。 .TP .B \-pg プログラム \c .B gprof\c \& によって使用されるプロファイル情報を書き込む特別なコードを生成します。 .TP .B \-a 基本ブロックのプロファイル情報を書き込む特別なコードを生成します。これは それぞれのブロックが何回実行されたかを記録します。このデータは \c .B tcov\c \& のようなプログラムによって解析されます。ただし、このデータフォーマットは \c .B tcov\c \& が期待するものとは異なっています。最終的には、GNU \c .B gprof\c \& が処理できるように拡張されるべきです。 .TP .BI "\-d" "letters" コンパイル中の .I letters\c \& で指定されるタイミングに、デバッグ用のダンプを生成するように指示します。 これはコンパイラをデバッグするために使用されます。ほとんどのダンプのファイル 名はソースファイル名に 1 単語をつなげたものになります。(例えば、`\|\c .B foo.c.rtl\c \&\|' や `\|\c .B foo.c.jump\c \&\|' などです)。 .TP .B \-dM 全てのマクロ定義をダンプし、プリプロセス終了時に出力に書き出します。 その他には何も書き出しません。 .TP .B \-dN 全てのマクロ名をダンプし、プリプロセス終了時に出力に書き出します。 .TP .B \-dD 全てのマクロ定義をプリプロセス終了時に通常の出力に加えてダンプします。 .TP .B \-dy パース中にデバッグ情報を標準エラー出力にダンプします。 .TP .B \-dr RTL 生成後に `\|\c .I file\c .B \&.rtl\c \&\|' に対してダンプします。 .TP .B \-dx 関数をコンパイルするかわりに、RTL を生成するのみの処理を行います。通常は `\|\c .B r\c \&\|' とともに使用されます。 .TP .B \-dj 最初のジャンプ最適化の後に、`\|\c .I file\c .B \&.jump\c \&\|' に対してダンプします。 .TP .B \-ds 共通部分式削除 (しばしば共通部分式削除に続くジャンプ最適化も含みます) の終了 時に `\|\c .I file\c .B \&.cse\c \&\|' に対してダンプします。 .TP .B \-dL ループ最適化終了時に `\|\c .I file\c .B \&.loop\c \&\|' に対してダンプします。 .TP .B \-dt 第 2 共通部分式削除段階 (しばしば共通部分式削除に続くジャンプ最適化も 含みます) の終了時に、`\|\c .I file\c .B \&.cse2\c \&\|' に対してダンプします。 .TP .B \-df フロー解析終了後に、`\|\c .I file\c .B \&.flow\c \&\|' に対してダンプします。 .TP .B \-dc 命令コンビネーション終了時に `\|\c .I file\c .B \&.combine\c \&\|' に対してダンプします。 .TP .B \-dS 第 1 命令スケジューリング段階終了時に `\|\c .I file\c .B \&.sched\c \&\|' に対してダンプします。 .TP .B \-dl ローカルレジスタ割り当て終了時に `\|\c .I file\c .B \&.lreg\c \&\|' に対してダンプします。 .TP .B \-dg グローバルレジスタ割り当て終了時に `\|\c .I file\c .B \&.greg\c \&\|' に対してダンプします。 .TP .B \-dR 第 2 命令スケジューリング段階終了時に `\|\c .I file\c .B \&.sched2\c \&\|' に対してダンプします。 .TP .B \-dJ 最終ジャンプ最適化終了時に `\|\c .I file\c .B \&.jump2\c \&\|' に対してダンプします。 .TP .B \-dd 遅延分岐スケジューリング終了時に `\|\c .I file\c .B \&.dbr\c \&\|' に対してダンプします。 .TP .B \-dk レジスタからスタックへの転換終了時に `\|\c .I file\c .B \&.stack\c \&\|' に対してダンプします。 .TP .B \-da 以上の全てのダンプを生成します。 .TP .B \-dm 処理の終了時に、メモリ使用に関する統計情報を標準エラー出力に出力します。 .TP .B \-dp どのようなパターンや選択肢が使用されたかを示すコメントをアセンブラ出力 中のコメントで解説します。 .TP .B \-fpretend\-float クロスコンパイラで処理を行なう際に、ホストマシンと同じ浮動小数点フォーマット をターゲットマシンが持つかのように振舞わせます。これは浮動小数点定 数の誤った出力を引き起こしますが、実際の命令列はおそらく GNU CC を ターゲットマシンで起動した場合と同じものとなるでしょう。 .TP .B \-save\-temps 通常の \*(lq一時\*(rq 中間ファイルを消去せずに保存します。これらは カレントディレクトリに置かれ、ソースファイルに基づいた名前が付けられます。 従って、`\|\c .B foo.c\c \&\|' を `\|\c .B \-c \-save\-temps\c \&\|' を使用してコンパイルした場合は、 `\|\c .B foo.cpp\c \&\|', `\|\c .B foo.s\c \&\|' が、`\|\c .B foo.o\c \&\|' と同様に生成されます。 .TP .BI "\-print\-libgcc\-file\-name=" "library" ライブラリファイル `\|\c .nh .I library .hy \&\|' の完全な絶対名を表示します。このファイルはリンクの際のみに使用され、 それ以外の働きはありません。このオプションが指定された場合は、GNU CC は コンパイルやリンクを何も行なわず、ただファイル名を表示するのみです。 .TP .B \-print\-libgcc\-file\-name `\|\c .B \-print\-file\-name=libgcc.a\c \&\|' と同じです。 .TP .BI "\-print\-prog\-name=" "program" `\|\c .B \-print\-file\-name\c \&\|' と似ていますが、`\|\c cpp\c \&\|' のような program を検索します。 .SH 最適化オプション これらのオプションは様々な種類の最適化処理を制御します。 .TP .B \-O .TP .B \-O1 最適化を行います。最適化コンパイルは幾分長めの処理時間と、大きな関数に対 する非常に多くのメモリを必要とします。 .Sp `\|\c .B \-O\c \&\|' が指定されなかった場合は、コンパイラの目標はコンパイルのコストを 低減することや、目的の結果を得るためのデバッグを可能とすることに置かれ ます。それぞれの文は独立しています。つまり、ブレークポイントでプログラムを 停止させることによって、任意の変数に新し い値を代入したり、プログラムカウンタを他の文へと変更することを可能とし、 そのソースコードにプログラマが望む正しい結果を得ることを可能にします。 .Sp `\|\c .B \-O\c \&\|' を指定しなかった場合は、\c .B register\c \& と宣言した変数のみがレジスタへと割り当てられます。コンパイルの結果と して得られるコードは、PCC を `\|\c .B \-O\c \&\|' なしで使用した場合と比較して若干良くないものとなります。 .Sp `\|\c .B \-O\c \&\|' が指定されると、コンパイラはコードのサイズと実行時間を減少させる ことを試みます。 .Sp `\|\c .B \-O\c \&\|' を指定することによって、 `\|\c .B \-fthread\-jumps\c \&\|' と `\|\c .B \-fdefer\-pop\c \&\|' のフラグが指定されます。遅延スロットをもつマシンでは `\|\c .B \-fdelayed\-branch\c \&\|' が指定されます。フレームポインタを使わないデバッグをサポートしている マシンでは、`\|\c .B \-fomit\-frame\-pointer\c \&\|' も指定されます。マシンによってはさらにその他のフラグが 指定されることもあります。 .TP .B \-O2 さらに最適化を行います。サポートされている最適化手段のうち、 空間と速度のトレードオフを含まないものはほとんどの全て使用されます。 例えばループのアンローリングや関数のインライン化は行われません。 .B \-O\c \& と比較して、このオプションはコンパイル時間と生成コードの性能の双方を増加 させます。 .TP .B \-O3 さらなる最適化を行います。これは .B \-O2 が行う全ての最適化手段に加えて .B \-finline\-functions も有効にします。 .TP .B \-O0 最適化を行いません。 .Sp 複数の .B \-O オプションを指定した場合は、レベル番号の有無に関わらず、最後に指定した ものが有効になります。 .PP `\|\c .B \-f\c .I flag\c \&\c \&\|' の形式を持ったオプションは、マシン独立のフラグです。ほとんどの フラグは有効形式と無効形式の双方を持っています。`\|\c .B \-ffoo\c \&\|' の無効形式は `\|\c .B \-fno\-foo\c \&\|' です。以下のリストでは、デフォルトではない方の形式のみを示します。 これに対して `\|\c .B no\-\c \&\|' を削除する、あるいは追加することによって双方の形式を生成すること が可能です。 .TP .B \-ffloat\-store 浮動小数点変数をレジスタに格納しません。このオプションは 68000 のように (68881 の) 浮動小数点レジスタが \c .B double\c \& よりも高い精度を持っていると思われるマシンにおいて、望まない超過精度を 抑制することを可能にします。 .Sp ほとんどのプログラムにおいては、超過精度は単に良い結果を生むだけですが、 いくつかのプログラムは正確な IEEE の浮動小数点フォーマット定義に依 存しています。 このようなプログラムに対して `\|\c .B \-ffloat\-store\c \&\|' を使用します。 .TP .B \-fmemoize\-lookups .TP .B \-fsave\-memoized コンパイルを高速に行なうために、ヒューリスティックスを使用します (C++ のみ)。これらのヒューリスティックスはデフォルトでは有効になってい ません。なぜなら、これはある種の入力ファイルにしか効果がなく、その他の ファイルではかえってコンパイルが低速になるからです。 .Sp 最初に、コンパイラはメンバ関数への呼び出し (あるいはデータメンバへの参 照) を構築します。これは (1) どのクラスでその名前のメンバ関数が実装さ れているかを決定し、(2) どのメンバ関数への呼び出しであるかという問題 (これはどの種類の型変換が必要となるかという決定も含みます) を解決し、(3) 呼び出し側に対するその関数の可視性を検査するという作業を行なう必要があります。 これらは全て、コンパイルをより低速にしてしまいます。通常は、そのメンバ 関数への 2 度目の呼び出しが起こった場合も、この長い処理がまた行なわれ ることになります。これは次のようなコード .Sp \& cout << "This " << p << " has " << n << " legs.\en"; .Sp は、これらの 3 つの手順を 6 回繰り返すということを意味します。これに対し て、ソフトウェアキャッシュを使用すると、そのキャッシュへの\*(lqヒット \*(rqは、コストを劇的に低減することが期待できます。不幸なことに、キャッシュ の導入によって異なったレイヤの機構を実装することが必要となり、それ 自身のオーバヘッドが生じてしまいます。`\|\c .B \-fmemoize\-lookups\c \&\|' はこのソフトウェアキャッシュを有効にします。 .Sp メンバとメンバ関数へのアクセス特権 (可視性) はある関数におけるコンテキスト と別の関数におけるものとでは異なるので、 .B g++ はキャッシュをフラッシュしなければなりません。`\|\c .B \-fmemoize\-lookups\c \&\|' フラグを使用すると、全ての関数をコンパイルするたびに毎回キャッシュを フラッシュします。`\|\c .B \-fsave\-memoized\c \&\|' フラグは同一のソフトウェアキャッシュについて、コンパイラが前回 コンパイルした関数のコンテキストが、次にコンパイルするコンテキストと同 一のアクセス特権を有しているとみなせる時には、キャッシュを保持します。 これは同一クラス中に多くのメンバ関数を定義している時に特に有効です。 他のクラスのフレンドになっているメンバ関数を除き、同一のクラスに属して いる全てのメンバ関数のアクセス特権は、全て同一です。このような場合は キャッシュをフラッシュする必要はありません。 .TP .B \-fno\-default\-inline クラススコープ中に定義されたメンバ関数をデフォルトでインライン関数とす る処理を行ないません (C++ のみ)。 .TP .B \-fno\-defer\-pop それぞれの関数呼び出しに対して、関数のリターン直後に常に引数をポップします。 関数呼出後に引数をポップしなければならないマシンにおいては、 コンパイラは通常、いくつかの関数の引数をスタックに積んで、 それらを同時にポップします。 .TP .B \-fforce\-mem メモリオペランドに対して、それらに対する演算が行なわれる前に、 レジスタにコピーします。これは全てのメモリ参照を、潜在的な共通部分式であると 定めることによって、より良いコードを生成します。もしそれが共通部分式でな かった場合は、命令コンビネーションによってレジスタへの読み込みは削 除されます。私はこれがどのような違いを生み出すかということに興味があります。 .TP .B \-fforce\-addr メモリアドレス定数について、それらに対する演算が行なわれる前にレジスタ にコピーします。これは `\|\c .B \-fforce\-mem\c \&\|' と同じ手法でより良いコードを生成します。私はこれがどのような違いを 生み出すかということに興味があります。 .TP .B \-fomit\-frame\-pointer フレームポインタをレジスタに格納する必要のない関数において、この処理を 行いません。これはフレームポインタの保存、設定、復帰にかかる命令を省略 し、さらに、多くの関数でレジスタ変数として使用できる余分なレジスタを 得ることを可能にします。\c .I ただし、このオプションはほとんどのマシンにおいてデバッグを不可能にします。 .Sp Vax などのいくつかのマシンでは、このフラグは効果を持ちません。なぜならこ れらのマシンでは標準の呼び出し手順が自動的にフレームポインタの設定を 行なってしまい、これが存在しないとしたところで何も節約ができないからです。 マシン記述マクロ \c .B FRAME_POINTER_REQUIRED\c \& が、ターゲットマシンがこのフラグをサポートするかどうかを制御しています。 .TP .B \-finline\-functions 全ての単純な関数を呼び出し側に組み込んでしまいます。コンパイラは ヒューリスティックスを用いて、 どの関数がこの方法で組み込むに足りるほど単純かを決定します。 .Sp もし、ある関数に対する全ての呼び出しを組み込むことができ、かつその関数が \c .B static\c \& と宣言されていた場合は、GCC はその関数を独立したアセンブラコードと しては出力をしません。 .TP .B \-fcaller\-saves 関数呼び出しにおいて破壊されるであろう値を、レジスタに保持することを可 能とします。これはこのような呼び出しの周囲にレジスタに対する保存、復帰の 特別なコードを出力することによって実現されます。このような割り当ては、そ れが通常よりも良いコードを出力するとみなされる場合にのみ行われます。 .Sp このオプションは特定のマシンではデフォルトで有効となっています。これらは 通常、このオプションの処理の代わりに使うことができる呼び出し時保存 レジスタが存在しないマシンです。 .TP .B \-fkeep\-inline\-functions ある関数への呼び出しが全て呼び出し側に組み込むことができて、かつその関数が \c .B static\c \& と宣言されていたとしても、実行時に呼び出し可能な関数も生成します。 .TP .B \-fno\-function\-cse 関数のアドレスをレジスタに置きません。つまり、定まった関数を呼び出すコードは、 それぞれ明示的な関数のアドレスを含むコードとなります。 .Sp このオプションは効率の低いコードを生成しますが、アセンブラ出力を書き換え るようなハックを行なう場合には、このオプションを使用しなければ 混乱させられることでしょう。 .TP .B \-fno\-peephole マシン固有のピープホール最適化を禁止します。 .TP .B \-ffast-math このオプションは生成コードのスピードのために、GCC に対して、いくつかの ANSI または IEEE の規則/規格を侵させます。例えば、このオプションは \c .B sqrt\c \& 関数の引数は非負の数であることを仮定します。 .Sp このオプションはどの `\|\c .B \-O\c \&\|' オプションによっても有効とされません。なぜなら、このオプションは数 学関数に関する IEEE または ANSI の規則/規格の厳密な実装に依存して書かれた プログラムに対して誤った出力を与えるからです。 .PP 以下のオプションは特殊な最適化に関する制御を行います。`\|\c .B \-O2\c \&\|' オプションは`\|\c .B \-funroll\-loops\c \&\|' と `\|\c .B \-funroll\-all\-loops\c \&\|' を除くこれらの全てのオプションを有効にします。 .PP `\|\c .B \-O\c \&\|' オプションは通常 `\|\c .B \-fthread\-jumps\c \&\|' と `\|\c .B \-fdelayed\-branch\c \&\|' を有効とします。ただし、特殊なマシンではデフォルトの最適化に対して 変更が加えられているかもしれません。 .PP 最適化に関する \*(lqきめ細かいチューニング\*(rq が必要な場合に、以下の フラグを使用することが可能です。 .TP .B \-fstrength\-reduce ループのストレングスリダクションと繰り返し変数の除去を行います。 .TP .B \-fthread\-jumps 分岐ジャンプによってある場所にジャンプした時に、最初の分岐に包括される 比較が存在した時に、最初の分岐のジャンプ先を後者の分岐先に変更します。 この変更先は、2 番目の分岐条件の真偽によって、2 番目の分岐のジャンプ先か、 あるいは2 番目の分岐の直後に定められます。 .TP .B \-funroll\-loops ループ展開の最適化を行います。これはループの繰り返し数がコンパイル時、 あるいはランタイムに決定できる時においてのみ、実行されます。 .TP .B \-funroll\-all\-loops ループ展開の最適化を行います。これは全てのループに対して行われます。この オプションは大抵、より遅く動作するプログラムを生成します。 .TP .B \-fcse\-follow\-jumps 共通部分式削除の処理において、ジャンプ命令の行先が 他の経路から到達できない場合は、そのジャンプ命令を越えてスキャンを行 ないます。例えば、共通部分式削除処理中に \c .B else \c \& 節を伴った .B if \c \& 文に出会った場合、条件が偽ならば分岐先に対しても共通部分式削除を続けます。 .TP .B \-fcse\-skip\-blocks これは `\|\c .B \-fcse\-follow\-jumps\c \&\|' に似ていますが、ブロックを跨ぐジャンプに対しても共通部分式削除を継 続します。共通部分式削除処理中に、else 節を持たない単純な \c .B if\c \& 文にであった時、 `\|\c .B \-fcse\-skip\-blocks\c \&\|' は \c .B if\c \& のボディを跨いだジャンプに対する共通部分式削除処理を継続します。 .TP .B \-frerun\-cse\-after\-loop ループ最適化が行なわれた後に、再度共通部分式削除の処理を行います。 .TP .B \-felide\-constructors コンストラクタへの呼び出しが省略できるように思われる場合に、その呼び出 しを省略します (C++ のみ)。このフラグを指 定した場合は、GNU C++ は以下のコードに対して、一時オブジェクトを経由せずに \c .B y\c \& を \c .B foo への呼び出しの結果から直接初期化します。 .Sp A foo (); A y = foo (); .Sp このオプションを使用しない場合は、GNU C++ は最初に \c .B y\c \& を\c .B A\c \& 型の適切なコンストラクタを呼び出すことによって初期化します。そして、 .B foo\c \& の結果を一時オブジェクトに格納し、最終的には `\|\c .B y\c \&\|' の値を一時オブジェクトの値に入れ換えます。 .Sp デフォルトの振舞い (`\|\c .B \-fno\-elide\-constructors\c \&\|') が、ANSI C++ 標準のドラフトには規定されています。コンストラクタ が副作用を含むプログラムに対して、`\|\c .B \-felide-constructors\c \&\|' を指定すると、そのプログラムは異なった動作をする可能性があります。な ぜなら、いくつかのコンストラクタの呼び出しが省略されるからです。 .TP .B \-fexpensive\-optimizations 比較的コストの高いいくつかの些細な最適化を行います。 .TP .B \-fdelayed\-branch ターゲットマシンにおいてこのフラグがサポートされている場合は、遅延分岐 命令後の命令スロットを命令の順番変更によって利用するように設定します。 .TP .B \-fschedule\-insns ターゲットマシンにおいてこのフラグがサポートされている場合は、必要な データを利用可能になるまで待つことによる実行の遅滞を防ぐために、命令 の順番の変更を行います。これは遅い浮動小数点命令やメモリ読み込み命令の実 行において、それらの結果を必要とする命令の前に他の命令を詰め込みます。 .TP .B \-fschedule\-insns2 `\|\c .B \-fschedule\-insns\c \&\|' と似ていますが、レジスタ割当て処理の後にもう一度命令スケジューリングの 段階を置きます。これは、比較的レジスタ数が少なく、メモリロード命令 が 1 サイクルよりも多くを要するマシンにおいて、特に効果的です。 .SH ターゲットオプション デフォルトでは、GNU CC コンパイラは、現在使用しているマシンと同じタイプの コードをコンパイルします。しかし、GNU CC はクロスコンパイラ としてもインストールすることが可能です。実際には、異なったターゲット マシンのための様々なコンフィギュレーションの GNU CC は、同時にいくつ もインストールすることが可能です。そこで、どの GNU CC を使用するかを 指定するために、`\|\c .B \-b\c \&\|' オプションを使用することができます。 .PP これに加えて、古い、あるいはより新しいバージョンの GNU CC も同時にいく つもインストールしていくことができます。これらのうち 1 つ (おそらくもっ とも新しいもの) がデフォルトとなります。しかし、ひょっとしたら別のものを使 いたくなるかもしれません。 .TP .BI "\-b " "machine" 引数 \c .I machine\c \& は、コンパイルのターゲットマシンを規定します。これは GNU CC をクロス コンパイラとしてインストールした時に有用です。 .Sp .I machine\c \& に指定する値は、GNU CC をクロスコンパイラとしてコンフィギュレーション した時に与えたマシンタイプと同じです。例えば、80386 上の System V で実行されるプログラムのために `\|\c .B configure i386v\c \&\|' というコンフィギュレーションを行なったクロスコンパイラを起動した い場合は、`\|\c .B \-b i386v\c \&\|' と指定します。 .Sp `\|\c .B \-b\c \&\|' の設定を省略した場合は、通常は使用しているマシンと同タイプのマシン のためのコンパイルが行われます。 .TP .BI "\-V " "version" 引数 \c .I version\c \& は、起動される GNU CC のバージョンを規定します。これは複数のバージョンが インストールされている場合に有用です。例えば、 .I version\c \& が `\|\c .B 2.0\c \&\|' ならば、GNU CC バージョン 2.0 を起動することを意味します。 .Sp `\|\c .B \-V\c \&\|' を指定しなかった場合のデフォルトのバージョンは、GNU CC をインストール する時に調整可能です。通常は、もっとも一般的な使用に勧めることができる バージョンがここに指定されます。 .SH マシン依存オプション それぞれのターゲットマシンタイプは、それぞれの特別なオプションを持つ ことが可能です。`\|\c .B \-m\c \&\|' で始まるオプション群は、様々なハードウェアモデルや コンフィギュレーション\(em\&例えば 68010 と 68020、 浮動小数点コプロセッサの有無\(em\& などを選択できます。このオプションを指定することによって、コンパイラは どれか 1 つのモデル、 あるいはコンフィギュレーションに対するコンパイルが可能です。 .PP -いくつかのコンフィギュレーションは、通常はそのプラットホーム上の +いくつかのコンフィギュレーションは、通常はそのプラットフォーム上の 他のコンパイラとのコマンドラインに関するの互換性をとるため の特別なオプションを用意しています。 .PP 以下は 68000 シリーズのために定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-m68000 .TP .B \-mc68000 68000 のためのコードを生成します。これは 68000 ベースのシステムに対して コンフィギュレーションを行なったコンパイラのデフォルトです。 .TP .B \-m68020 .TP .B \-mc68020 (68000 ではなく) 68020 のためのコードを生成します。これは 68020 ベースの システムに対してコンフィギュレーションを行なったコンパイラのデフォルト です。 .TP .B \-m68881 浮動小数点演算のために 68881 命令を含んだ出力を行います。これはほとんどの 68020 ベースのシステムにおいて、コンパイラのコンフィギュレーション時に .B \-nfp を指定されなかった場合のデフォルトです。 .TP .B \-m68030 68030 のためのコードを生成します。これは 68030 ベースのシステムに対して コンフィギュレーションを行なったコンパイラのデフォルトです。 .TP .B \-m68040 68040 のためのコードを生成します。これは 68040 ベースのシステムに対して コンフィギュレーションを行なったコンパイラのデフォルトです。 .TP .B \-m68020\-40 68040 のためのコードを生成しますが、新しい命令を使用しません。この結果とし て得られるコードは、68020/68881, 68030, 68040 のいずれのシステムにおいても、 比較的高い性能を持ちます。 .TP .B \-mfpa 浮動小数点演算のために Sun FPA 命令を含んだ出力を行います。 .TP .B \-msoft\-float 浮動小数点演算のためにライブラリを呼び出す出力を行います。 .I 警告: この必須のライブラリは GNU CC の一部としては含まれません。通常はそのマシン の一般的な C コンパイラの提供するものを使用しますが、これは通常の方法 ではクロスコンパイルで直接使用することはできません。クロスコンパイルを行 ないたい場合は、自分自身で必要なライブラリ関数を用意する必要があります。 .TP .B \-mshort .B int\c \& 型を \c .B short int\c \& 型のように 16 ビット幅とみなします。 .TP .B \-mnobitfield ビットフィールド命令を使用しません。`\|\c .B \-m68000\c \&\|' は暗黙のうちに `\|\c .B \-mnobitfield\c \&\|' を含みます。 .TP .B \-mbitfield ビットフィールド命令を使用します。`\|\c .B \-m68020\c \&\|' は暗黙のうちに `\|\c .B \-mbitfield\c \&\|' を含みます。これは変更されていないソースの場合のデフォルトです。 .TP .B \-mrtd 固定個数の引数をとる関数に対して、異なった関数呼び出し規約を使用します。 これは、リターン時に引数をポップする \c .B rtd 命令を利用するものです。これは呼び出し側で引数をポップさせる必要がな いために、1 命令を省略することが可能となります。 .Sp この呼び出し規約は通常の Unix で使用されている方式とは互換性がありません。そ のため、Unix コンパイラでコンパイルされたライブラリを呼び出す必要があ る限りは、使用することはできません。 .Sp さらに、全ての可変引数をとり得る関数 ( .B printf\c を含みます) に対して、関数プロトタイプを用意する必要があります。さもないと、 これらの関数に対して誤ったコードが生成されます。 .Sp さらに、関数に対して多過ぎる引数をつけて呼び出すコードを書いた場合、こ れは深刻な誤ったコードを生成します。(通常は多過ぎる変数は害を及ぼすこと なく無視されます。) .Sp .B rtd\c \& 命令は 68010 と 68020 によってサポートされますが、 68000 では使用でき ません。 .PP 以下は Vax のために定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-munix 特定のいくつかのジャンプ命令 (\c .B aobleq\c \& 等) を出力しません。これらの命令で長いレンジを使用した場合、 Vax 用の Unix アセンブラはこれを処理できません。 .TP .B \-mgnu これらのジャンプ命令を出力します。アセンブルには GNU アセンブラの使用 を仮定します。 .TP .B \-mg 浮動小数点数について、d-フォーマットではなく、g-フォーマットのための コードを出力します。 .PP 以下は SPARC でサポートされている `\|\c .B \-m\c \&\|' スイッチです。 .PP .B \-mfpu .TP .B \-mhard\-float 浮動小数点命令を含む出力を行います。これはデフォルトです。 .PP .B \-mno\-fpu .TP .B \-msoft\-float 浮動小数点の処理のためにライブラリを呼び出す出力を行います。 .I 警告: SPARC 用の GNU 浮動小数点ライブラリは存在しません。 通常はそのマシンの一般的な C コンパイラの提供するものを使用しますが、 これは通常の方法ではクロスコンパイルで直接使用することはできません。 クロスコンパイルを行ないたい場合は、 自分自身で必要なライブラリ関数を用意する必要があります。 .Sp .B \-msoft\-float は呼び出し規約を変更します。したがって、 .I 全て のプログラムをこのオプションでコンパイルしない限り、 このオプションは意味をなしません。 .PP .B \-mno\-epilogue .TP .B \-mepilogue .B \-mepilogue を指定することによって (デフォルト)、コンパイラは関数を抜けるため のコードを常に関数の最後に出力します。関数の途中で関数を抜けるコードは全て、 関数の最後の終了コードへのジャンプとして生成されます。 .Sp .BR \-mno\-epilogue を設定することによって、コンパイラは関数から抜けるコードをインライン化 することを試みます。 .PP .B \-mno\-v8 .TP .B \-mv8 .TP .B \-msparclite これらの 3 つのオプションは SPARC アーキテクチャのバリエーションを選択 するために使用されます。 .Sp デフォルトでは、(Fujitsu SPARClite 用にコンフィギュレーションしない限 りは) GCC は SPARC アーキテクチャ v7 用のコードを生成します。 .Sp .B \-mv8 は、SPARC v8 用コードを生成します。v7 コードとの違いは、整数の乗算と整数 の除算が v7 では存在しないが v8 には存在するという点のみです。 .Sp .B \-msparclite は、SPARClite 用のコードを生成します。これは v7 には存在せず SPARClite に存在する、整数乗算、整数除算とスキャン (ffs) 命令を追加します。 .PP .B \-mcypress .TP .B \-msupersparc これら 2 つのオプションはコード最適化対象のプロセッサを選択するための ものです。 .Sp .B \-mcypress を用いると(これがデフォルト)、 コンパイラは Cypress CY7C602 チップ用にコードを最適化します。 このチップは SparcStation/SparcServer 3xx シリーズに用いられています。 このオプションは古い SparcStation 1, 2, IPX などにも適用できます。 .Sp .B \-msupersparc を用いると、コンパイラは SuperSparc CPU 用にコードを最適化します。 このチップは SparcStation 10, 1000, 2000 シリーズに用いられています。 このオプションを用いると、SPARC v8 の全命令セットを用いるようになります。 .PP 以下は Convex のために定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-mc1 C1 用の出力を行います。これはコンパイラが C1 用にコンフィギュレーション を行なわれた時のデフォルトです。 .TP .B \-mc2 C2 用の出力を行います。これはコンパイラが C2 用にコンフィギュレーション を行なわれた時のデフォルトです。 .TP .B \-margcount 引数列の前に、引数の数をワードに置くコードを生成します。いくつかの可搬性 のない Convex や Vax のプログラムはこのワードを必要とします。(デバッガは 不定長引数リストを持つ関数を除いて、このワードを必要としません。これらの 情報はシンボルテーブルに書かれます。) .TP .B \-mnoargcount 引数の数を示すワードを省略します。これは変更されていないソースを使用した 場合のデフォルトです。 .PP 以下は、AMD Am29000 のために定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-mdw DW ビットが立っていることを仮定したコードを出力します。これは、ハードウェア によってバイト操作やハーフワード操作がサポートされているということを 意味します。これはデフォルトです。 .TP .B \-mnodw DW ビットが立っていないことを仮定したコードを出力します。 .TP .B \-mbw システムがバイト操作やハーフワード書き込み操作をサポートしていることを仮定した コードを生成します。これはデフォルトです。 .TP .B \-mnbw システムがバイト操作やハーフワード書き込み操作をサポートしていないことを仮定し たコードを生成します。これは暗黙のうちに `\|\c .B \-mnodw\c \&\|' を含みます。 .TP .B \-msmall スモールメモリモデルを使用します。これは全ての関数のアドレスが単一の 256KB のセグメント内に入ることと、関数の絶対アドレスが 256K 以下にある ことを仮定します。このオプションは \c .B call\c \& 命令を \c .B const\c \&, \c .B consth\c \&, \c .B calli\c \& シーケンスの代わりに使用することを可能にします。 .TP .B \-mlarge .B call\c \& 命令が使用できることを仮定しません。これはデフォルトです。 .TP .B \-m29050 Am29050 用のコードを生成します。 .TP .B \-m29000 Am29000 用のコードを生成します。これはデフォルトです。 .TP .B \-mkernel\-registers .B gr96-gr127\c \& レジスタへの参照の代わりに .B gr64-gr95\c \& を参照するコードを生成します。このオプションは、ユーザのコードか ら使用できるグローバルレジスタから区別されたグローバルレジスタの集合 を利用するカーネルのコードをコンパイルする時に使用できます。 .Sp ただし、このオプションが使用されている時にも `\|\c .B \-f\c \&\|' フラグ中のレジスタ名は通常のユーザモードでの名前を使用します。 .TP .B \-muser\-registers 通常のグローバルレジスタの集合 \c .B gr96-gr127\c \& を使用します。これはデフォルトです。 .TP .B \-mstack\-check .B _\|_msp_check\c \& への呼び出しをそれぞれのスタック調整の後に挿入します。これはしばしば カーネルのコードにおいて用いられます。 .PP 以下は、Motorola 88K アーキテクチャのために定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-m88000 m88100 と m88110 の双方で比較的高性能で動作するコードを生成します。 .TP .B \-m88100 m88100 に最適なコードを生成します。ただし m88110 においても動作します。 .TP .B \-m88110 m88110 に最適なコードを生成します。 ただし m88100 においては動作しないかも知れません .TP .B \-midentify\-revision アセンブラ出力中に、ソースファイル名、コンパイラ名とバージョン、 タイムスタンプ、使用されたコンパイルフラグを記した \c .B ident\c \& ディレクティブを挿入します。 .TP .B \-mno\-underscores シンボル名の最初にアンダースコアキャラクタをつけないアセンブラ出力を生 成します。デフォルトでは個々の名前に対して、アンダースコアをプレフィック スとして使用します。 .TP .B \-mno\-check\-zero\-division .TP .B \-mcheck\-zero\-division 初期の 88K のモデルはゼロによる除算の処理に問題を持っていました。特に、そ れらの多くにおいてトラップが生じなかったことは問題でした。これ らのオプションを使用することによって、ゼロ除算を発見し、例外を知らせる コードを埋め込むことを禁止 (あるいは明示的に許可) することができます。全 ての 88K 用の GCC のコンフィギュレーションは `\|\c .B \-mcheck\-zero\-division\c \&\|' をデフォルトとして使用しています。 .TP .B \-mocs\-debug\-info .TP .B \-mno\-ocs\-debug\-info 88Open Object Compatibility Standard \*(lqOCS\*(rq で定義された (それぞれのスタックフレーム中で使用されるレジスタに関する) 付加的なデバッグ 情報を取り込みます (または省略します)。これらの付加的な情報は GDB によっ ては必要とされません。DG/UX, SVr4, Delta 88 SVr3.2 ではデフォルトでこの情 報を含めます。その他の 88K コンフィギュレーションではデフォルトで省略します。 .TP .B \-mocs\-frame\-position .TP .B \-mno\-ocs\-frame\-position OCS で規定されているように、レジスタの値に対して、スタックフレーム中の 特定の場所に保存されるという動作を強制します (あるいは要求しません)。 DG/UX, Delta88 SVr3.2, BCS のコンフィギュレーションでは `\|\c .B \-mocs\-frame\-position\c \&\|' をデフォルトとして、それ以外の 88k コンフィギュレーションでは `\|\c .B \-mno\-ocs\-frame\-position\c \&\|' をデフォルトとして使用しています。 .TP .B \-moptimize\-arg\-area .TP .B \-mno\-optimize\-arg\-area 関数の引数がどのような方法でスタックフレームに格納されるかを指定します。 `\|\c .B \-moptimize\-arg\-area\c \&\|' はスペースを節約しますが、いくつかのデバッガ (GDB は含まれない) を クラッシュさせます。`\|\c .B \-mno\-optimize\-arg\-area\c \&\|' はより標準に従っています。デフォルトでは GCC は引数エリアの最適化 を行いません。 .TP .BI "\-mshort\-data\-" "num" データ参照時に、それらの処理を \c .B r0\c \& からの相対参照で行なうことによって小さなコードにすることを可能とします。 これは値のロードを (その他の場合は 2 命令かかるところを) 1 命令で行な うことを可能にします。\c .I num\c \& をこのオプションとともに指定することによって、どのデータ参照が影響 を受けるかを指定することができます。例えば `\|\c .B \-mshort\-data\-512\c \&\|' を指定すると、512 バイト以内のディスプレースメントのデータ参照が 影響を受けることになります。 `\|\c .B \-mshort\-data\-\c .I num\c \&\c \&\|' は \c .I num\c \& が 64K よりも大きな時は効果を持ちません。 .PP .B \-mserialize-volatile .TP .B \-mno-serialize-volatile volatile なメモリへの参照について、シーケンシャルな整合性を持った コードを生成する、あるいは生成しません。 .Sp GNU CC はデフォルトではどのプロセッササブモデルを選んだ場合においても、 整合性を常に保証します。これがどのように実現されているかは、サブモデルに 依存しています。 .Sp m88100 プロセッサはメモリ参照の順番を入れ換えないので、常にシーケンシャルな 整合性は保たれます。もし `\|\c .B \-m88100\c \&\|' を使用した場合は、GNU CC はシーケンシャルな整合性を保つための特 別な命令を生成しません。 .Sp m88110 プロセッサにおけるメモリ参照の順番は、必ずしもそれらの要求を行 なった命令の順番とは一致しません。特に、読み込み命令は、先行する書き込み 命令よりも先に実行され得ます。このような順番の入れ換えは、マルチプロセッサ時に volatile なメモリの参照におけるシーケンシャルな整合性を崩してしまいます。 `\|\c .B \-m88000\c \&\|' または `\|\c .B \-m88110\c \&\|' を指定した場合には、GNU CC は、必要な場合は特別な命令を生成し、 命令の実行が正しい順番で行なわれることを強制します。 .Sp ここで生成される整合性を保証するための特別な命令はアプリケーションの性 能に対して影響を及ぼします。もしこの保証無しで問題がないということがわかっ ている場合は、`\|\c .B \-mno-serialize-volatile\c \&\|' を使用することができます。 .Sp `\|\c .B \-m88100\c \&\|' オプションを使用しているが、m88110 における実行時にシーケンシャルな 整合性が必要とされる場合は、`\|\c .B \-mserialize-volatile\c \&\|' を使用するべきです。 .PP .B \-msvr4 .TP .B \-msvr3 System V release 4 (SVr4) に関連したコンパイラの拡張を有効 (`\|\c .B \-msvr4\c \&\|') あるいは無効 (`\|\c .B \-msvr3\c \&\|') にします。これは以下の内容を制御します。 .TP \ \ \ \(bu 生成するアセンブラの文法の種類 (これは `\|\c .B \-mversion\-03.00\c \&\|' を使用することによって独立に制御できます)。 .TP \ \ \ \(bu `\|\c .B \-msvr4\c \&\|' は C プリプロセッサに対して `\|\c .B #pragma weak\c \&\|' を理解させます。 .TP \ \ \ \(bu `\|\c .B \-msvr4\c \&\|' は、GCC に SVr4 によって使用されている付加的な宣言ディレクティブ を生成させます。 .PP `\|\c .B \-msvr3\c \&\|' は、SVr4 を除く全ての m88K コンフィギュレーションにおけるデフォ ルトです。 .TP .B \-mtrap\-large\-shift .TP .B \-mhandle\-large\-shift 31 ビットより大きいビットシフトを検出するコードを埋め込みます。これらの オプションを指定することによって、それぞれトラップ、あるいは適切に処理す るコードが埋め込まれます。デフォルトでは GCC は大きなビットシフトには 特別な対策を行いません。 .TP .B \-muse\-div\-instruction 非常に初期の 88K アーキテクチャのモデルは除算命令を持っていません。従っ て、GCC はデフォルトでは除算命令を生成しません。このオプションは除算命令 が安全に使用できるということを指定します。 .TP .B \-mversion\-03.00 DG/UX コンフィギュレーションには、2 つの SVr4 の種類があります。このオプション は .B \-msvr4 オプションによって hybrid-COFF と real-ELF のどちらが使用されるかを選択します。 他のコンフィギュレーションはこのオプションを無視します。 .TP .B \-mwarn\-passed\-structs 関数に対して構造体を渡した場合と、関数が構造体を返した場合に警告します。 構造体を渡す規約は C 言語の発展の中で変化しており、移植性の問題をしば しば生じることになります。デフォルトでは GCC はこの警告を行いません。 .PP 以下のオプションは IBM RS6000 のために定義されたものです。 .PP .B \-mfp\-in\-toc .TP .B \-mno\-fp\-in\-toc 浮動小数点定数を Table of Contents (TOC) に入れるかどうかを指定します。 このテーブルは全てのグローバル変数と関数のアドレスを格納します。デフォルト では GCC は浮動小数点定数をここに格納します。もし TOC が算術あふれをおこす 場合は、`\|\c .B \-mno\-fp\-in\-toc\c \&\|' を使用することによって TOC のサイズを小さくすることが可能であり、 算術あふれを防ぐことができるでしょう。 .PP 以下は IBM RT PC 用に定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-min\-line\-mul 整数の乗算に対してインラインのコード列を生成します。これはデフォルトです。 .TP .B \-mcall\-lib\-mul 整数の乗算に対して \c .B lmul$$\c \& を呼び出します。 .TP .B \-mfull\-fp\-blocks フルサイズの浮動小数点データブロックを生成します。これは IBM によって推 奨されている最低限のスクラッチスペースの量を包含します。これはデフォルトです。 .TP .B \-mminimum\-fp\-blocks 浮動小数点データブロック内に特別なスクラッチスペースを含めません。これに よって、より小さなコードが生成されますが、実行は遅くなります。 なぜならスクラッチスペースが動的に確保されるからです。 .TP .B \-mfp\-arg\-in\-fpregs IBM の関数呼び出し規約とは互換性のない呼び出し手順を使用します。 この規約では浮動小数点引数を浮動小数点レジスタに入れて渡します。 このオプションを指定すると、\c .B varargs.h\c \& や \c .B stdarg.h\c \& で浮動小数点オペランドが使用できなくなることに注意して下さい。 .TP .B \-mfp\-arg\-in\-gregs 浮動小数点に対して通常の関数呼び出し規約を使用します。これはデフォルトです。 .TP .B \-mhc\-struct\-return 1 ワードより大きな構造体を返す時に、レジスタではなくメモリを使用して返します。 これは MetaWare HighC (hc) コンパイラとの互換性を提供します。`\|\c .B \-fpcc\-struct\-return\c \&\|' を使用することによって Portable C Compiler (pcc) との互換性を得 ることができます。 .TP .B \-mnohc\-struct\-return 1 ワードより大きな構造体を返す時に、レジスタによって返される場合があります。 これはその方が便利であると考えられる時に使用されます。これはデフォルトです。 IBM が提供するコンパイラとの互換性を得るためには、`\|\c .B \-fpcc\-struct\-return\c \&\|' と `\|\c .B \-mhc\-struct\-return\c \&\|' の双方を使用します。 .PP 以下は MIPS ファミリのために定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .BI "\-mcpu=" "cpu-type" 命令スケジューリング時に、デフォルトのマシンタイプを .I cpu-type に仮定します。デフォルトの .I cpu-type は .BR default です。この選択はすべてのマシンに対する最長のサイクル数を元にコードを 生成します。これは、生成されるコードがどの MIPS cpu においても適当な速度 で処理されるようにするためです。これ以外の .I cpu-type の選択としては、 .BR r2000 , .BR r3000 , .BR r4000 , .BR r6000 があります。特定の .I cpu-type を選択した場合は、その特定のチップに適したスケジュールが行われます。 コンパイラは、 .B \-mips2 または .B \-mips3 スイッチが使用されていない場合は、MIPS ISA (instruction set architecture) のレベル 1 に合致しないコードを生成することはありません。 .TP .B \-mips2 MIPS ISA のレベル 2 (branch likely 命令, 平方根命令) による命令群 を出力します。 .B \-mcpu=r4000 と .B \-mcpu=r6000 スイッチは、 .BR \-mips2 と共に使用される必要があります。 .TP .B \-mips3 MIPS ISA のレベル 3 (64 ビット命令) を含む命令群を出力します。 .B \-mcpu=r4000 スイッチは、 .BR \-mips2 と同時に使用する必要があります。 .TP .B \-mint64 .TP .B \-mlong64 .TP .B \-mlonglong128 これらのオプションは現在動作しません。 .TP .B \-mmips\-as MIPS アセンブラのためのコードを生成し、 .B mips\-tfile を起動して通常のデバッグ情報を追加します。 これは OSF/1 リファレンスプラットフォーム 以外の全てのプラットフォームにおけるデフォルトです。 OSF/1 リファレンスプラットフォームは OSF/rose オブジェクトフォーマットを 使用します。スイッチ .BR \-ggdb , .BR \-gstabs , .B \-gstabs+ のうちのどれかが使用されている場合は、 .B mips\-tfile プログラムは、stabs を MIPS ECOFF 中にカプセル化します。 .TP .B \-mgas GNU アセンブラ用のコードを生成します。これは OSF/1 リファレンスプラットフォーム におけるデフォルトです。OSF/1 リファレンスプラットフォームは OSF/rose オブジェクトフォーマットを使用します。 .TP .B \-mrnames .TP .B \-mno\-rnames .B \-mrnames スイッチは出力コードにおいて、レジスタの名前として、ハードウェア名の代 わりに MIPS ソフトウェア名を使用することを指定します。(つまり、 .B a0 を .BR $4 の代わりに使用します)。 GNU アセンブラは .B \-mrnames スイッチをサポートしません。MIPS アセンブラはソースファイルに対して MIPS C プリプロセッサを起動するでしょう。 .B \-mno\-rnames スイッチがデフォルトです。 .TP .B \-mgpopt .TP .B \-mno\-gpopt .B \-mgpopt スイッチは、全てのデータ宣言をテキストセクション中の全命令の前に書き出 すことを指定します。これによって、全ての MIPS アセンブラは、 ショートグローバル、あるいは静的なデータアイテムに対して、2 ワードではなく、1 ワードのメモリ参照命令を生成します。 これは最適化が指定された場合のデフォルトです。 .TP .B \-mstats .TP .B \-mno\-stats .B \-mstats が指定された場合は、コンパイラによってインラインでない関数が処理される ごとに、標準エラー出力ファイルに対して、そのプログラムに対する統計情報 を示す 1 行のメッセージを出力します。このメッセージは、保存したレジスタ の数、スタックのサイズなどを示します。 .TP .B \-mmemcpy .TP .B \-mno\-memcpy .B \-mmemcpy スイッチは、全てのブロック転送に対して、インラインコードを生成する代わ りに、適切なストリング関数 .RB ( memcpy または .BR bcopy ) を呼び出すコードを生成します。 .TP .B \-mmips\-tfile .TP .B \-mno\-mips\-tfile .B \-mno\-mips\-tfile スイッチを指定すると、 MIPS アセンブラがデバッグサポートのために生成したオブジェクトファイルに対し、 .B mips\-tfile を使用した後処理を行いません。 .B mips\-tfile が実行されないと、デバッガからはローカル変数を扱うことができません。 さらに、 .B stage2 と .B stage3 のオブジェクトはアセンブラに渡される一時的なファイル名をオブジェクトファイル 中に埋め込まれて持っており、このためそれらを比較した場合に同一のも のとはみなされません。 .TP .B \-msoft\-float 浮動小数点演算のためにライブラリを呼び出す出力を行います。 .I 警告: この必須のライブラリは GNU CC の一部としては含まれません。通常はそのマシンの 一般的な C コンパイラの提供するものを使用しますが、これは通常の方法 ではクロスコンパイルで直接使用することはできません。クロスコンパイルを行 ないたい場合は、自分自身で必要なライブラリ関数を用意する必要があります。 .TP .B \-mhard\-float 浮動小数点命令を含んだ出力を生成します。これは変更されないソースを使用し た場合のデフォルトです。 .TP .B \-mfp64 ステータスワード中の .B FR ビットが立っていることを仮定します。これは 32 個の 32 ビット浮動小数点 レジスタの代わりに、32 個の 64 ビットの浮動小数点レジスタが存在するとい うことを示します。この場合は、同時に .B \-mcpu=r4000 と .B \-mips3 スイッチを指定する必要があります。 .TP .B \-mfp32 32 個の 32 ビット浮動小数点レジスタが存在するということを仮定します。こ れはデフォルトです。 .PP .B \-mabicalls .TP .B \-mno\-abicalls いくつかの System V.4 の移植が位置独立コードのために使用する疑似命令 .BR \&.abicalls , .BR \&.cpload , .B \&.cprestore を出力する、あるいは出力しません。 .TP .B \-mhalf\-pic .TP .B \-mno\-half\-pic .B \-mhalf\-pic スイッチは、テキストセクション中に参照を配置する代わりに、外部参照を行 なうポインタをデータセクションに配置し、それをロードする動作を指定します。 このオプションは現在まだ動作しません。 .B .BI \-G num は .I num バイト以下のグローバル、あるいは静的なアイテムを、通常のデータや bss セクションではなく、小さなデータ、または bss セクションに配置することを 指定します。 これによりアセンブラは、通常では 2 ワードの参照を行うところを、 グローバルポインタ .RB ( gp または .BR $28 ) を基準とした 1 ワードのメモリ参照命令を生成可能となります。 デフォルトでは MIPS アセンブラが使用される場合、 .I num は 8 です。また、GNU アセンブラが使用される場合のデフォルトは 0 です。 .BI \-G num スイッチはアセンブラ、リンカにも同様に渡されます。全てのモジュールは同一の .BI \-G num の値でコンパイルされなければなりません。 .TP .B \-nocpp MIPS アセンブラに、ユーザアセンブラファイル (`\|\c .B .s\c \&\|' 拡張子を持ちます) に対するアセンブル時のプリプロセッサの起動を抑制さ せます。 .PP 以下は、Intel 80386 ファミリ用に定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-m486 .TP .B \-mno\-486 386 ではなく 486 に最適化されたコードを出力する、あるいはその逆を行な う指定を行います。486 用に生成されたコードは 386 で実行可能であり、逆も また可能です。 .TP .B \-msoft\-float 浮動小数点演算のためにライブラリを呼び出す出力を行います。 .I 警告: この必須のライブラリは GNU CC の一部としては含まれません。通常はそのマシンの 一般的な C コンパイラの提供するものを使用しますが、これは通常の方法 ではクロスコンパイルで直接使用することはできません。クロスコンパイルを行 ないたい場合は、自分自身で必要なライブラリ関数を用意する必要があります。 .Sp 関数が浮動小数点数を返す時に 80387 レジスタスタックを使用するマシンに おいては、`\|\c .B \-msoft-float\c \&\|' を使用した場合でも、いくつかの浮動小数点命令が生成されます。 .TP .B \-mno-fp-ret-in-387 関数からの返り値に FPU のレジスタを使用しません。 .Sp 通常の関数呼び出し規約は、たとえ FPU が存在しなくても .B float\c \& と \c .B double\c \& の結果を FPU レジスタに入れて返します。したがってこの場合、 オペレーティングシステムは FPU をエミュレートしなければなりません。 .Sp `\|\c .B \-mno-fp-ret-in-387\c \&\|' オプションを指定すると、浮動小数点数も通常の CPU レジスタに入れ て返されます。 .TP .B \-mprofiler-epilogue .TP .B \-mno-profiler-epilogue 関数から抜けるコードにてプロファイル情報を書き出す追加コードを生成します。 .PP 以下は HPPA ファミリ用に定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-mpa-risc-1-0 PA 1.0 プロセッサ用のコードを出力します。 .TP .B \-mpa-risc-1-1 PA 1.1 プロセッサ用のコードを出力します。 .TP .B \-mkernel カーネルに適したコードを生成します。特に、引数の 1 つとして DP レジスタを とる .B add\c \& 命令の使用を抑制し、その代わりに、\c .B addil\c \& 命令を生成します。これは HP-UX リンカの深刻なバグを避けるための措置です。 .TP .B \-mshared-libs HP-UX 共有ライブラリとリンクさせるコードを生成します。このオプションはま だ完全に動作しているわけではなく、どの PA ターゲットにおいてもデフォルト になっていません。このオプションを指定すると、コンパイラは誤ったコード を出力し得ます。 .TP .B \-mno-shared-libs 共有ライブラリとリンクしないコードを生成します。これは全ての PA ターゲット においてデフォルトのオプションです。 .TP .B \-mlong-calls 関数の呼び出し先と呼び出し元が同一ファイルに含まれた場合、呼び出し時の 距離が 256K を越える場合でも動作するようなコードを出力します。 このオプションは、リンカから \*(lqbranch out of range errors\*(rq で リンクを拒否された時以外には使用しないようにしてください。 .TP .B \-mdisable-fpregs いかなる形においても、浮動小数点レジスタの使用を禁止します。 これは浮動小数点レジスタに配慮しないコンテキストスイッチを行なう カーネルに対して有効です。 このオプションを使用して、浮動小数点処理を行なおうとすると、 コンパイラはアボートします。 .TP .B \-mdisable-indexing コンパイラに対して、indexing addressing mode を使用しないように指定します。 これによって MACH において MIG によって生成されたコードをコンパイルす る際の、あまり重要でないいくつかの問題を防ぐことができます。 .TP .B \-mtrailing-colon ラベル定義の後にコロンを加えます (ELF アセンブラ用)。 .PP 以下は、Intel 80960 ファミリ用に定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .BI "\-m" "cpu-type" デフォルトのマシンタイプを .I cpu-type に仮定します。これは生成する命令とアドレッシングモード、そして境界条件に 関係します。 デフォルトの .I cpu-type は .BR kb です。その他の選択としては .BR ka , .BR mc , .BR ca , .BR cf , .BR sa , .BR sb があります。 .TP .B \-mnumerics .TP .B \-msoft\-float .B \-mnumerics オプションはプロセッサが浮動小数点命令をサポートすることを示します。 .B \-msoft\-float オプションは浮動小数点サポートを仮定しないことを示します。 .TP .B \-mleaf\-procedures .TP .B \-mno\-leaf\-procedures 葉に位置する手続きについて、 .IR call 命令と同様に .I bal 命令でも呼び出すことを可能とします (あるいは、しません)。これは .I bal 命令がアセンブラ、またはリンカによって置き換えられ得る場合には、直接呼 び出しに対して効率の良いコードを得ることができます。ただし、それ以外の場 合は効率の良くないコードを生成します。例えば、関数へのポインタ経由の呼び 出しや、この最適化をサポートしないリンカを使用した場合などがこれ に該当します。 .TP .B \-mtail\-call .TP .B \-mno\-tail\-call (マシン非依存の部分を越えて) 末尾再帰を分岐に変換する処理に関するさ らなる最適化を行います(または行いません)。 この手法の適用が正当でないということに関する判断 が完全ではないので、まだこのオプションを使用することは適当でないかも しれません。デフォルトは .BR \-mno\-tail\-call です。 .TP .B \-mcomplex\-addr .TP .B \-mno\-complex\-addr この i960 の実装では複雑なアドレッシングモードの使用が優位であると仮定 します (あるいは仮定しません)。複雑なアドレッシングモードは K-シリーズでは 使用する価値は無いかも知れませんが、 C-シリーズでは確かに使用する価値があります。 現在は .B \-mcomplex\-addr が、CB と CC を除く全てのプロセッサにおけるデフォルトです。 .TP .B \-mcode\-align .TP .B \-mno\-code\-align より高速なフェッチのためにコードを 8 バイトにアラインします (または何も しません)。現在では C シリーズの実装においてのみデフォルトで有効にしています。 .TP .B \-mic\-compat .TP .B \-mic2.0\-compat .TP .B \-mic3.0\-compat iC960 v2.0 または v3.0 との互換性を持たせます。 .TP .B \-masm\-compat .TP .B \-mintel\-asm iC960 アセンブラとの互換性を持たせます。 .TP .B \-mstrict\-align .TP .B \-mno\-strict\-align アラインされないアクセスを許可しません (あるいは許可します)。 .TP .B \-mold\-align Intel による gcc リリースバージョン 1.3 (gcc 1.37 ベース) との構造体の 境界条件に関する互換性を持たせます。現在は、 .B #pragma align 1 が同時に仮定されてしまい、無効化できないというバグを持っています。 .PP 以下は、DEC Alpha 用に定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-mno-soft-float .TP .B \-msoft-float 浮動小数点操作に対して、ハードウェアによる浮動小数点命令を使用します (し ません)。もし、\c .B \-msoft-float\c \& が指定された場合は、`\|\c .B libgcc1.c\c \&\|' 内の関数が浮動小数点演算に使用されます。ただし、これらのルーチンが 浮動小数点演算をエミュレートするルーチンによって置き換えられているか、 そのようなエミュレーションルーチンを呼び出すようにコンパイルされている のでない限り、これらのルーチンは浮動小数点演算を行なってしまいます。浮動小 数点演算のない Alpha のためのコンパイルを行なうためには、ライブラリも これらを呼び出さないようにコンパイルされていなければなりません。 .Sp 浮動小数点演算のない Alpha の実装は、浮動小数点レジスタを必要とすると いうことに注意して下さい。 .TP .B \-mfp-reg .TP .B \-mno-fp-regs 浮動小数点レジスタセットを使用する (使用しない)コードを生成します。 .B \-mno-fp-regs\c \& は暗黙のうちに \c .B \-msoft-float\c \& を含みます。浮動小数点レジスタセットが使用されない場合は、浮動小数点 オペランドは整数レジスタに入れられて渡され、浮動小数点数の結果は $f0 では なく $0 に入れて返されます。これは非標準の関数呼び出し手順であり、 浮動小数点数の引数や返り値を持つ関数で、\c .B \-mno-fp-regs\c \& をつけてコンパイルされたコードから呼び出される関数はすべてこのオプションを つけてコンパイルされている必要があります。 .Sp このオプションの典型的な用法は、浮動小数点レジスタを使用せず、したがっ て浮動小数点レジスタへのセーブもリストアも必要のないカーネルを構築する 時などがあるでしょう。 .PP ここに追加するオプションは System V Release 4 において、これらのシステム上の 他のコンパイラとの互換性のために提供されるものです。 .TP .B \-G SVr4 システムにおいて、\c .B gcc\c \& は `\|\c .B \-G\c \&\|' オプションを受け付けます (そして これをシステムリンカに渡します)。これは他のコンパイラとの互換性のためです。 しかし、リンカオプションを \c .B gcc のコマンドラインから渡すよりも、我々は `\|\c .B \-symbolic\c \&\|' または `\|\c .B \-shared\c \&\|' の使用が適当であると考えています。 .TP .B \-Qy コンパイラが使用したそれぞれのツールのバージョンを .B .ident\c \& アセンブラディレクティブを使用して、出力で明示します。 .TP .B \-Qn .B .ident\c \& ディレクティブを出力に加えることを抑制します (これは デフォルトです)。 .TP .BI "\-YP," "dirs" `\|\c .B \-l\c \&\|' で指定されたライブラリに対して、 .I dirs\c で規定されたディレクトリのみを検索し、他は検索しません。 .I dirs\c \& 中は、1 つのコロンで区切ることにより、 複数のディレクトリエントリを記述します。 .TP .BI "\-Ym," "dir" M4 プリプロセッサを \c .I dir\c \& に検索します。アセンブラがこのオプションを使用します。 .SH コード生成オプション これらのマシン独立オプションは、 コード生成にて使用されるインタフェース規約を制御します。 .PP これらのほとんどは `\|\c \-f\c \&\|' で始まります。これらのオプションは有効形式と無効形式の 2 つの形式を持っ ています。`\|\c .B \-ffoo\c \&\|' の無効形式は `\|\c .B \-fno\-foo\c \&\|' です。以下に挙げる表においては、このうち、デフォルトではない片 方のみが挙げられています。`\|\c .B no\-\c \&\|' を追加するか、削除するかによって双方の形式を得ることができます。 .TP .B \-fnonnull\-objects 参照型によって参照されるオブジェクトはヌルでないと仮定します (C++ のみ)。 .Sp 通常は GNU C++ は参照型によって参照されるオブジェクトに関しては保守的 な仮定を行います。例えば、コンパイラは \c .B a が以下のコードにおいてヌルでないことをチェックする必要があります。 .Sp obj &a = g (); a.f (2); .Sp この種の参照がヌルでないことのチェックは、特別なコードを必要とします。 しかし、これは多くのプログラムにとって無用なものです。 このヌルに対するチェックを必要のない場合 `\|\c .B \-fnonnull-objects\c \&\|' を使用することにより、省略することができます。 .TP .B \-fpcc\-struct\-return .B struct\c \& と \c .B union の値を返す場合に、普通の C コンパイラが行なうのと同じ規約を使用します。 この規約は小規模な構造体に対して非効率なものとなり、また多くのマシンでその 関数を再入不可能としてしまいます。しかしこれは、GCC でコンパイルされたコード と PCC でコンパイルされたコードを相互に呼び出すことを可能とするとい う利点を持ちます。 .TP .B \-freg\-struct\-return .B struct と .B union の値を返す場合に、可能な場合はレジスタを使用する規約を使用します。これは .BR \-fpcc\-struct\-return を使用した場合と比較して、小さな構造体を返す場合に高い性能を発揮します。 .Sp .B \-fpcc\-struct\-return と .BR \-freg\-struct\-return のどちらも使用しなかった場合には、GNU CC は各ターゲットに対して標準で あると考えられる規約をデフォルトとして使用します。 もし標準規約がなかった場合は、 .BR \-fpcc\-struct\-return をデフォルトとして使用します。 .TP .B \-fshort\-enums .B enum\c \& 型に対して、ちょうど取り得る値の範囲に応じたバイト数の型を与えます。 具体的には、\c .B enum\c \& 型は、その値域を格納するに十分な最小の整数型と等価になります。 .TP .B \-fshort\-double .B double を .B float \& と同サイズにします。 .TP .B \-fshared\-data データと非 \c .B const\c \& 変数を、プライベートなデータではなく、共有データとしてコンパイルします。 このオプションは、走行中の同じプログラム間は共有データが共有され、 プライベートデータがそれぞれのプロセスに 1 つずつ与えられるような一部 のオペレーティングシステムで意味を持ちます。 .TP .B \-fno\-common bss セクション中の初期化されていないグローバル変数に対してでも、共通ブロック に生成するのではなく、領域を割り当てます。このオプションは、(\c .B extern\c \& をつけずに) 同一の変数を宣言した 2 つのコンパイルに対して、リンク時 にエラーを発生するという効果があります。このオプションは、常にこのような動 作を行なうシステムにおいても、プログラムが正常に動作するかどうかを検査 する場合にのみ有用です。 .TP .B \-fno\-ident `\|\c .B #ident\c \&\|' ディレクティブを無視します。 .TP .B \-fno\-gnu\-linker (C++ のコンストラクタとデストラクタのような) グローバルな初期化のコードを (GNU リンカがこれらを扱う標準のシステムであるようなシステムにおいて) GNU リンカで使用される形式で出力しません。これは GNU リンカではない リンカを使用する場合に指定します。この場合、 .B collect2\c \& を使用して、確実にシステムリンカにコンストラクタとデストラクタを含 んだコードを出力させる必要があります。(\c .B collect2\c \& は GNU CC のディストリビューションに含まれます。) \c .B collect2 \c を\c .I 必ず使用しなければならない\c \& システムにおいては、 コンパイラドライバ \c .B gcc\c \& は自動的にそのようにコンフィギュレーションされます。 .TP .B \-finhibit-size-directive .B .size\c アセンブラディレクティブなど、関数が途中で分割され、メモリ上の異なった 位置にそれぞれの部分が配置されるような場合に不都合が生じるような要素を 出力しません。このオプションは `\|\c .B crtstuff.c\c \&\|' をコンパイルする時に使用されます。それ以外の場所ではこれを使用する 必要はありません。 .TP .B \-fverbose-asm 出力のアセンブラ中に特別なコメント情報を追加し、可読性を高めます。この オプションは一般的には、出力のアセンブラコードを本当に読みたい場合 (例え ばコンパイラ自身をデバッグしているような場合) にのみ効果があります。 .TP .B \-fvolatile ポインタによるメモリの参照を全て volatile として扱います。 .TP .B \-fvolatile\-global 外部変数やグローバルデータアイテムへのメモリ参照を全て volatile として 扱います。 .TP .B \-fpic このオプションがターゲットマシンでサポートされていれば、位置独立なコードを 出力します。このオプションは共有ライブラリでの使用に適します。 .TP .B \-fPIC このオプションがターゲットマシンでサポートされていれば、位置独立なコードを 出力します。このオプションはダイナミックリンクに適しており、分岐にお いて大きなディスプレースメントを要求する場合にも適応します。 .TP .BI "\-ffixed\-" "reg" 名前が \c .I reg\c \& のレジスタを固定レジスタとして扱います。生成されたコードはこのレジスタ を参照しません (ただし、スタックポインタ、フレームポインタ、その他固定用 途の場合を除きます)。 .Sp .I reg\c \& はレジスタ名でなければなりません。受け付けられるレジスタ名はマシン固 有であり、マシン記述マクロファイル内の \c .B REGISTER_NAMES マクロに記述されたものです。 .Sp このフラグは無効形式を持ちません。なぜなら、これは 3 通りの指定が可能で あるからです。 .TP .BI "\-fcall\-used\-" "reg" 名前が \c .I reg\c \& のレジスタを、関数呼び出しによって破壊される割り当て可能のレジスタ として取り扱います。これは、関数呼び出しを跨いで存在しない一時領域や変数 として割り当ることができます。この指定でコンパイルされた関数は、レジスタ \c .I reg\c \& の保存や復帰を行いません。 .Sp このフラグをマシンの実行モデルにおいて、ある固定的で特殊な役割を持って いるレジスタ、例えばスタックポインタやフレームポインタに対して適用する ことは、破滅的な結果を生みます。 .Sp このフラグは無効形式を持ちません。なぜなら、これは 3 通りの指定が可能で あるからです。 .TP .BI "\-fcall\-saved\-" "reg" 名前が \c .I reg\c \& のレジスタを、関数によって保存される割り当て可能なレジスタとして取 り扱います。これは、関数呼び出しを跨いで存在する一時領域や変数としても割り 当てることができます。この指定でコンパイルされた関数は、レジスタ \c .I reg\c \& を使用する場合、その保存と復帰を行います。 .Sp このフラグをマシンの実行モデルにおいて、ある固定的で特殊な役割を持って いるレジスタ、例えばスタックポインタやフレームポインタに対して適用する ことは、破滅的な結果を生みます。 .Sp また、このフラグを関数の返り値が格納されるレジスタに使用すると、これも 破滅的な結果を生みます。 .Sp このフラグは無効形式を持ちません。なぜなら、これは 3 通りの指定が可能で あるからです。 .SH プラグマ 2 つの `\|\c .B #pragma\c \&\|' ディレクティブ(指令)が GNU C++ によってサポートされています。これは、1 つのヘッダファイルを 2 つの目的、つまりあるオブジェクトクラスのための インタフェースの定義としての目的と、オブジェクトクラスに含まれる内容 の完全な定義としての目的の、両方の目的で使用するためのものです。 .TP .B #pragma interface (C++ のみ) このディレクティブを、オブジェクトクラスを定義しているヘッダファイル中 に使用することによって、それらのクラスを使用するほとんどのオブジェクト ファイルの大きさを減少させることができます。通常は、 特定の情報 (インラインメンバ関数のバックアップコピー、デバッグ情報、 仮想関数実現のための内部テーブル) の複製がそのクラス定義をインクルードした それぞれのオブジェクトファイル中に置かれます。 このプラグマを使用することによって、このような複製を防ぐことが 可能となります。`\|\c .B #pragma interface\c \&\|' を含んだヘッダファイルをインクルードした場合は、これらの追加情報 は生成されません (ただし、メインの入力ソースファイル自身が `\|\c .B #pragma implementation\c \&\|' を含んでいる場合を除きます)。そのかわり、オブジェクトファイルは リンク時に解決される参照を含むことになります。 .TP .B #pragma implementation .TP \fB#pragma implementation "\fP\fIobjects\fP\fB.h"\fP (C++ のみ) インクルードされたヘッダファイルによる完全な出力を生成させたい (またそ れをグローバルに可視化したい) 場合には、メインの入力ファイル中でこの プラグマを使用します。この場合、インクルードされるヘッダファイルは、`\|\c .B #pragma interface\c \&\|' を使用していなければなりません。インライン関数のバックアップ情報、 デバッグ情報、仮想関数実現用の内部テーブルは、全てインプリメンテーション ファイル中に生成されます。 .Sp `\|\c .B #pragma implementation\c \&\|' を、引数をつけずに使用した場合は、これはそのソースファイルと同じ ベースネーム(basename)を持つファイルに対して適用されます。例えば、`\|\c .B allclass.cc\c \&\|' 中の `\|\c .B #pragma implementation\c \&\|' は、`\|\c .B #pragma implementation \*(lqallclass.h\*(rq \c \&\|' と等価です。もし複数のヘッダファイルに対して、 1 つのインプリメンテーションファイルを対応させたい場合は、 文字列の引数を使用する必要があります。 .Sp 1 つのヘッダファイルに対して、複数のインプリメンテーションファイルを対 応させる方法はありません。 .SH 関連ファイル .nf .ta \w'LIBDIR/g++\-include 'u file.c C 言語ソースファイル file.h C 言語ヘッダ (プリプロセッサ) ファイル file.i プリプロセス済みの C 言語ソースファイル file.C C++ ソースファイル file.cc C++ ソースファイル file.cxx C++ ソースファイル file.m Objective-C ソースファイル file.s アセンブリ言語ファイル file.o オブジェクトファイル a.out リンクエディット済みの出力 \fITMPDIR\fR/cc\(** 一時ファイル群 \fILIBDIR\fR/cpp プリプロセッサ \fILIBDIR\fR/cc1 C 言語コンパイラ \fILIBDIR\fR/cc1plus C++ コンパイラ \fILIBDIR\fR/collect いくつかのマシンで必要となるリンカのフロントエンド \fILIBDIR\fR/libgcc.a GCC サブルーチンライブラリ /lib/crt[01n].o スタートアップルーチン \fILIBDIR\fR/ccrt0 C++ 用の付加的なスタートアップルーチン /lib/libc.a 標準ライブラリ、\c .IR intro (3) \c を参照 /usr/include \fB#include\fP ファイルのための標準ディレクトリ \fILIBDIR\fR/include \fB#include\fP ファイルのための GCC 標準ディレクトリ \fILIBDIR\fR/g++\-include \fB#include\fP ファイルのための付加的な g++ ディレクトリ .Sp .fi .I LIBDIR は通常 .B /usr/local/lib/\c .IR machine / version の形式を持ちます .br .I TMPDIR は環境変数 .B TMPDIR (もし使用可能ならば .B /usr/tmp を、そうでなければ .B /tmp\c \& を使用します) からとられます。 .SH "関連項目" cpp(1), as(1), ld(1), gdb(1). .br .B info \c 中の .RB "`\|" gcc "\|', `\|" cpp \|', .RB "`\|" as "\|', `\|" ld \|', .RB `\| gdb \|' \& エントリ .br .I Using and Porting GNU CC (for version 2.0)\c , Richard M. Stallman; .I The C Preprocessor\c , Richard M. Stallman; .I Debugging with GDB: the GNU Source-Level Debugger\c , Richard M. Stallman and Roland H. Pesch; .I Using as: the GNU Assembler\c , Dean Elsner, Jay Fenlason & friends; .I ld: the GNU linker\c , Steve Chamberlain and Roland Pesch. .SH バグ バグを報告する方法については、GCC マニュアルを参照してください。 .SH COPYING Copyright .if t \(co 1991, 1992, 1993 Free Software Foundation, Inc. .PP Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. .PP Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. .PP Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English. .SH 作者 GNU CC に対して貢献した人々に関しては、GNU CC マニュアルを参照してください。 .SH 日本語訳 細川 達己(hosokawa@mt.cs.keio.ac.jp): NetBSD 用に翻訳 .br sakai@csl.cl.nec.co.jp, h-nokubi@nmit.mt.nec.co.jp, .br kumano@strl.nhk.or.jp, horikawa@isrd.hitachi.co.jp: FreeBSD 向けに修正, 査閲 diff --git a/ja/man/man1/lex.1 b/ja/man/man1/lex.1 index e72307fe79..750dcd3412 100644 --- a/ja/man/man1/lex.1 +++ b/ja/man/man1/lex.1 @@ -1,4071 +1,4072 @@ .\" jpman %Id: lex.1,v 1.3 1997/05/19 16:38:22 horikawa Stab % .TH FLEX 1 "April 1995" "Version 2.5" .SH 名称 flex \- 高速な字句解析処理系の生成ツール .SH 書式 .B flex -.B [\-bcdfhilnpstvwBFILTV78+? \-C[aefFmr] \-Pprefix \-Sskeleton] +.B [\-bcdfhilnpstvwBFILTV78+? \-C[aefFmr] \-ooutput \-Pprefix \-Sskeleton] +.B [\-\-help \-\-version] .I [filename ...] .SH 概説 本マニュアルは、 テキストのパターンマッチングを行うプログラムを生成するツール .I flex を扱います。 本マニュアルはチュートリアルとリファレンス節とを含みます: .nf 解説 ツールの短い概説 簡単な例 入力ファイルのフォーマット パターン flex が使用する拡張した正規表現 入力のマッチ方法 何がマッチするかを決定する規則 アクション パターンがマッチした時に何を行うかを指定する方法 生成されたスキャナ flex が生成するスキャナに関する詳細; 入力元の制御方法 開始条件 スキャナへの文脈の導入と、 "ミニスキャナ" の制御方法 複数の入力バッファ 複数の入力元を扱う方法; ファイルではなく文字列からスキャンする方法 ファイルの終りのルール ファイルの終りにマッチする特別なルール 雑多なマクロ アクションで使用可能なマクロのまとめ ユーザが使用可能な値 アクションで使用可能な値のまとめ Yacc とのインタフェース lex スキャナと yacc パーサとの結合 オプション flex のコマンドラインオプションと、 "%option" ディレクティブ 性能関連 スキャナを可能な限り高速にする方法 C++ スキャナの生成 C++ スキャナクラス生成のための (実験的な) 機能 Lex および POSIX との非互換性 AT&T lex および POSIX lex 標準と flex との違い 診断 flex (もしくは生成したスキャナ) が出力する エラーメッセージで意味が明確でないもの 関連ファイル flex が使用するファイル 欠陥 / バグ flex の既知の問題 関連項目 ツールに関係する他のドキュメント 作者 連絡方法を含みます .fi .SH 解説 .I flex は .I スキャナ を生成するためのツールです。 ここで、スキャナとは、 テキスト内の字句パターンを解析するプログラムです。 .I flex は指定したファイル、もしくはファイル名が与えられなかった場合は 標準入力から、生成するスキャナの記述を読み込みます。 この記述は、 正規表現と C コードのペアの形をとっています。 これは .I ルール と呼ばれます。 .I flex は、出力として C ソースファイルの .B lex.yy.c を生成しますが、その中に .B yylex() ルーチンが定義されます。 このファイルはコンパイルされ、 .B \-ll ライブラリとともにリンクされて、 実行形式となります。 実行形式が走り始めると、 正規表現をマッチさせるために 入力が解析されます。 マッチするものを見つけると、対応する C コードが実行されます。 .SH 簡単な例 .PP まず簡単な例から、 .I flex の使い方を見て行きましょう。 次の .I flex の入力は、"username" という文字列に出会うとユーザのログイン名に置き換える スキャナを指定しています: .nf %% username printf( "%s", getlogin() ); .fi デフォルトでは、 .I flex スキャナにマッチしなかったテキストは出力にコピーされますので、 "username" を展開しながら入力を出力にコピーすることが このスキャナの最終的な結果となります。 この入力にはただ一つのルールだけがあります。 "username" は .I パターン であり、"printf" は .I アクション です。 "%%" はルールの始まりの印です。 .PP 別の例を見て見ましょう: .nf %{ int num_lines = 0, num_chars = 0; %} %% \\n ++num_lines; ++num_chars; . ++num_chars; %% main() { yylex(); printf( "# of lines = %d, # of chars = %d\\n", num_lines, num_chars ); } .fi このスキャナは入力の文字数および行数を数えます (数えた最終結果を報告するだけです)。 最初の行は 2 つの大域変数 "num_lines" と "num_chars" を宣言します。 これらの変数は、2 番目の "%%" の後に宣言されている .B yylex() と .B main() のルーチンからアクセス可能です。 ここには 2 つのルールがあります。 1 つ目は改行文字 ("\\n") にマッチし、行数と文字数のカウントを増加させます。 もう 1 つは、改行文字以外の全ての文字 ("." という正規表現で表されています)にマッチします。 .PP 次はもうちょっと複雑な例です: .nf /* scanner for a toy Pascal-like language */ %{ /* need this for the call to atof() below */ #include %} DIGIT [0-9] ID [a-z][a-z0-9]* %% {DIGIT}+ { printf( "An integer: %s (%d)\\n", yytext, atoi( yytext ) ); } {DIGIT}+"."{DIGIT}* { printf( "A float: %s (%g)\\n", yytext, atof( yytext ) ); } if|then|begin|end|procedure|function { printf( "A keyword: %s\\n", yytext ); } {ID} printf( "An identifier: %s\\n", yytext ); "+"|"-"|"*"|"/" printf( "An operator: %s\\n", yytext ); "{"[^}\\n]*"}" /* eat up one-line comments */ [ \\t\\n]+ /* eat up whitespace */ . printf( "Unrecognized character: %s\\n", yytext ); %% main( argc, argv ) int argc; char **argv; { ++argv, --argc; /* skip over program name */ if ( argc > 0 ) yyin = fopen( argv[0], "r" ); else yyin = stdin; yylex(); } .fi これは Pascal のような言語の単純なスキャナの原型です。 異なったタイプの .I トークン を定義し、これを見付けると報告します。 .PP この例の詳細は、以降の節で説明します。 .SH 入力ファイルのフォーマット .I flex の入力ファイルは 3 つの部分からなり、 .B %% だけからなる行により分けられます: .nf 定義 %% ルール %% ユーザコード .fi .I 定義 部分は、スキャナの宣言を単純化する単純な .I 名前 の定義の宣言と、後で説明する .I 開始条件 の宣言とからなります。 .PP 名前の定義は次の形式です: .nf 名前\ 定義 .fi "名前" は語であり、 レターかアンダースコア ('_') から始まって 0 個以上のレター・数字・'_'・'-' (ダッシュ)が続きます。 定義は、名前に続く最初の非空白文字から始まり、行末まで続くものとされます。 定義は後で "{名前}" で参照でき、"(定義)" を展開します。 例えば、 .nf DIGIT [0-9] ID [a-z][a-z0-9]* .fi は、 "DIGIT" が単一の数字にマッチする正規表現であると定義し、 "ID" がレターに 0 個以上のレターか数字が続く正規表現であると定義します。 後で出て来る参照 .nf {DIGIT}+"."{DIGIT}* .fi は .nf ([0-9])+"."([0-9])* .fi と同じであり、1 個以上の数字に '.' が続き、 0 個以上の数字が続くものにマッチします。 .PP .I flex の入力の .I ルール は次の形式の一連のルールからなります: .nf パターン\ \ \ アクション .fi ここで、パターンはインデントされていてはならず、 アクションは同じ行から始まる必要があります。 .PP パターンとアクションの詳細は後の解説を見て下さい。 .PP 最後に、ユーザコードの部分は単純にそのままの形で .B lex.yy.c にコピーされます。 スキャナを呼び出すまたは呼び出される付随ルーチンのために使用されます。 この部分はあっても無くても構いません; 無い場合には、入力ファイル中の 2 番目の .B %% も省略できます。 .PP 定義とルールの部分では、 .I インデントされた テキストと .B %{ と .B %} との間のテキストはそのままの形で出力にコピーされます (この際 %{} は削除されます)。 %{} はインデントされていない行に現れる必要があります。 .PP ルールの部分では、 最初のルールの前に現れるインデントされたもしくは %{} 部分のテキストは、 スキャンルーチンにローカルな変数と、 (宣言の後では)スキャンルーチンに入るたびに実行されるコードとを宣言します。 ルール部分の他のインデントされたもしくは %{} 部分のテキストは 出力にコピーされますが、 意味はちゃんと定義されておらずコンパイル時にエラーとなるかも知れません (この仕様は .I POSIX 互換のためにあります; 他のこのような仕様は以降を見て下さい)。 .PP 定義の部分(ルールの部分ではないです)では、 インデントされていないコメント("/*" から始まる行) は次の "*/" まで そのままの形でコピーされます。 .SH パターン 入力ファイルのパターンは拡張した正規表現を使って記述します。 以下に示します: .nf x 文字 'x' にマッチ。 . 改行を除く全ての文字(バイト)。 [xyz] "文字クラス"; この場合、'x', 'y', 'z' のいずれにも マッチします。 [abj-oZ] 範囲指定を含む "文字クラス"; この場合、'a', 'b' と 'j' から 'o' までの任意のレターと 'Z' にマッチします。 [^A-Z] "否定文字クラス"; クラスに含まれない任意の文字に マッチします。 この場合、'A' から 'Z' までの大文字 「以外の」文字にマッチします。 [^A-Z\\n] 大文字と改行を「除く」全ての文字。 r* 0 もしくはそれ以上の r。r は任意の正規表現。 r+ 1 もしくはそれ以上の r。 r? 0 もしくは 1つの r (「おまけ」の r) r{2,5} 2 つから 5つまでの r。 r{2,} 2 つ以上の r。 r{4} ちょうど 4つ の r。 {名前} "名前" の定義の展開。 (上を参照) "[xyz]\\"foo" 文字列 [xyz]"foo \\X X が 'a', 'b', 'f', 'n', 'r', 't', 'v' のいずれかの とき、ANSI-C での \\X の解釈となります。 それ以外の場合、文字 'X' ('*' のようなオペレータの 意味を打ち消し、その文字自体を指定する際に使います)。 \\123 8進数で 123 と表される文字。 \\x2a 16進数で 2a と表される文字。 (r) r にマッチ; ()は 優先順位を変えるために使用。 (以下を参照) rs 正規表現 r に正規表現 s が続く; 「連結(concatenation)」 と呼びます。 r|s r もしくは s。 r/s 後ろに s が続く時の r。 s にマッチするテキストはこのルールの "最長適合" を判定する 時には含まれますが、アクションが実行される前に 入力に戻されます。 アクションは r にマッチするテキストだけを見ます。 このパターンは "右文脈(trailing context)" と呼ばれます。 (flex が正確にマッチ不能な r/s の組合せは複数あります; "危険な右文脈" については、 以降の、欠陥 / バグ の節の記述を見て下さい。) ^r 行頭にある r。(スキャンの始まりもしくは スキャンされた改行の右です)。 r$ 行末にある r。"r/\\n" と等価(改行の前です)。 "r/\\n" と同じです。 flex の "改行" の表現は flex をコンパイルした C コンパイラが解釈する '\\n' と完全に一致することに 注意して下さい; 特定のシステム DOS では \\r を入力から取り除くか "r$" を表すために明示的に r/\\r\\n を使用する必要があります。 r 開始条件 s における r。(開始条件については以下を 参照)。 r 上に同じ。ただし開始条件は s1, s2, s3 のいずれでもよい。 <*>r 任意の開始条件の r。開始条件は排他的なものでもよい。 <> ファイルの終了。 <> 開始条件が s1 もしくは s2 であるときのファイルの終了。 .fi 文字クラス中では、全ての正規表現のオペレータは、 エスケープ ('\\') および 文字クラスオペレータである '-' と ']' とクラスの先頭の '^' を除き 特別な意味を失うことに注意して下さい。 .PP 上に挙げた正規表現は優先順位によってグループに分けられています。 一番上のグループが最も高い優先度で、 一番下のグループの優先順位が最も低くなっています。 グループ内では同じ優先順位です。例えば、 .nf foo|bar* .fi は .nf (foo)|(ba(r*)) .fi と同じです。なぜなら '*' オペレータは連結より優先度が高く、 連結は選言 ('|') より優先度が高いからです。このパターンは 文字列 "foo" .I もしくは 文字列 "ba" に 0 個以上の r がつづくものの .I どちらにも マッチします。 "foo" もしくは 0 個以上の "bar" にマッチさせるためには次の表現を使用して下さい: .nf foo|(bar)* .fi 0 個以上の "foo" または "bar" にマッチするためには次の表現を使用して下さい: .nf (foo|bar)* .fi .PP 文字もしくは文字範囲に加え、文字クラスも文字クラスの .I 表現 を含みます。 これらの表現は .B [: および .B :] のデリミタに囲まれます (文字クラスの '[' と ']' との間に現れる必要があります; 他の要素が文字クラス中に現れても構いません)。 有効な表現は以下の通りです: .nf [:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:] .fi これらの表現は対応する標準 C の .B isXXX 関数に適合する全ての文字集合を指示します。例えば、 .B [:alnum:] は .B isalnum() が真を返す文字を指示します - すなわちすべてのアルファベットと数字です。 .B isblank(), が無いシステムでは、flex は .B [:blank:] を空白とタブと定義します。 .PP 例えば以下の表現は全て同じです: .nf [[:alnum:]] [[:alpha:][:digit:]] [[:alpha:]0-9] [a-zA-Z0-9] .fi スキャナが大文字小文字を意識しない場合( .B \-i フラグ指定時) .B [:upper:] と .B [:lower:] は .B [:alpha:] と同じです。 .PP パターンに関する注意点です: .IP - 否定文字クラス、例えば上の "[^A-Z]" は "\\n" (もしくはこれを表すエスケープシーケンス) が明示的に 否定文字クラスに現れている場合 (例えば "[^A-Z\\n]") を除き .I 改行にマッチします。 これは他の正規表現ツールが否定文字クラスを扱う方法とは異なりますが、 不幸なことにこの矛盾は歴史的に確立しています。 改行にマッチするとは、 入力に別のクオートが存在しない場合に [^"]* のようなパターンが 入力全体にマッチすることを意味します。 .IP - ルールは右文脈('/' オペレータもしくは '$' オペレータ) を高々一つしか持てません。 開始条件 '^' と "<>" パターンは パターンの最初になければならず、 '/', '$' 同様に () 内にいれることは出来ません。 ルールの先頭ではない '^' もしくはルールの終りではない '$' は 特別な意味を失い、通常の文字として扱われます。 .IP 以下は無効です: .nf foo/bar$ foobar .fi 前者は "foo/bar\\n" と書けます。 .IP 以下では '$' と '^' とは通常の文字として扱われます: .nf foo|(bar$) foo|^bar .fi "foo" もしくは "改行が続く bar" を指定したい場合は、 次の表現を使用して下さい (特別な '|' の動作は後で説明します): .nf foo | bar$ /* action goes here */ .fi 同じ方法で、foo もしくは 行頭の bar を指定可能です。 .SH 入力のマッチ方法 生成したスキャナを実行すると、 スキャナは入力を見てパターンにマッチする文字列を探します。 1 より多くのマッチを見付けると、最長テキストのマッチを採用します (右文脈(trailing context rule)の後ろの部分も長さに含みますが、 後ろの部分は入力に戻されます)。 同じ長さのマッチを 2 つ以上見付けた場合、 .I flex 入力ファイルで最初に記述されたルールを採用します。 .PP マッチが決定すると、マッチに対応するテキスト( .I トークン と呼ばれます)がグローバル文字ポインタ .B yytext により使用可能となり、長さがグローバル整数 .B yyleng により使用可能となります。 その後、マッチしたパターンに対応する .I アクション が実行され(アクションの詳細な記述は後で行います)、 残りの入力が残りのマッチのためにスキャンされます。 .PP マッチが見付からないと、 .I デフォルトルール が実行されます: 入力の次の文字がマッチしたと見倣され、 標準出力にコピーされます。最も簡単で正当な .I flex の入力は以下の通りです: .nf %% .fi これは、入力を単純に出力にコピー(1 度に 1 文字ずつ)するスキャナを生成します。 .PP .B yytext は 2 つの異なった方法により定義されうることに注意して下さい: 文字 .I ポインタ もしくは文字 .I 配列 です。 .I flex がどちらの定義を使用するかは特別なディレクティブ .B %pointer もしくは .B %array を flex の入力の最初の(定義)部分に含めることにより制御できます。 デフォルトは .B %pointer であり、 .B -l lex 互換オプションを使用した場合には例外的に .B yytext は配列になります。 .B %pointer を使用する利点はスキャンが高速であること、 非常に大きなトークンにマッチする時にも (動的メモリを使用し尽くさない限り)バッファオーバフローとならないことです。 欠点は、アクションが .B yytext を修正することが制限されること(次節参照)、 .B unput() 呼び出しが .B yytext の現在の内容を破壊することです。 これは異なる .I lex バージョン間での移植性に関する頭痛の種です。 .PP .B %array の利点は .B yytext の内容を思った通りに変更できること、 .B unput() を呼び出しても .B yytext の内容が破壊されないことです(下記参照)。 その上、既存の .I lex プログラムは .B yytext を外部から次の形式の宣言を使用してアクセスしていることがあります: .nf extern char yytext[]; .fi この定義は .B %pointer 使用時には誤りですが、 .B %array 使用時には正しいです。 .PP .B %array は .B yytext を文字数 .B YYLMAX (デフォルトは十分大きな値)の配列であると定義します。 この大きさは、 .I flex の入力の最初の部分で単純に .B YYLMAX を異なった値に #define することにより変更できます。 上記の通り、 .B %pointer 使用時には yytext は大きなトークンを格納するために動的に大きくなります。 このことは .B %pointer を使用したスキャナは非常に大きなトークン (例えばコメントブロック全体)を格納可能であることを意味しますが、 スキャナが .B yytext の大きさを変えるたびにトークン全体を先頭から再スキャンすることが必要となるため このようなトークンに対するマッチングは遅くなりうることを覚えておいて下さい。 現在、 .B yytext は .B unput() が結果として返すテキストが大きい時には動的には大きくなり .I ません; 実行時エラーとなります。 .PP また、 .B %array は C++ スキャナクラスでは使用できないことに注意して下さい( .B c++ オプションに関しては下記参照)。 .SH アクション ルール中のパターンは対応するアクションを持ちます。 アクションは任意の C の文です。 パターンは最初のエスケープされていない空白文字で終ります; 行の残りがアクションです。 アクションが空である場合、 パターンがマッチした時に入力トークンは単純に捨てられます。 例えば入力から全ての "zap me" を削除するプログラムの仕様を示します: .nf %% "zap me" .fi (入力の他の全ての文字を出力にコピーします。 なぜならデフォルトルールにマッチするからです。) .PP 次は、複数の空白や文字を単一の空白に圧縮し行末の空白を捨てるプログラムです: .nf %% [ \\t]+ putchar( ' ' ); [ \\t]+$ /* ignore this token */ .fi .PP アクションが '{' を含む場合、アクションは対応する '}' まで続き、 複数行に渡る場合もあります。 .I flex は C の文字列およびコメントに関して知っており、 それらの中のブレースを誤解することはありませんが、 アクションが .B %{ で始まることを許し、次の .B %} までのテキストがアクションであるとします (アクション内部の任意個のブレースには関係ありません)。 .PP 垂直バー ('|') のみからなるアクションは "次のルールと同じ" を意味します。説明は以下を見て下さい。 .PP アクションは任意の C コードを含むことが出来ます。 これには、 .B yylex() を呼び出したルーチンに対して値を返す .B return 文も含まれます。 .B yylex() が呼ばれるたび、最後に残ったトークンから処理を再開し、 ファイルの終了もしくは return を実行するまで処理を行います。 .PP アクションは自由に .B yytext を変更できますが、例外は長さを増やすことです (文字を末尾に加えることになり、 これは入力ストリームの後続する文字を上書きします)。 これは .B %array 使用時には当てはまりません(上述); この場合 .B yytext を自由に変更できます。 .PP アクションは自由に .B yyleng を変更できますが、アクションが .B yymore() を使用する時には例外的に変更してはいけません(後述)。 .PP 多くの特別なディレクティブがあり、アクション中に含めることが出来ます: .IP - .B ECHO yytext をスキャナの出力にコピーします。 .IP - .B BEGIN 後ろに開始条件の名前を書くと、スキャナを対応する開始条件に設定します(後述)。 .IP - .B REJECT 入力(もしくは入力の頭)に "2 番目によく(second best)" マッチするルール に進むようにスキャナに指示します。 "入力のマッチ方法" で示したようにルールは選択され、 .B yytext と .B yyleng は適切に設定されます。 選択されるルールは、最初に選択されたルールと同じ長さであるが .I flex の入力ファイルにて後で出て来るもの、もしくは少ない文字数にマッチするものです。 例えば次の例では入力中の語を数え、 "frob" が見付かるたびにルーチン special() を呼びます: .nf int word_count = 0; %% frob special(); REJECT; [^ \\t\\n]+ ++word_count; .fi .B REJECT が無い場合、 入力中の "frob" は語として数えられず、 スキャナは通常通りトークン毎に 1 つのアクションだけを行います。 複数の .B REJECT を使用可能であり、それぞれ現在有効なルールの次に良い選択を見付けます。 例えば次のスキャナは、"abcd" というトークンをスキャンし、 出力に "abcdabcaba" を書きます: .nf %% a | ab | abc | abcd ECHO; REJECT; .|\\n /* eat up any unmatched character */ .fi (前の 3 つのルールは 4 番目のルールのアクションを共有します。 なぜなら特別な '|' アクションが使用されているからです。) .B REJECT はスキャナの性能という点で特にコストのかかる機能です; もしスキャナのアクションの .I いずれか にでも REJECT が使われたなら、スキャナの .I 全ての マッチング速度を低下させるということです。 さらに .B REJECT をオプション .I -Cf や .I -CF と共に用いることは出来ません。 .IP また、他の特別アクションと違い .B REJECT は .I 分岐(branch) であることに注意してください; すなわち REJECT 直後のアクションは 実行 .I されません。 .IP - .B yymore() 次にルールとマッチしたときには、対応するトークンは、 現在の .B yytext の内容と入れ換えるのではなく .B yytext に .I 追加 するようスキャナに指示します。 例えば、入力 "mega-kludge" が与えられると、以下は "mega-mega-kludge" を出力に書きます: .nf %% mega- ECHO; yymore(); kludge ECHO; .fi 最初の "mega-" はマッチし出力にエコーされます。 次に "kludge" がマッチしますが、直前の "mega-" がまだ .B yytext の先頭に残っており、"kludge" の .ECHO ルールは実際には "mage-kludge" を書きます。 .PP .B yymore() の使用に関し 2 つの注意点があります。 まず、 .B yymore() は現在のトークンの大きさを反映する .I yyleng の値の正確さに依存することであり、 .B yymore() 使用時には .I yyleng を変更してはなりません。 次に、 スキャナのアクションに .B yymore() があると、スキャナのマッチ速度に若干悪影響があります。 .IP - .B yyless(n) 現在のトークンから最初の .I n 文字を除いたものを入力ストリームに戻します。 戻した文字列はスキャナが次のマッチングをとるときに再度スキャンされます。 .B yytext と .B yyleng は適切に調整されます(例えば .B yyleng は .I n となります)。 例えば、入力 "foobar" が与えられると、以下は "foobarbar" を書きます: .nf %% foobar ECHO; yyless(3); [a-z]+ ECHO; .fi 引数 0 を .B yyless に与えると、現在の入力文字列全体が再度スキャンされます。 (例えば .B BEGIN を使用して)次にスキャナが入力する方法を変更していないと、無限ループとなります。 .PP .B yyless はマクロであり、flex 入力ファイルでのみ使用可能であり、 別のソースファイルからは使用不能であることに注意して下さい。 .IP - .B unput(c) 文字 .I c を入力ストリームへ戻します。戻した文字は次にスキャンされる文字になります。 次のアクションは現在のトークンを取り上げ、 括弧内に入れて再スキャンします。 .nf { int i; /* Copy yytext because unput() trashes yytext */ char *yycopy = strdup( yytext ); unput( ')' ); for ( i = yyleng - 1; i >= 0; --i ) unput( yycopy[i] ); unput( '(' ); free( yycopy ); } .fi .B unput() は文字を入力ストリームの .I 先頭 に戻すので、文字列を戻す場合には後ろから前に向かって戻す必要があります。 .PP .B unput() 使用時の重要な潜在的な問題は、 .B %pointer 使用時(デフォルト)に .B unput() を呼び出すと、 右端の文字から開始し 1 文字ずつ左に向かって消費され、 .I yytext の内容が .I 破壊 されることです。 (上記例のように) .B unput() 呼び出し後も .I yytext の内容を保存するためには、始めに別の場所にコピーするか、 スキャナを .B %array を使うように構築することです(入力のマッチ方法参照)。 .PP 最後に、 .B EOF を戻して入力ストリームにファイルの終りをマークするとは 出来ないことに注意して下さい。 .IP - .B input() 次の文字を入力ストリームから読みます。 次の例は C コメントを食べます: .nf %% "/*" { register int c; for ( ; ; ) { while ( (c = input()) != '*' && c != EOF ) ; /* eat up text of comment */ if ( c == '*' ) { while ( (c = input()) == '*' ) ; if ( c == '/' ) break; /* found the end */ } if ( c == EOF ) { error( "EOF in comment" ); break; } } } .fi (スキャナが .B C++ でコンパイルされたときは、このルーチンは .B yyinput() という名称になり、 .B C++ ストリームの .I input と名前が衝突することを避けます。) .IP - .B YY_FLUSH_BUFFER スキャナの内部バッファをフラッシュし、 次にスキャナがトークンをマッチしようとした時 バッファを .B YY_INPUT にてリフィルします(生成されたスキャナで後述)。 このアクションは、 複数の入力バッファにおいて後述する より一般的な .B yy_flush_buffer() 関数の特別なケースです。 .IP - .B yyterminate() アクションの return 文の代わりに使うことが出来ます。 .B yyterminate() はスキャナを終了し、"全て終了" を意味する 0 を呼び出し元関数に返します。 デフォルトでは .B yyterminate() はファイルの終わりに達したときにも呼ばれます。 .B yyterminate() はマクロであり、定義しなおすことができます。 .SH 生成されたスキャナ .I flex の出力は .B lex.yy.c というファイルであり、スキャンルーチン .B yylex() と、トークンのマッチングに使用する複数のテーブルと、 複数の付属ルーチンとマクロからなります。デフォルトでは、 .B yylex() は次のように宣言されます: .nf int yylex() { ... various definitions and the actions in here ... } .fi (環境が関数プロトタイプをサポートしている場合、 "int yylex( void )" となります。) この定義は "YY_DECL" マクロを定義することにより変更できます。 例えば次のように使用することが出来ます: .nf #define YY_DECL float lexscan( a, b ) float a, b; .fi これはスキャンルーチンの名前を .I lexscan とし、浮動小数点数を返すようにし、2 つの浮動小数点数を引数とします。 K&R の非プロトタイプの関数宣言を使用してスキャンルーチンに対して引数を 与える場合、定義をセミコロン(;)で終了する必要があります。 .PP .B yylex() は呼ばれるたび、グローバル入力ファイル .I yyin (デフォルトでは標準入力)からトークンをスキャンします。 ファイルの終りになる(この場合 0 を返します)か、 アクションが .I return 文を実行するまで、実行を続けます。 .PP スキャナがファイルの終りに到達すると、 .I yyin が新たなファイルを指さないか (新たなファイルを指す場合はこのファイルのスキャンを続けます)、 .B yyrestart() が呼ばれない限り、 後続する呼び出しは未定義です。 .B yyrestart() は .B FILE * ポインタ( .B YY_INPUT を設定して .I yyin 以外のソースをスキャンするようにした場合には nil も可です) である引数を 1 つとり、そのファイルからのスキャンのために .I yyin を初期化します。 本質的に、 .I yyin を新しい入力ファイルに割り当てることと .B yyrestar() を使用することとは同じです; 後者は前のバージョンの .I flex との互換性のために使用可能であり、 またスキャンの途中で入力ファイルを変えることが可能です。 引数を .I yyin として呼び出すことにより、現在の入力バッファを捨てることも出来ます; ただし、 .B YY_FLUSH_BUFFER (上述)を使用する方が良いです。 .B yyrestart() は .B INITIAL の開始条件を変更し .I ない ことに注意して下さい (後述の開始条件参照)。 .PP あるアクション中で .I return 文を実行することにより .B yylex() がスキャンを止めた場合、スキャナは再度呼び出し可能であり、 この場合スキャンの残りの部分から再開します。 .PP デフォルトで(効率のため)、スキャナは単純な .I getc() コールではなくブロックリードを行い、 .I yyin から文字を読みます。 入力取得方法は .B YY_INPUT マクロを定義することにより制御できます。 YY_INPUT 呼び出し手順は "YY_INPUT(buf,result,max_size)" です。 このアクションは、 .I buf 文字配列中に最大 .I max_size 文字を用意し、整数変数 .I result 中に読めた文字数もしくは定数 YY_NULL (Unix システムでは 0)を入れて返します。 デフォルトの YY_INPUT はグローバルファイルポインタ "yyin" から読みます。 .PP YY_INPUT のサンプル定義です(入力ファイルの定義部に格納): .nf %{ #define YY_INPUT(buf,result,max_size) \\ { \\ int c = getchar(); \\ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \\ } %} .fi この定義により、入力処理は 1 度に 1 文字ずつ行うように変更されます。 .PP スキャナが YY_INPUT からファイルの終りを通知された場合、 スキャナは .B yywrap() 関数をチェックします。 .B yywrap() 関数が偽(ゼロ)を返す場合、関数は続行中であるとされ、 .I yyin を別の入力ファイルを指すように設定し、スキャンを続行します。 関数が真(非ゼロ)を返す場合、スキャナは終了し、呼び出し元に 0 を返します。 どちらの場合も開始条件は変化しないことに注意して下さい; つまり .B INITIAL には戻り .I ません。 .PP 独自の .B yywrap() を設定しない場合、 .B %option noyywrap (この場合スキャナは .B yywrap() が 1 を返したかのように動作します)を使用するか、フラグ .B \-ll を指定してデフォルトのルーチン(常に 1 を返します)を使用しなければなりません。 .PP ファイルではなくメモリ中のバッファからスキャンするための 3 つのルーチンを 使用可能です: .B yy_scan_string(), yy_scan_bytes(), yy_scan_buffer() 。 これらに関する議論は複数の入力バッファの節を参照して下さい。 .PP スキャナは、自己の .B ECHO 出力を .I yyout グローバル(デフォルトでは標準出力であり、 別の .B FILE ポインタに割り当てることで再定義できます)に書きます。 .SH 開始条件 .I flex は、条件的に有効となるルールのための機構を提供します。 パターンのプレフィックスが "" となっているルールは、 スキャナが "sc" という名前の開始条件にいる場合のみ有効です。 例えば、 .nf [^"]* { /* eat up the string body ... */ ... } .fi はスキャナが "STRING" 開始条件にいる時のみ有効であり、 .nf \\. { /* handle an escape ... */ ... } .fi は現在の開始条件が、 "INITIAL", "STRING", "QUOTE" のいずれかの場合のみ有効です。 .PP 開始条件は、入力の定義(先頭)部において、インデントされない行で .B %s もしくは .B %x から始まり名前が続く行において宣言されます。 前者は .I 内包的 開始条件を、 後者は .I 排他的 開始条件を、それぞれ宣言します。 開始条件を有効にするのは .B BEGIN アクションです。 次の .B BEGIN アクションが実行されるまで、与えられた開始条件のルールは有効であり、 他の開始条件のルールは無効です。 開始条件が .I 内包的 な場合、開始条件を持たないルールもまた有効です。 開始条件が .I 排他的 な場合、 開始条件を満たすルール .I だけ が有効です。 同じ排他開始条件に依存するルールの組は、 .I flex 入力中の別のルールとは独立なスキャナを記述します。 そのため、排他開始条件を使用すれば、"ミニスキャナ" (別部分とは文法的に異なる部分(例えばコメント)に対するスキャナ) を簡単に指定できます。 .PP 内包的開始条件と排他的開始条件とがまだ少し曖昧であるなら、 両者の関係を表す例を示して説明します。以下のルールの組: .nf %s example %% foo do_something(); bar something_else(); .fi は .nf %x example %% foo do_something(); bar something_else(); .fi と等価です。 .B が無いと、2 番目の例における .I bar パターンは、開始条件が .B example の場合、有効となりません(すなわちマッチしません)。 .B だけを .I bar につけると、 .B example だけにおいて有効となり、 .B INITIAL では有効となりません。一方、最初の例ではどちらの場合でも有効です。 なぜなら最初の例では .B example 開始条件は .I 内包的 .B (%s) 開始条件だからです。 .PP 特殊な開始条件指定子 .B <*> は全ての開始条件にマッチすることに注意して下さい。 このため、上の例は次のようにも書けます; .nf %x example %% foo do_something(); <*>bar something_else(); .fi .PP デフォルトルール(マッチしなかった文字に対しては .B ECHO です)は開始条件中でも有効です。 これは次のものと等価です: .nf <*>.|\\n ECHO; .fi .PP .B BEGIN(0) は、開始条件の無いルールだけが有効である、最初の状態に戻ります。 この状態は開始条件 "INITIAL" として参照できるため、 .B BEGIN(INITIAL) は .B BEGIN(0) と等価です。 (開始条件名を括る括弧は不要ですが、良いスタイルであるとされています。) .PP .B BEGIN アクションは、ルール部の先頭のインデントされたコード中に現れても良いです。 例えば以下の例では、 .B yylex() が呼ばれグローバル変数 .I enter_special が真の場合には、スキャナは "SPECIAL" 開始条件に入ります: .nf int enter_special; %x SPECIAL %% if ( enter_special ) BEGIN(SPECIAL); blahblahblah ...more rules follow... .fi .PP 開始条件を説明するために、 "123.456" のような文字列を 2 通りの異なった解釈をするスキャナを示します。 デフォルトではこれは、 整数 "123" とドット ('.') と整数 "456" の 3 トークンに数えられます。 しかし、この文字列の前に "expect-floats" の文字列がある場合、 これは単一のトークンであるとされ、浮動小数点数 123.456 とされます: .nf %{ #include %} %s expect %% expect-floats BEGIN(expect); [0-9]+"."[0-9]+ { printf( "found a float, = %f\\n", atof( yytext ) ); } \\n { /* that's the end of the line, so * we need another "expect-number" * before we'll recognize any more * numbers */ BEGIN(INITIAL); } [0-9]+ { printf( "found an integer, = %d\\n", atoi( yytext ) ); } "." printf( "found a dot\\n" ); .fi 次は、C のコメントを理解(して捨てる)一方で、 現在の入力行を数えるスキャナです。 .nf %x comment %% int line_num = 1; "/*" BEGIN(comment); [^*\\n]* /* eat anything that's not a '*' */ "*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */ \\n ++line_num; "*"+"/" BEGIN(INITIAL); .fi このスキャナは各ルールで可能な最大のテキストにマッチしようとする場合、 ちょっとした問題が起こります。 一般的には、高速なスキャナを記述する場合、 各ルールで最大のマッチを得ようとすることが最も成功します。 .PP 開始条件名は実際には整数値であり、格納することが出来ることに注意して下さい。 そのため、上記例は以下のように拡張できます: .nf %x comment foo %% int line_num = 1; int comment_caller; "/*" { comment_caller = INITIAL; BEGIN(comment); } ... "/*" { comment_caller = foo; BEGIN(comment); } [^*\\n]* /* eat anything that's not a '*' */ "*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */ \\n ++line_num; "*"+"/" BEGIN(comment_caller); .fi さらに、現在の開始条件を整数値であるマクロ .B YY_START にてアクセスできます。 例えば、上記の .I comment_caller への代入は次のように記述できます。 .nf comment_caller = YY_START; .fi flex は .B YYSTATE を .B YY_START のエイリアスとして提供します (AT&T の .I lex が使用しています)。 .PP 開始条件は独自の名前空間を持たないことに注意して下さい; %s や %x の宣言における名前宣言の扱いは #define と同じです。 .PP 最後に、排他的開始条件を使用する、 展開されたエスケープシーケンスを含む(長すぎる文字列のチェックは含みません) C スタイルのクオート文字列へのマッチ方法を示します: .nf %x str %% char string_buf[MAX_STR_CONST]; char *string_buf_ptr; \\" string_buf_ptr = string_buf; BEGIN(str); \\" { /* saw closing quote - all done */ BEGIN(INITIAL); *string_buf_ptr = '\\0'; /* return string constant token type and * value to parser */ } \\n { /* error - unterminated string constant */ /* generate error message */ } \\\\[0-7]{1,3} { /* octal escape sequence */ int result; (void) sscanf( yytext + 1, "%o", &result ); if ( result > 0xff ) /* error, constant is out-of-bounds */ *string_buf_ptr++ = result; } \\\\[0-9]+ { /* generate error - bad escape sequence; something * like '\\48' or '\\0777777' */ } \\\\n *string_buf_ptr++ = '\\n'; \\\\t *string_buf_ptr++ = '\\t'; \\\\r *string_buf_ptr++ = '\\r'; \\\\b *string_buf_ptr++ = '\\b'; \\\\f *string_buf_ptr++ = '\\f'; \\\\(.|\\n) *string_buf_ptr++ = yytext[1]; [^\\\\\\n\\"]+ { char *yptr = yytext; while ( *yptr ) *string_buf_ptr++ = *yptr++; } .fi .PP 上記例のように同一の開始条件を持つ全てのルールの前に 開始条件を書かねばならないことが多いです。 flex はこれを簡単かつ綺麗にするため開始条件 .I スコープ を導入しました。 開始条件スコープは次のように始まります: .nf { .fi ここで .I SCs は 1 つ以上の開始条件のリストです。 開始条件スコープ内では、 最初の .I '{' にマッチするまでの .I '}' において、全てのルールは自動的に .I のプレフィックスが付きます。 そのため、例えば .nf { "\\\\n" return '\\n'; "\\\\r" return '\\r'; "\\\\f" return '\\f'; "\\\\0" return '\\0'; } .fi は次のものと等価です: .nf "\\\\n" return '\\n'; "\\\\r" return '\\r'; "\\\\f" return '\\f'; "\\\\0" return '\\0'; .fi 開始条件スコープはネストすることが出来ます。 .PP 開始条件のスタックを制御するために 3 つのルーチンを使用可能です: .TP .B void yy_push_state(int new_state) 現在の開始条件を開始条件スタックの先頭にプッシュし、 .B BEGIN new_state を使用したかのように .I new_state に切替えます (開始条件名は整数値でもあることを思い出して下さい)。 .TP .B void yy_pop_state() スタックの先頭をポップし、 .B BEGIN を使用してその開始条件に切替えます。 .TP .B int yy_top_state() スタックの内容を変更せずに、スタックの先頭を返します。 .PP 開始条件スタックは動的に大きくなり、 また組み込み時のサイズ制限はありません。 メモリを使い切ると、プログラム実行は中止されます。 .PP 開始条件スタックを使用するためには、スキャナは .B %option stack ディレクティブをインクルードする必要があります (下記オプションを参照して下さい)。 .SH 複数の入力バッファ スキャナによっては(ファイルの "include" をサポートする等) 複数の入力ストリームを扱う必要があります。 .I flex スキャナでは大きなバッファリングを行うため、 スキャンコンテキストに影響される .B YY_INPUT を単純に書き換えるだけでは次の入力がどこから読まれるのかを制御できません。 .B YY_INPUT が呼ばれるのはスキャナがバッファの終りに到達する時だけですので、 例えば "include" のように入力元を切替える必要のある文をスキャンした後でも 長時間を費す場合があります。 .PP この様な問題を解決するため、 .I flex は複数の入力バッファを生成して切替える機構を提供します。 入力バッファは次のように生成されます: .nf YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) .fi これは .I FILE ポインタと size を取り、与えられる file に関連し .I size 文字を保持するに十分なバッファを生成します (疑わしい場合には size には .B YY_BUF_SIZE を使用して下さい)。 これは、別のルーチン(下記参照)に渡すための .B YY_BUFFER_STATE ハンドルを返します。 .B YY_BUFFER_STATE のタイプは .B struct yy_buffer_state 構造体へのポインタであるため、 安全のため YY_BUFFER_STATE 変数を .B ((YY_BUFFER_STATE) 0) と初期化することが出来、 スキャナではなくソースファイルにおいて 入力バッファを正しく宣言するためにこの構造体を参照することが出来ます。 .B yy_create_buffer 呼び出しにおける .I FILE ポインタは .B YY_INPUT から見える .I yyin の値と同じようにだけ使用されることに注意して下さい; .B YY_INPUT を再定義して .I yyin を使わないようにすることにより、 .B yy_create_buffer に対して安全にニル .I FILE ポインタを渡せます。 スキャンするバッファを選択するためには次のようにします: .nf void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) .fi これはスキャナの入力バッファを切替え、 トークンが .I new_buffer から来るようになります。 新たなファイルをオープンして .I yyin を指すのではなく、スキャンを継続するために yywrap() から .B yy_switch_to_buffer() を使用することがあることに注意して下さい。 また、 .B yy_switch_to_buffer() または .B yywrap() による入力元の切替えは開始条件を変更し .I ない ことにも注意して下さい。 .nf void yy_delete_buffer( YY_BUFFER_STATE buffer ) .fi はバッファに関連づけられたストレージの返還要求に使用します。( .B buffer はニルでも構いませんがこの場合このルーチンは何もしません。) 現在のバッファの内容をクリアするには次のようにします: .nf void yy_flush_buffer( YY_BUFFER_STATE buffer ) .fi この関数はバッファの内容を捨てるため、 次にスキャナがこのバッファとトークンのマッチを行う場合、 スキャナはまず .B YY_INPUT を使用してこのバッファをフィルします。 .PP .B yy_new_buffer() は .B yy_create_buffer() のエイリアスであり、動的オブジェクトの生成と破壊のために使用する C++ の .I new と .I delete との互換性のために提供しています。 .PP 最後に .B YY_CURRENT_BUFFER マクロは、現在のバッファに対する .B YY_BUFFER_STATE ハンドルを返します。 .PP この機能を使用してインクルードファイルを展開するスキャナの記述例です( .B <> 機能は後述します): .nf /* the "incl" state is used for picking up the name * of an include file */ %x incl %{ #define MAX_INCLUDE_DEPTH 10 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; %} %% include BEGIN(incl); [a-z]+ ECHO; [^a-z\\n]*\\n? ECHO; [ \\t]* /* eat the whitespace */ [^ \\t\\n]+ { /* got the include file name */ if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) { fprintf( stderr, "Includes nested too deeply" ); exit( 1 ); } include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER; yyin = fopen( yytext, "r" ); if ( ! yyin ) error( ... ); yy_switch_to_buffer( yy_create_buffer( yyin, YY_BUF_SIZE ) ); BEGIN(INITIAL); } <> { if ( --include_stack_ptr < 0 ) { yyterminate(); } else { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( include_stack[include_stack_ptr] ); } } .fi ファイルではなくメモリ上の文字列をスキャンするための 入力バッファを設定するための 3 つのルーチンを使用可能です。 いずれも文字列をスキャンする新しい入力バッファを生成し、対応する .B YY_BUFFER_STATE ハンドル(終了時には .B yy_delete_buffer() にて消去します)を返します。新しいバッファに切替える時には .B yy_switch_to_buffer() を使用し、次の .B yylex() の呼び出し時にはこの文字列をスキャン開始します。 .TP .B yy_scan_string(const char *str) NUL ターミネートされた文字列をスキャンします。 .TP .B yy_scan_bytes(const char *bytes, int len) .I len バイト (NUL が含まれるかも知れません)を位置 .I bytes からスキャンします。 .PP どちらの関数も文字列もしくはバイト列の .I コピー を生成してからスキャンします。( .B yylex() はスキャンするバッファの内容を変更するため、これが望ましいのです。) コピーを避けるためには次のようにします: .TP .B yy_scan_buffer(char *base, yy_size_t size) バッファ内で .I base から .I size バイトの長さをスキャンします。最後の 2 バイトは .B YY_END_OF_BUFFER_CHAR (ASCII NUL) である .I 必要があります。 これらの最後の 2 バイトはスキャンされません; そのためスキャンの内容は .B base[0] から .B base[size-2] までで両端を含みます。 .IP この様になるように .I base を設定しなかった場合(つまり最後の 2 つの .B YY_END_OF_BUFFER_CHAR バイトを忘れた場合)、 .B yy_scan_buffer() は新しいバッファを生成するのではなくニルポインタを返します。 .IP 型 .B yy_size_t は整数型であり、 バッファの大きさを反映する整数式をこの型にキャストすることが出来ます。 .SH ファイルの終りのルール 特別ルール "<>" は、 ファイルの終了時もしくは yywrap() が非ゼロ(すなわち処理するファイルが無いことを表す)の時に 行われるべきアクションを表します。 アクションは以下の 4 つのうちのいずれかで終る必要があります。 .IP - .I yyin に新しいファイルを割り当てる(前のバージョンの flex では、 割り当て後に特別なアクション .B YY_NEW_FILE を呼び出す必要がありました; 今では不要です。); .IP - .I return 文を実行する; .IP - 特別な .B yyterminate() アクションを実行する; .IP - .B yy_switch_to_buffer() を使用して新たなバッファに切替える (上記例で示した通り)。 .PP <> ルールを他のパターンと共に使用してはなりません; 他のパターンは開始条件のリストともにだけ満たされるからです。 満たされない <> ルールが与えられた場合、 <> アクションをまだ持っていない .I 全ての 開始条件に適用されます。 <> ルールを最初の開始条件だけに指定するためには次のようにして下さい。 .nf <> .fi .PP これらのルールは閉じていないコメントを捕まえる場合等に便利です。 例えば: .nf %x quote %% ...other rules for dealing with quotes... <> { error( "unterminated quote" ); yyterminate(); } <> { if ( *++filelist ) yyin = fopen( *filelist, "r" ); else yyterminate(); } .fi .SH 雑多なマクロ マクロ .B YY_USER_ACTION にはマッチルールアクションに先だって常に行うアクションを定義できます。 例えば、yytext を小文字に変換するルーチンを呼ぶように #define 出来ます。 .B YY_USER_ACTION 起動時には、変数 .I yy_act はマッチしたルールの番号を与えます(ルールは 1 番から数えます)。 各ルールがマッチする頻度を知りたい場合を想像して下さい。 以下に仕掛けを示します: .nf #define YY_USER_ACTION ++ctr[yy_act] .fi ここで .I ctr は配列であり、それぞれのルールがマッチした回数を計数します。 マクロ .B YY_NUM_RULES はルールの総数を表すため( .B \-s を使った時でさえデフォルトルールを含みます)、 正しい .I ctr の宣言は次のようになります: .nf int ctr[YY_NUM_RULES]; .fi .PP マクロ .B YY_USER_INIT には最初のスキャンの前に常に行うアクションを再定義できます (スキャナの内部初期化の前に行われます)。 例えばデータ表を読み込んだり、ログファイルをオープンするために使用できます。 .PP マクロ .B yy_set_interactive(is_interactive) は現在のバッファが .I 対話的 と見倣されているか否かを制御するために使用します。 対話的なバッファの処理は遅くなりますが、 スキャナの入力元が対話的でありバッファをフィルするのを待つことに起因する 問題を避けるためには指定しなければなりません(以下の .B \-I フラグに関する議論を参照して下さい)。 マクロ起動時に非ゼロを指定するとバッファは対話的になり、 ゼロを指定すると非対話的になります。 このマクロの使用は .B %option always-interactive と .B %option never-interactive に優先します(下記オプションを参照して下さい)。 バッファをスキャンして対話的である(もしくはでない)と判断される前に、 .B yy_set_interactive() を起動して下さい。 .PP マクロ .B yy_set_bol(at_bol) は現在のバッファにおける次のトークンに対するマッチのためのスキャンが 行頭から始まるか否かを制御します。 非ゼロのマクロ引数は、'^' が付いたルールを有効にしますが、 ゼロのマクロ引数は '^' が付いたルールを無効にします。 .PP 現在のバッファからスキャンされた次のトークンが有効な '^' ルールを持つ時、 マクロ .B YY_AT_BOL() は真を返します。 そうでない場合は偽を返します。 .PP 生成されたスキャナでは、全てのアクションは大きな一つの switch 文に 集められ、 .B YY_BREAK で分けられています。 .B YY_BREAK は再定義可能です。デフォルトではそれぞれのルールのアクションを 分けるための単なる "break" です。 .B YY_BREAK を再定義することにより、例えば C++ ユーザが #define YY_BREAK を何もしないように定義し (ただし全てのルールが "break" か "return" で終るように 注意しなければなりません!)、 ルールのアクションが "return" で終ることにより .B YY_BREAK がアクセスできないことに起因する、 到達できない文があるという警告を避けることが出来ます。 .SH ユーザが使用可能な値 この節ではユーザがルールのアクション部分で使用可能な値をまとめます。 .IP - .B char *yytext 現トークンのテキストを保持しています。内容を変更しても構いませんが、 その長さを伸ばしてはいけません(終りに文字を追加してはいけない)。 .IP スキャナの記述の最初の部分に特別な指示である .B %array が書かれているとき、 .B yytext は .B char yytext[YYLMAX] と定義されます。 .B YYLMAX はマクロで、デフォルトの値 (多くの場合8KB) を変更したい場合には 最初の部分で再定義可能です。 .B %array を使うといくらか遅いスキャナになりますが、 .B yytext の値は .I input() と .I unput() の呼び出しでも破壊されなくなります。 .B yytext が文字ポインタである場合、 これらの関数呼び出しは .B yytext を破壊する可能性があります。 .B %array と対称な指定 .B %pointer がデフォルトです。 .IP C++ のスキャナクラスを生成する (オプション .B \-+ ) ときには .B %array は使えません。 .IP - .B int yyleng 現トークンの長さを保持しています。 .IP - .B FILE *yyin はデフォルトで .I flex が読むファイルです。再定義することは可能ですが、スキャンを 始める前か EOF に到達した後でのみ再定義は意味を持ちます。 スキャンの途中で変更すると予想外の結果をもたらします。 というのも .I flex は入力をバッファリングしているからです; そのような場合には、直接再定義せず .B yyrestart() を使って下さい。 ファイルの終わりでスキャンが終了した場合には .I yyin を新しい入力ファイルに割り当て、 再びスキャナを呼び出してスキャンを続けることが出来ます。 .IP - .B void yyrestart( FILE *new_file ) を呼ぶことで .I yyin が新しい入力ファイルを指すように出来ます。新しいファイルへの変更は すぐに行われます (それまでにバッファに読み込まれていた入力は失われます)。 .I yyin を引数として .B yyrestart() を呼ぶと、現在の入力バッファを捨てて同じ入力ファイルを スキャンし続けることに注意して下さい。 .IP - .B FILE *yyout は .B ECHO アクションが行われる対象のファイルです。 ユーザが再割当することが出来ます。 .IP - .B YY_CURRENT_BUFFER カレントバッファの .B YY_BUFFER_STATE ハンドルを返します。 .IP - .B YY_START 現在の開始条件に対応する整数値を返します。 続いてこの値を .B BEGIN と共に使うことで、スキャナをその開始条件へ戻すことが出来ます。 .SH YACC とのインタフェース .I flex の主な使用方法の一つは、 .I yacc パーサジェネレータと共に使用することです。 .I yacc パーサは .B yylex() と言う名前のルーチンを呼び、次の入力トークンを見付けるものとしています。 このルーチンは、次のトークンの型を返し、 関連する値をグローバルの .B yylval に格納するものとされています。 .I flex を .I yacc と共に使うには、 .I yacc に .B \-d オプションを指定して、 .I yacc の入力に現れる全ての .B %tokens の定義を含む .B y.tab.h ファイルを生成させます。 このファイルは .I flex スキャナにインクルードされます。 例えばトークンの一つが "TOK_NUMBER" である場合、 スキャナの一部分は次のようになっています: .nf %{ #include "y.tab.h" %} %% [0-9]+ yylval = atoi( yytext ); return TOK_NUMBER; .fi .SH オプション .I flex には以下のようなオプションがあります: .TP .B \-b バックアップ情報を .I lex.backup に出力します。 このファイルには、スキャナのバックアップ(backing-up)を必要とする状態と それに対応する入力文字の一覧がリストされます。 ルールを追加することでバックアップ状態を取り除くこと ができます。バックアップ状態が .I 全て 取り除かれ、 .B \-Cf または .B \-CF を指定すると、生成されたスキャナの実行速度が向上します( .B \-p フラグを見て下さい)。 スキャナをぎりぎりまで最適化しようとしてるユーザのみが このオプションに関係あります。 (後述の性能関連の節を見て下さい。) .TP .B \-c 何もしません。POSIX 互換のために用意されています。 .TP .B \-d 生成されたスキャナが .I デバッグ モードで実行されます。 .B yy_flex_debug が非ゼロの場合(デフォルト)、 パターンが認識されるたびに、スキャナは次のようなメッセージを .I 標準エラー出力 へ出力します。 .nf --accepting rule at line 53 ("the matched text") .fi 行番号はスキャナを定義しているファイル (flexに与えられたファイル) でのルールの位置です。 スキャナがバックアップしたとき、デフォルトルールを受け入れたとき、 入力バッファの最後に到達したとき (あるいは、NULに到達したとき; スキャナには、この二つの区別はつきません) 、ファイルの最後に到達した ときにもメッセージが出力されます。 .TP .B \-f .I 高速なスキャナ を指定します。 テーブル圧縮は行われず、標準入出力をバイパスします。 その結果生成されるスキャナは大きくなりますが、高速なものになります。 このオプションは .B \-Cfr と同等です (以下を参照)。 .TP .B \-h .I flex のオプションの要約からなる "ヘルプ" を .I 標準出力 に書き出し終了します。 .B \-? と .B \-\-help とは .B \-h と同じです。 .TP .B \-i .I 大文字小文字を区別しない スキャナを生成します。 .I flex の入力パターンに与えられる文字が大文字であるか小文字であるかは区別されず、 スキャナに入力される文字列は大文字小文字に関係なくマッチします。 マッチしたテキスト .I yytext では入力時の大文字小文字が保存されます (大文字を小文字に変換したりしません)。 .TP .B \-l AT&T の .I lex の実装に対して最大限の互換性を持たせます。これは .I 完全な 互換性を意味しません。 このオプションを使用すると性能に大きな影響があります。 このオプションは、 .B \-+, \-f, \-F, \-Cf, \-CF と同時に使用できません。詳しくは、 後述の "Lex および POSIX との非互換性" の節を御覧下さい。 またこのオプションを使用すると、 .B YY_FLEX_LEX_COMPAT が生成されたスキャナの名前に #define されます。 .TP .B \-n 何もしません。POSIX 互換のためにだけ用意されたオプションです。 .TP .B \-p 性能情報を標準エラー出力に出力します。 .I flex 入力ファイルの記述のうち、 生成されるスキャナの性能低下の深刻な原因となる部分について、 コメントされます。 オプションを2回指定すると、より細かな性能低下についても コメントが出力されます。 .IP .B REJECT ・ .B %option yylineno ・可変長右文脈(欠陥/バグの節で後述)は多大なる性能への悪影響があります; .I yymore() の使用・ .B ^ オペレータ・ .B \-I フラグは小さな性能の悪影響があります。 .TP .B \-s .I デフォルトルール (マッチしないスキャナの入力を .I 標準出力 に出力する) が抑制されます。ルールにマッチしない入力が表れたとき、スキャナは エラーで異常終了します。 スキャナのルールの組に抜けが無いかを確認する場合に有効です。 .TP .B \-t .B lex.yy.c ではなく、標準出力にスキャナを書き出します。 .TP .B \-v 生成するスキャナの特徴の要約を .I 標準エラー出力 に出力するように .I flex に指示します。 ほとんどの特徴は通常の .I flex ユーザには意味がありませんが、最初の行は .I flex のバージョンを表示し( .B \-V で表示されるもと同じです)、次の行はデフォルトを含むスキャナ生成時のフラグです。 .TP .B \-w 警告メッセージを抑制します。 .TP .B \-B .I 対話的 なスキャナ (以下の .B \-I の項を参照) ではなく .I バッチ的 なスキャナを生成するよう .I flex に指示します。 通常 .B \-B を使用するのは、スキャナを対話的に使用しないことが .I 分かっている 時であり、 .I 少しでも 性能を追求したい時です。 より大きい性能を追求する場合には、 .B \-Cf もしくは .B \-CF オプションを使用すべきです(後述)。 .B \-B を自動的に設定します。 .TP .B \-F .ul 高速な スキャナテーブルの表現を使う(標準入出力はバイパスする)ことを指定します。 この表現は、完全テーブル表現 .B (-f) とほぼ同じぐらい高速で、 ある種のパターンに対してはかなり小さく (ある種に対しては大きく) なります。 通常、次のように、パターンの組が "keywords" とその対応 および "identifier" ルールからなる場合: .nf "case" return TOK_CASE; "switch" return TOK_SWITCH; ... "default" return TOK_DEFAULT; [a-z]+ return TOK_ID; .fi この場合、完全テーブル表現を使用する方が良いです。 もし "identifier" ルールからのみ表現され、 キーワードを検知するためにハッシュ表等を使用する場合は、 .B -F を使用する方が良いです。 .IP このオプションは .B \-CFr と等価です (以下を参照)。 これは .B \-+ オプションとは同時に指定できません。 .TP .B \-I .I flex に .I 対話的 なスキャナを生成するように指示します。 対話的なスキャナは、 先読みすることによりマッチするトークンが完全に決まる場合のみ先読みします。 現在のトークンが既に明らかな場合でも常に先読みする方法は、 必要時のみ先読みする方法より少し速いです。 しかし、常に先読みする方法では対話性能に著しく悪影響があります; 例えばユーザが改行を入力した場合、 .I 別の トークンを入力するまでそれは改行として認識されません。 大概の場合、次の行全体を入力することになります。 .IP .I flex のスキャナのデフォルトは .I 対話的 であり、例外は .B \-Cf や .B \-CF といったテーブル圧縮オプション(後述)使用時です。 高性能追求時にはこれらのオプションを使用しているべきですので、 これらのオプションを使用していない場合には、 .I flex は実行時性能を少し犠牲にして直観的な対話的な振舞いを取っているものとします。 .B \-I オプションを .B \-Cf や .B \-CF と共に .I 使用できない ことにも注意して下さい。 実際はこのオプションは不要です; 許される場合、デフォルトで有効になっています。 .IP スキャナを対話的で .I 無い ように強制するには .B \-B (先述)を使用します。 .TP .B \-L .I flex に .B #line ディレクティブを .B lex.yy.c 中に生成しないように指示します。 デフォルトではこの #line ディレクティブを生成するので、 アクションにおけるエラーメッセージは、オリジナルの .I flex 入力ファイル( エラーが入力ファイルのコードに起因する場合)もしくは ファイル .B lex.yy.c ( .I flex の誤り -- 以下の電子メールアドレスに報告して下さい) における正しい位置を与えます。 .TP .B \-T .I flex を .I トレース モードで実行します。 入力の形式とその結果として出力される非決定性/決定性有限 オートマトンに関して .I 標準エラー出力 に多量のメッセージを出力します。 このオプションは主に .I flex をメンテナンスするために使われます。 .TP .B \-V バージョン番号を .I 標準出力 に出力して終了します。 .B \-\-version は .B \-V と同じです。 .TP .B \-7 7 ビットのスキャナを生成します。 すなわち、入力に 7 ビットの文字のみを使用することを意味します。 .B \-7 を指定する利点は、 .B \-8 オプション(後述)を指定して生成するテーブルの半分まで小さくなりうることです。 欠点は、入力に 8 ビット文字が含まれている時に、 スキャナがハングもしくはクラッシュすることです。 .IP しかしながら、 .B \-Cf や .B \-CF といったテーブル圧縮オプション使用時にはテーブル圧縮の効果は少なく、 移植性が著しく低下することに注意して下さい。 .I flex のデフォルトの動作では、 .B \-Cf や .B \-CF, を指定しない限り 8 ビットスキャナを生成します。 指定時には、 あなたのサイトが常に 8 ビットスキャナを生成するように (USA 以外のサイトでは良くあります)していない場合には、 7 ビットスキャナを生成します。 flex が 7 ビットもしくは 8 ビットのいずれのスキャナを生成するのかを 知りたい場合には、上述の .B \-v の出力のフラグの要約を調べて下さい。 .IP .B \-Cfe もしくは .B \-CFe (これらのテーブル圧縮オプションおよび等価クラスは後述) を使用しても、flex はデフォルトで 8 ビットスキャナを生成することに 注意して下さい。 なぜなら、完全な 8 ビットテーブルは 7 ビットテーブルと比べても たいして高価にはならないからです。 .TP .B \-8 8 ビットのスキャナを生成するように .I flex に指示します。すなわち 8 ビット文字を解釈します。 圧縮オプション .B \-Cf と .B \-CF 使用時にのみ必要です。 なぜなら flex はデフォルトでは 8 ビットスキャナを生成するからです。 .IP flex のデフォルト動作と 7 ビットおよび 8 ビットスキャナの トレードオフに関しては、上記 .B \-7 の議論を見て下さい。 .TP .B \-+ C++ のスキャナクラスを生成します。 詳しくは C++ スキャナの生成で後述します。 .TP .B \-C[aefFmr] テーブル圧縮の程度と、 より一般的には小さいスキャナと高速なスキャナとのトレードオフを指定します。 .IP .B \-Ca ("アライン") 生成されるスキャナのテーブルは、 メモリアクセスおよび計算のためにアラインされるため、より大きなものになります。 RISC アーキテクチャではロングワードのフェッチおよび操作は ショートワードといったより小さな大きさのものに対するものより効率的です。 場合によってはスキャナのテーブルサイズが通常の 2倍になることもあります。 .IP .B \-Ce .I 等価クラス (同一の字句属性を持つ文字セット)を構築します (例えば、 .I flex 入力中に数字が現れるのが文字クラス "[0-9]" のみの場合、 数字 '0', '1', ..., '9' は全て同じ等価クラスになります)。 多くの場合、等価クラスを用いることで最終的なテーブル/ オブジェクトファイルのサイズを劇的(平均して 1/2-1/5)に減らすことが出来ます。 また、その際の性能コストは非常に低く抑えられます ( 1文字スキャンするごとに 1回の配列検索を行うだけです)。 .IP .B \-Cf .I 完全(full) スキャナテーブルを生成することを指示します - .I flex は、別の状態に関する類似した遷移関数をうまく利用するという、 テーブル圧縮手法を用いません。 .IP .B \-CF 別の高速スキャナ表現( .B \-F フラグにて記述)を用いることを指定します。 このオプションは .B \-+ と同時に使用できません。 .IP .B \-Cm .I flex に .I メタ等価クラス を構築するよう指示します。 メタ等価クラスは一緒に使われることの多い等価クラス (等価クラスが使われていないときには文字群) の集合です。 圧縮テーブルを使っているとき、 メタ等価クラスは多くの場合にかなりの効果的をもたらしますが、 やや性能に影響します (1-2 回の条件テストと 1 回の配列検索がスキャンした文字ごとに行われます)。 .IP .B \-Cr 生成されたスキャナは入力に対しては標準入出力ライブラリ(標準入出力)を .I バイパス します。 スキャナは、 .B fread() や .B getc() ではなく、 .B read() システムコールを使用します。 性能改善結果はシステムに依存します。 オプション .B \-Cf もしくは .B \-CF を使用していない場合には、 一般にこのオプションは性能をあまり改善しません。 .B \-Cr を指定すると、例えばスキャナを設定する前に標準入出力を使用して .I yyin を読み取る等した場合奇妙な動作となり得ます (標準入出力の入力バッファに以前読み込んだものを、スキャナは読めません)。 .IP .B \-Cr は .B YY_INPUT を定義した場合意味がありません (前述の生成されたスキャナを参照)。 スキャナの呼出に先だって標準入力を使って .I yyin から読みだしているときには、予想外の振る舞いをすることがあります。 .IP .B \-C のみを指定したときには、スキャナはテーブル圧縮は行いますが、 等価クラスもメタ等価クラスも使いません。 .IP オプション .B \-Cf と .B \-CF はオプション .B \-Cm を同時に指定しても意味をなしません - なぜなら、テーブル圧縮が行われないときメタ等価クラス は現れないからです。 それ以外のオプションは自由に組み合わせることが出来ます。 .IP デフォルトの設定は .B \-Cem です。このとき .I flex は等価クラスとメタ等価クラスを生成します。 この設定は最も高いテーブル圧縮を行います。 テーブルサイズの大きさと実行の高速性はトレードオフの関係にあり、 一般に .nf 遅いが 小さい -Cem -Cm -Ce -C -C{f,F}e -C{f,F} -C{f,F}a 速いが 大きい .fi となります。 小さいテーブルのスキャナは通常生成もコンパイルも高速であるため、 通常の開発時は最大の圧縮を行うでしょう。 .IP 製品のスキャナでは、 .B \-Cfe が速度と大きさの良いバランスです。 .TP .B \-ooutput .B lex.yy.c ではなくファイル .B output にスキャナを書くように flex に指示します。 .B \-o と .B \-t オプションを組み合わせると、 スキャナは .I 標準出力 に書かれますが、 .B #line ディレクティブ( .B \\-L にて上述)はファイル .B output を参照します。 .TP .B \-Pprefix .I flex の使うデフォルトのプレフィックス .I "yy" の代わりに .I prefix を使います。これはグローバル変数とファイル名に影響します。 例えば .B \-Pfoo とすると、 .B yytext の名前は .B footext となります。 またデフォルトの出力ファイル名を .B lex.yy.c から .B lex.foo.c に変えます。 影響を受ける名前の一覧です: .nf yy_create_buffer yy_delete_buffer yy_flex_debug yy_init_buffer yy_flush_buffer yy_load_buffer_state yy_switch_to_buffer yyin yyleng yylex yylineno yyout yyrestart yytext yywrap .fi (C++ スキャナ使用時には .B yywrap と .B yyFlexLexer だけが影響を受けます。) スキャナの中では、グローバル変数および関数を どちらの名前ででも参照できます; 外部的には修正した名前のみ持ちます。 .IP このオプションを使用することにより、複数の .I flex プログラムを同一の実行形式に容易にリンクすることが出来ます。 しかし、このオプションは .B yywrap() の名前をも変えますので、 独自の(適切に名前を付けた)ルーチンをスキャナのために用意するか、 .B %option noyywrap を使用して .B \-ll とリンクする .I 必要があります。 どれもデフォルトでは提供されません。 .TP .B \-Sskeleton_file .I flex がスキャナを構築するのに使うデフォルトの スケルトンファイルに優先します。 .I flex のメンテナンスや開発をする場合以外、このオプションは必要ありません。 .PP .I flex は、flex のコマンドラインではなく、 スキャナ仕様記述中からオプションを制御する機構を提供します。 これはスキャナの最初の部分に .B %option ディレクティブを含めることで実現できます。 単一の .B %option ディレクティブにおいて複数のオプションを指定でき、 また複数のディレクティブを flex 入力ファイルの最初の部分に置くことが出来ます。 .PP ほとんどのオプションが単純な名前であり、 オプションとして前に "no" という語(空白をはさみません)を付けて 意味を反転できます。 数値は flex のフラグやその反転と等価です。 .nf 7bit -7 オプション 8bit -8 オプション align -Ca オプション backup -b オプション batch -B オプション c++ -+ オプション caseful または case-sensitive -i オプションの逆(デフォルト) case-insensitive または caseless -i オプション debug -d オプション default -s オプションの逆 ecs -Ce オプション fast -F オプション full -f オプション interactive -I オプション lex-compat -l オプション meta-ecs -Cm オプション perf-report -p オプション read -Cr オプション stdout -t オプション verbose -v オプション warn -w オプションの逆 (-w オプションには "%option nowarn" を使用して下さい) array "%array" と等価 pointer "%pointer" と等価(デフォルト) .fi .B %option には、他では利用できない機能を提供するものもあります: .TP .B always-interactive 入力を常に "対話的" に扱うスキャナを生成するように flex に指示します。 通常、新たな入力ファイル毎にスキャナは .B isatty() を呼び出し、スキャナの入力元が対話的であり 1 度に 1 文字ずつ読むべきか どうか判定しようとします。 一方このオプションを使用するとこの様な呼び出しは行いません。 .TP .B main スキャナに対し、 .B yylex() を呼び出すだけのデフォルトの .B main() プログラムを提供するように指示します。 このオプションは .B noyywrap (後述)も暗黙的に指示します。 .TP .B never-interactive 入力を "対話的" とはしないスキャナを生成するように flex に指示します (これもまた .B isatty() を呼び出しません)。 これは .B always-interactive の逆です。 .TP .B stack 開始条件スタックの使用を有効にします(前述の開始条件を参照)。 .TP .B stdinit 設定されている場合 (すなわち .B %option stdinit) .I yyin および .I yyout を、 デフォルトの .I nil ではなく、 .I 標準入力 と .I 標準出力 に設定します。 既存の .I lex プログラムには、 ANSI C 互換ではないものの、この動作に依存しているものがあります。 ANSI C では .I 標準入力 と .I 標準出力 がコンパイル時の定数である必要はありません。 .TP .B yylineno 入力から読み取った現在の行番号をグローバル変数 .B yylineno に保持するスキャナを生成するように、 .I flex に指示します。 このオプションは .B %option lex-compat から暗黙的に指定されます。 .TP .B yywrap セットされていない場合 (すなわち .B %option noyywrap) 、スキャナはファイルの終りに際し .B yywrap() を呼ばず単にスキャンすべきファイルがもう無いものとするようになります( ユーザが .I yyin を新しいファイルを指すようにし、再度 .B yylex() を呼び出すまでです)。 .PP .I flex はルールアクションをスキャンし、 .B REJECT と .B yymore() の機能が使われているかどうかを調べます。 .B reject と .B yymore のオプションを使用すると、 オプションで指定した通りにこの判定に優先します。 オプションの指定は、セットして機能を使用していることを示す(例えば .B %option reject) 、もしくはアンセットして機能を使用していないことを示す(例えば .B %option noyymore) ものとします。 .PP 次のオプションは文字列の値を取り、'=' で区切ります: .nf %option outfile="ABC" .fi これは .B -oABC と同じであり、 .nf %option prefix="XYZ" .fi は .B -PXYZ と同じです。 最後に、 .nf %option yyclass="foo" .fi は C++ スキャナ生成時のみ有効( .B \-+ オプション)です。これは .I flex に対して、 .B foo が .B yyFlexLexer のサブクラスであることを知らせますので、 .I flex はアクションを .B yyFlexLexer::yylex() ではなく .B foo::yylex() のメンバ関数とします。 また、( .B yyFlexLexer::LexerError() を起動することにより)呼び出すと実行時エラーを除去する .B yyFlexLexer::yylex() メンバ関数を生成します。 詳細は後述の C++ スキャナの生成を見て下さい。 .PP 生成されたスキャナから不要なルーチンを除きたい lint 純正主義者のために 多くのオプションが用意されています。 以下をアンセットすると(例えば .B %option nounput )、対応するルーチンは生成されるスキャナから除かれます: .nf input, unput yy_push_state, yy_pop_state, yy_top_state yy_scan_buffer, yy_scan_bytes, yy_scan_string .fi ( .B yy_push_state() 等は .B %option stack を使用しない場合には現れません)。 .SH 性能関連 .I flex の主なデザインゴールは高性能なスキャナを生成することです。 多くのルールセットを良く扱うことで最適化されます。 既に概説した .B \-C オプション使用によるテーブル圧縮に起因する速度への影響の他に、 性能を悪化させる多くのオプション/アクションがあります。 それらを高価なものから安価なものへと並べます: .nf REJECT %option yylineno 自由長の右文脈(trailing context) バックアップが必要なパターンの組 %array %option interactive %option always-interactive '^' 行頭オペレータ yymore() .fi 最初の 3 つは非常に高価であり、最後の 2 つは非常に安価です。 .B unput() は潜在的に非常に大きな仕事をするルーチン呼び出しとして実装されているのに対し、 .B yyless() は非常に安価なマクロです; ですからスキャンした余分なテキストを戻すだけの場合には .B yyless() を使って下さい。 .PP 性能が重要な場合には、出来うる限りの努力でもって .B REJECT を避けて下さい。 これは特に高価なオプションです。 .PP バックアップを取り除くと、乱雑になり、 ひどく苦労して複雑なスキャナを作ることになります。 実際的には .B \-b フラグを指定して .I lex.backup ファイルを生成することから始めます。例えば、入力 .nf %% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; .fi に対しては、ファイルは次のようになります: .nf State #6 is non-accepting - associated rule line numbers: 2 3 out-transitions: [ o ] jam-transitions: EOF [ \\001-n p-\\177 ] State #8 is non-accepting - associated rule line numbers: 3 out-transitions: [ a ] jam-transitions: EOF [ \\001-` b-\\177 ] State #9 is non-accepting - associated rule line numbers: 3 out-transitions: [ r ] jam-transitions: EOF [ \\001-q s-\\177 ] Compressed tables always back up. .fi 最初の数行は、 \&'o' に遷移できるが他の文字には遷移できない状態があり、 その状態では現在スキャンされたテキストは他のルールにはマッチしないことを 表します。 この状態が発生したのは、 入力ファイルの行 2, 3 のルールにマッチしようとした時です。 スキャナがこの様な状態にあり 'o' 以外の文字を読んだ場合には、 マッチするルールを探すためのバックアップが必要となります。 少し考えれば、これは "fo" を見た時にある状態に違いないことが分かるでしょう。 この様な時、'o' 以外のものが現れると、 スキャナは、単に 'f' にマッチする(デフォルトルール)ところまで 戻り(バックアップし)ます。 .PP 状態 #8 に関係するコメントは、 "foob" がスキャンされた時に問題があることを表しています。 実際、'a' 以外の文字に出会うと、スキャナは "foo" を受理するところまで戻ります。 同様に状態 #9 に関係するコメントは、 "fooba" がスキャンされ 'r' が続かない場合に関係します。 .PP 最後のコメントが通知するのは、 .B \-Cf や .B \-CF を使っているのでなければ バックアップを取り除こうと努力することは無意味であることです。 なぜなら、圧縮されたスキャナに対してそのようなことをしても、 性能上の利益は無いからです。 .PP バックアップを取り除くためには "エラー" ルールを追加します: .nf %% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; fooba | foob | fo { /* false alarm, not really a keyword */ return TOK_ID; } .fi .PP キーワードのリストからバックアップを取り除くには、"全てを捕まえる" ルールを使用することが出来ます: .nf %% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; [a-z]+ return TOK_ID; .fi 通常、適切な時にはこれは一番良い解決策です。 .PP バックアップメッセージはカスケードすることが多いです。 複雑なルールの組では、数百ものメッセージを得るのは普通のことです。 しかし、これを解析すれば、バックアップを除去するためには 大抵の場合数ダースのルールにだけ関係あることが分かるでしょう (しかし、間違えることが多く、誤ったルールが偶然有効なトークンにマッチし得ます。 将来の .I flex の機能では、 自動的にバックアップを除去するルールを追加するようになるかも知れません)。 .PP バックアップを除去することにより利益があるのは、 .I 全ての バックアップを除去した時だけということを覚えておくことは重要です。 たった一つを残しても何も得ることが出来ません。 .PP .I 可変長の 右文脈 (左部分と右部分のいずれかもしくは両方が可変長)は .B REJECT とほぼ同じだけの(すなわち相当の)性能劣化となります。 そのため次のようなルール: .nf %% mouse|rat/(cat|dog) run(); .fi は次のように書くか: .nf %% mouse/cat|dog run(); rat/cat|dog run(); .fi 次のように書いた方が良いです: .nf %% mouse|rat/cat run(); mouse|rat/dog run(); .fi 特別な '|' アクションは助けにはなり .I ません し、かえって状況を悪くします (後述の欠陥/バグを参照)。 .LP スキャナの性能を向上させるための余地(実現は最も容易)は、 マッチするトークンが長ければスキャナが高速になることにあります。 長いトークンではほとんどの入力処理は(短い)内部ループで処理され、 アクションのためにスキャナ環境を設定する追加の仕事(例えば .B yytext) をほとんどしないからです。 C コメントのスキャナを思い出しましょう: .nf %x comment %% int line_num = 1; "/*" BEGIN(comment); [^*\\n]* "*"+[^*/\\n]* \\n ++line_num; "*"+"/" BEGIN(INITIAL); .fi 次のように書くと高速になります: .nf %x comment %% int line_num = 1; "/*" BEGIN(comment); [^*\\n]* [^*\\n]*\\n ++line_num; "*"+[^*/\\n]* "*"+[^*/\\n]*\\n ++line_num; "*"+"/" BEGIN(INITIAL); .fi 今度は、改行毎に別のアクションの処理を行うのではなく、 改行認識はルール間で "分散" され、 可能な限り長いテキストにマッチするようになっています。 ルールの .I 追加 はスキャナを遅く .I しません! スキャナの速度は、ルール数とも、 オペレータ '*' や '|' といったものに基づくルールの複雑さ (この節の始めで扱いました)とも独立です。 .\" 括弧内自信無しです .\" Apr 29 1997, horikawa@jp.freebsd.org .PP 最後の高速化の例です: 1 行に 1 つずつであり別の文字は付かないような、 識別子とキーワードを全てファイルからスキャンすることを考えます。 最初は次のようになるでしょう: .nf %% asm | auto | break | ... etc ... volatile | while /* it's a keyword */ .|\\n /* it's not a keyword */ .fi 後戻りを避けるために全てを捕まえるルールを導入します: .nf %% asm | auto | break | ... etc ... volatile | while /* it's a keyword */ [a-z]+ | .|\\n /* it's not a keyword */ .fi 1 行に正確に 1 語だけあることが保証されている場合、 改行の認識を別のトークンと併せることで、 マッチの総数を半分に減らすことが出来ます: .nf %% asm\\n | auto\\n | break\\n | ... etc ... volatile\\n | while\\n /* it's a keyword */ [a-z]+\\n | .|\\n /* it's not a keyword */ .fi ここで、再度バックアップをスキャナに組み込んだことに 気を付けなければなりません。 実際 .I 我々は 入力ストリームはレターと改行だけであることを知っていますが、 .I flex はこれが分からないため、 トークン "auto" などをスキャンした次の文字が改行でもレターでもない場合には バックアップが必要であると考えます。 以前は "auto" ルールに適合しそれで終りでしたが、 今は "auto" ルールは無く、"auto\\n" ルールだけがあります。 バックアップの可能性を除去するためには、 最後の改行以外のルールを二重化するか、 そのような入力に出くわさないので分類は不要と分かっているため、 改行を導入しないもう一つの全てを捕まえるルールを導入することが出来ます: .nf %% asm\\n | auto\\n | break\\n | ... etc ... volatile\\n | while\\n /* it's a keyword */ [a-z]+\\n | [a-z]+ | .|\\n /* it's not a keyword */ .fi .B \-Cf を付けてコンパイルすると、実際問題上 .I flex で得られるほぼ最速になります。 .PP 最後の注意事項: .I flex は NUL にマッチする時には遅く、トークンが複数の NUL を含む時には特に遅いです。 テキストがしばしば NUL を含むものと予想される場合には、テキストの .I 短い 部分とマッチするようにルールを書くべきです。 .PP もう一つの性能に関する最終注意事項: 入力のマッチ方法の節で既に示したように、 大きなトークンを納めるために .B yytext のサイズを動的に変更すると処理が遅くなります。 なぜなら、(巨大な)トークンを再度先頭からスキャンしなおさねばならないからです。 性能が重要な場合、 テキストの "大きな" 部分にマッチさせるべきですが "巨大な" 部分にマッチさせる べきではありません。 両者の堺目は 8K 文字/トークンです。 .SH C++ スキャナの生成 .I flex は 2 通りの C++ スキャナ生成方法を提供します。 最初の方法は .I flex が生成したスキャナを単に C コンパイラではなく C++ コンパイラで コンパイルするというものです。 この場合コンパイルエラーには出会わないはずです (見付けた場合には作者の節で後述する電子メールアドレスに報告して下さい)。 この場合ルールにおいて C コードではなく C++ コードを書くことが出来ます。 スキャナのデフォルトの入力元は .I yyin のままであり、 デフォルトのエコー先は .I yyout のままであることに注意して下さい。 どちらも .I FILE * 変数のままであり、C++ .I streams ではないです。 .PP .I flex に C++ スキャナクラスを生成させることも出来ます。 .B \-+ オプションを指定する(もしくは等価的に .B %option c++ を使う)とこのように実行され、 flex の実行形式名が '+' で終っている場合には自動的に指定されます。 このオプションを指定すると flex が生成するスキャナのデフォルトはファイル .B lex.yy.cc となり .B lex.yy.c ではありません。 生成されたスキャナは 2 つの C++ クラスとのインタフェースを定義するヘッダファイル .I FlexLexer.h をインクルードします。 .PP 最初のクラス .B FlexLexer は一般的なスキャナクラスを定義する抽象基盤クラスを提供します。 以下のメンバ関数を提供します: .TP .B const char* YYText() 最後にマッチしたテキストを返します。 .B yytext と等価です。 .TP .B int YYLeng() 最後にマッチしたトークンの長さを返します。 .B yyleng と等価です。 .TP .B int lineno() const 現在の入力の行番号( .B %option yylineno 参照)もしくは .B %option yylineno を使用していない場合には .B 1 を返します。 .TP .B void set_debug( int flag ) スキャナのデバッグフラグをセットします。 .B yy_flex_debug に代入するのと同じです(オプションの節で前述)。 スキャナ構築時に .B %option debug を使用してデバッグ情報を組み込む必要があることに注意して下さい。 .TP .B int debug() const 現在のデバッグフラグの設定を返します。 .PP また次のものと等価なメンバ関数も提供されます .B yy_switch_to_buffer(), .B yy_create_buffer() (最初の引数は .B istream* オブジェクトポインタであり .B FILE* ではありません), .B yy_flush_buffer(), .B yy_delete_buffer(), .B yyrestart() (これもまた最初の引数は .B istream* オブジェクトポインタです)。 .PP 2 番目のクラスは .I FlexLexer.h で定義される .B yyFlexLexer であり、 .B FlexLexer から導出したものです。 以下の追加のメンバ関数を定義します: .TP .B yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 ) 与えられた入出力ストリームを使う .B yyFlexLexer オブジェクトを構築します。 指定しない場合にはそれぞれストリームのデフォルト .B cin と .B cout になります。 .TP .B virtual int yylex() これは .B yylex() が通常の flex スキャナに対して行ったのと同様の役割を担います: ルールのアクションが値を返すまで、 入力ストリームをスキャンし、トークンを消費します。 .B yyFlexLexer からサブクラス .B S を導出し .B yylex() から .B S のメンバ関数および変数をアクセスしたい場合、 .B %option yyclass="S" を指定して .B yyFlexLexer ではなくサブクラスを使用することを .I flex に知らせる必要があります。 この場合 .B yyFlexLexer::yylex() を生成するのではなく、 .I flex は .B S::yylex() (および呼び出されたなら .B yyFlexLexer::LexerError() を呼び出すダミーの .B yyFlexLexer::yylex() も)を生成します。 .TP .B virtual void switch_streams(istream* new_in = 0, .B ostream* new_out = 0) .B yyin を .B new_in (非ニルの場合) に再割当し、 .B yyout を .B new_out (同様)に再割当します。 .B yyin が再割当された場合には以前の入力バッファは消去されます。 .TP .B int yylex( istream* new_in, ostream* new_out = 0 ) まず入力ストリームを .B switch_streams( new_in, new_out ) を使用して切替え、 .B yylex() の値を返します。 .PP さらに、 .B yyFlexLexer は次のプロテクトされた仮想関数を定義します。 スキャナにあわせてこれらを導出クラスにおいて再定義出来ます: .TP .B virtual int LexerInput( char* buf, int max_size ) 最大 .B max_size 文字を .B buf に読み込み、読めた文字数を返します。 入力の終りを示すには 0 文字を返します。"対話的" スキャナ( .B \-B と .B \-I フラグを参照)はマクロ .B YY_INTERACTIVE を定義することに注意して下さい。 .B LexerInput() を再定義し、 対話的な入力元をスキャンする可能性があるかどうかに依存して 異なるアクションが必要となる場合、 この名前が存在するかどうかのテストは .B #ifdef にて可能です。 .TP .B virtual void LexerOutput( const char* buf, int size ) .B size 文字をバッファ .B buf から書き出します。 スキャナのルールが NUL を含むテキストにマッチ可能な場合、 NUL 終端されているこのバッファは "内部に" NUL を含んでいても構いません。 .TP .B virtual void LexerError( const char* msg ) 致命的なエラーメッセージを報告します。 デフォルトのこの関数はメッセージをストリーム .B cerr に書き、終了します。 .PP .B yyFlexLexer オブジェクトは .I 全ての スキャン時の状態を含むことに注意して下さい。 それゆえこの様なオブジェクトをリエントラントなスキャナとして使用できます。 同一の .B yyFlexLexer クラスの複数のインスタンスを具体化可能であり、 複数の C++ スキャナクラスを組み合わせ上記 .B \-P オプションを使用することで同一のプログラムで使用可能です。 .PP 最後に .B %array 機能は C++ スキャナクラスでは使用できないことに注意して下さい; .B %pointer を使用しなければなりません(デフォルト)。 .PP 単純な C++ スキャナの例を以下に示します: .nf // An example of using the flex C++ scanner class. %{ int mylineno = 0; %} string \\"[^\\n"]+\\" ws [ \\t]+ alpha [A-Za-z] dig [0-9] name ({alpha}|{dig}|\\$)({alpha}|{dig}|[_.\\-/$])* num1 [-+]?{dig}+\\.?([eE][-+]?{dig}+)? num2 [-+]?{dig}*\\.{dig}+([eE][-+]?{dig}+)? number {num1}|{num2} %% {ws} /* skip blanks and tabs */ "/*" { int c; while((c = yyinput()) != 0) { if(c == '\\n') ++mylineno; else if(c == '*') { if((c = yyinput()) == '/') break; else unput(c); } } } {number} cout << "number " << YYText() << '\\n'; \\n mylineno++; {name} cout << "name " << YYText() << '\\n'; {string} cout << "string " << YYText() << '\\n'; %% int main( int /* argc */, char** /* argv */ ) { FlexLexer* lexer = new yyFlexLexer; while(lexer->yylex() != 0) ; return 0; } .fi 複数の(異なった)字句解析クラスを生成したい場合、 .B \-P フラグ (もしくは .B prefix= オプション) を使用して各 .B yyFlexLexer を .B xxFlexLexer 等の別の名前にします。 次に字句解析クラスのソースごとに .B をインクルードします。 以下のように .B yyFlexLexer をリネームします: .nf #undef yyFlexLexer #define yyFlexLexer xxFlexLexer #include #undef yyFlexLexer #define yyFlexLexer zzFlexLexer #include .fi これはあるスキャナに対し .B %option prefix="xx" を使用しもう一方に対し .B %option prefix="zz" を使用した場合です。 .PP 重要: 現在のスキャンクラスの形式は .I 実験的 であり、メジャーリリースが変わると大きく変更される可能性があります。 .SH LEX および POSIX との非互換性 .I flex は AT&T Unix の .I lex ツールのリライトですが(2 つの実装はいかなるコードも共有しません)、 いくばくかの拡張と非互換性を持っており、 どちらの実装でも受理可能なスキャナを書きたい方は これを意識しなければなりません。 flex は POSIX .I lex 仕様に完全合致しますが、例外は .B %pointer (デフォルト)使用と .B unput() 呼び出しにより .B yytext の内容を破壊することであり、これは POSIX 仕様に反します。 .PP この節では、 flex と AT&T lex と POSIX 仕様との間の全ての既知の非互換性を扱います。 .PP .I flex の .B \-l オプションはオリジナルの AT&T .I lex 実装との最大の互換性を有効にしますが、 生成されたスキャナの性能は大きく低下します。 .B \-l オプションを使用しても発生しうる非互換性は後で述べます。 .PP .I flex は以下の例外を除き .I lex と完全互換です: .IP - ドキュメントに記載されていない .I lex スキャナ内部の変数 .B yylineno は .B \-l もしくは .B %option yylineno を使用しないとサポートされません。 .IP .B yylineno はスキャナ毎(単一のグローバル変数)ではなく、バッファ毎に管理されるべきです。 .IP .B yylineno は POSIX 仕様ではありません。 .IP - .B input() ルーチンは再定義できませんが、 ルールにマッチしたものに後続する文字を読むために呼ばれえます。 .B input() がファイルの終りに到達すると、通常の .B yywrap() 処理は終了します。``実際の'' ファイルの終りは .I EOF として返されます。 .IP 実際には入力は .B YY_INPUT マクロを定義することにより制御されます。 .IP .B input() を再定義できないという .I flex の制限は、最初に .I yyin を設定する以外のスキャナ入力制御方法を単に規定していないという、 POSIX 仕様と合致します。 .IP - .B unput() ルーチンは再定義できません。この制限は POSIX に合致しています。 .IP - .I flex スキャナは .I lex スキャナとは異なりリエントラントではありません。 実際、対話的なスキャナにおいて、 割り込みハンドラにてロングジャンプを用いてスキャナから脱出し、 その後スキャナを再度呼び出す場合、以下のメッセージを得るでしょう: .nf fatal flex scanner internal error--end of buffer missed .fi スキャナに再度入るためには、まず以下のようにして下さい .nf yyrestart( yyin ); .fi この呼び出しにより入力バッファは捨てられることに注意して下さい; 通常これは対話的スキャナでは問題ではありません。 .IP また、C++ スキャナクラスはリエントラント .I です ので、C++ を使用できるのなら、C++ を使用すべきです。 前述の "C++ スキャナの生成" を参照して下さい。 .IP - .B output() はサポートされていません。 .B ECHO マクロからの出力はファイルポインタ .I yyout (デフォルトでは .I 標準出力 )に対して行われます。 .IP .B output() は POSIX 仕様にはありません。 .IP - .I lex は排他的開始条件 (%x) をサポートしませんが、これは POSIX 仕様にあります。 .IP - 定義を展開する時、 .I flex では括弧で括ります。 lex では以下は: .nf NAME [A-Z][A-Z0-9]* %% foo{NAME}? printf( "Found it\\n" ); %% .fi 文字列 "foo" にはマッチしません。 なぜなら展開されたマクロはルール "foo[A-Z][A-Z0-9]*?" と等価になり、 優先度にて `?' は "[A-Z0-9]*" と結び付きます。 .I flex ではルールが展開されると "foo([A-Z][A-Z0-9]*)?" となり、 文字列 "foo" がマッチします。 .IP .B ^ で始まるか .B $ で終る定義は、展開時に括弧で括らず、 これらのオペレータが定義において特別な意味を失わないようにすることに 注意して下さい。 しかし .B , /, .B <> オペレータは .I flex の定義では使用できません。 .IP .B \-l を使用すると、 .I lex の振舞いと同じく定義を括弧で括りません。 .IP POSIX 仕様では、定義を括弧で括ります。 .IP - .I lex の実装によっては、 ルールのパターンの右側に空白がある場合、 ルールのアクションを別の行から始めることを許します: .nf %% foo|bar { foobar_action(); } .fi .I flex はこの機能をサポートしません。 .IP - .I lex の .B %r (Ratfor スキャナの生成)オプションはサポートされていません。 これは POSIX 仕様には含まれません。 .IP - スキャナを .B %array を使用して構築したのではない限り、 .B unput() 呼び出し後には、次のトークンにマッチするまで .I yytext は未定義です。 これは .I lex にも POSIX 仕様にも当てはまりません。 .B \-l オプションを指定するとこの非互換性を取り除きます。 .IP - .B {} (数値範囲)オペレータの優先度が異なります。 .I lex は "abc{1,3}" を "1 度か 2 度か 3 度の 'abc' にマッチ" と解釈しますが、 .I flex は "'ab' に 1 度か 2 度か 3 度の 'c' が続くものにマッチ" と解釈します。 後者が POSIX 仕様に合致します。 .IP - .B ^ オペレータの優先度が異なります。 .I lex は "^foo|bar" を "行頭の 'foo' か任意位置の 'bar' にマッチ" と解釈しますが、 .I flex は "行頭の 'foo' か 'bar' にマッチ" と解釈します。 後者が POSIX 仕様に合致します。 .IP - .I lex でサポートされている .B %a 等の特別なテーブルサイズの宣言は .I flex スキャナでは不要です; .I flex はこれらを無視します。 .IP - .I flex と .I lex のどちらでもスキャナを使用可能に書けるように、 .bd FLEX_SCANNER という名前を定義します。 スキャナを生成した .I flex のバージョンを表す .B YY_FLEX_MAJOR_VERSION と .B YY_FLEX_MINOR_VERSION を、スキャナは含みます (例えば 2.5 リリースではこれらはそれぞれ 2 と 5 になります)。 .PP 以下の .I flex の機能は .I lex および POSIX 仕様には含まれません: .nf C++ スキャナ %option 開始条件スコープ 開始条件スタック 対話的/非対話的スキャナ yy_scan_string() 等 yyterminate() yy_set_interactive() yy_set_bol() YY_AT_BOL() <> <*> YY_DECL YY_START YY_USER_ACTION YY_USER_INIT #line ディレクティブ アクションの周りの %{} 単一行における複数のアクション .fi さらにほぼ全ての flex フラグです。 リストの最後の機能の意味は、 .I flex では複数のアクションをセミコロンで区切って同一行に記述可能ですが、 .I lex では次の .nf foo handle_foo(); ++num_foos_seen; .fi は (驚くべきことに) 次のように切り詰められるということです。 .nf foo handle_foo(); .fi .I flex はアクションを切り詰めません。 ブレースで括られないアクションは単純に行末で終了します。 .SH 診断 .PP .I warning, rule cannot be matched 常に同じテキストにマッチするルールが前にあるので、 与えられたルールがマッチしません。 例えば以下の "foo" は "全てを捕まえる" ルールの後ろにありますので 決してマッチしません: .nf [a-z]+ got_identifier(); foo got_foo(); .fi スキャナ中で .B REJECT を使用するとこの警告を抑制します。 .PP .I warning, .B \-s .I option given but default rule can be matched (おそらくある特定の開始条件のもとでは) デフォルトルール (任意の一文字にマッチする) しか特定の入力に 対してはマッチしないことがあります。 .B \-s を指定しているので、おそらくそうなりません。 .PP .I reject_used_but_not_detected undefined あるいは .I yymore_used_but_not_detected undefined - これらのエラーは コンパイル時に起きます。スキャナが .B REJECT もしくは .B yymore() を使っていますが .I flex がそのことに気づかなかったということです。 つまり、 .I flex は最初の 2 つの部分を探しても これらのアクションの出現を見つけられなかったのですが、 実際には何らかの方法 (例えば #include ファイルを介して)でこれらが記述されていた、ということです。 .B %option reject か .B %option yymore を使用して、flex にこれらの機能を実際に使用していることを教えて下さい。 .PP .I flex scanner jammed - .B \-s でコンパイルされたスキャナが、どのルールにもマッチしない 入力文字列に遭遇しました。 内部的な問題に起因してこのエラーが起こることもあります。 .PP .I token too large, exceeds YYLMAX - スキャナが .B %array を使っている場合に、あるルールが定数 .B YYLMAX (デフォルトで 8K バイト) より大きな文字列とマッチしました。 .I flex の入力ファイルの定義部で .B YYLMAX を #define することで値を大きくできます。 .PP .I scanner requires \-8 flag to .I use the character 'x' - スキャナの記述に 8 ビットの文字 .I 'x' を識別する部分があり、 .B \-Cf もしくは .B \-CF のテーブル圧縮オプションのためにデフォルトの 7 ビットになっている にもかかわらず、 \-8 オプションをつけていないということです。 詳細は .B \-7 フラグのオプションの議論を参照して下さい。 .PP .I flex scanner push-back overflow - .B unput() でテキストを戻しすぎたため、スキャナのバッファは 戻したテキストと現トークンを .B yytext に保てません。 この場合、理想的にはスキャナが動的にバッファの大きさを変えるべきですが、 現在のところそうなってはいません。 .PP .I input buffer overflow, can't enlarge buffer because scanner uses REJECT - スキャナは非常に大きなトークンのマッチを調べていて、入力バッファを 拡張する必要が起きました。しかしながら、バッファの拡張は .B REJECT を使うスキャナでは働きません。 .PP .I fatal flex scanner internal error--end of buffer missed - スキャナが使用しているフレームから(を越えて)ロングジャンプした後、 再度スキャナに入った場合に起こります。 再度スキャナに入る前に: .nf yyrestart( yyin ); .fi を使うか、前述のように C++ スキャナクラスを使用するようにして下さい。 .PP .I too many start conditions in <> construct! - 存在するより多くの開始条件を <> 中に記載しました (少なくとも一つを二度記載しました)。 .SH 関連ファイル .TP .B \-ll スキャナがリンクしなければならないライブラリ。 .TP .I lex.yy.c 生成されたスキャナ(システムによっては .I lexyy.c という名前になります)。 .TP .I lex.yy.cc .B -+ を使った時に作成された C++ スキャナクラス。 .TP .I C++ スキャナベースクラス .B FlexLexer とその導出クラス .B yyFlexLexer を定義するヘッダファイル。 .TP .I flex.skl スケルトンスキャナ。 このファイルは flex の実行時ではなく、flex を構築する時のみ利用されます。 .TP .I lex.backup .B \-b フラグ用のバックアップ情報(システムによっては .I lex.bck という名前になります)。 .SH 欠陥 / バグ .PP 右文脈(trailing context)パターンの中には、正しくマッチせず 警告メッセージ ("dangerous trailing context") を出すものがあります。 これらのパターンは、 ルールの最初の部分が 2番目の頭の部分とマッチするようなものです。 例えば "zx*/xy*" の場合、'x*' は右文脈の頭の 'x' とマッチします。 (POSIX ドラフトではそのようなパターンにマッチするテキストは 未定義であると述べていることに注意して下さい。) .PP 右文脈の中には、実際には固定長であるのにそうとは解釈されないものがあり、 上に述べた性能の低下が起こります。 特に、 '|' や {n} (例えば "foo{3}") は常に可変長であると解釈されます。 .PP 右文脈と特別なアクション '|' を組み合わせると .I 固定の 右文脈がよりコストのかかる .I 可変の 右文脈となります。例えば、次のようなものです: .nf %% abc | xyz/def .fi .PP .B %array もしくは .B \-l オプションを指定しない場合、 .B unput() を使うと yytext と yyleng を破壊します。 .PP NUL のパターンマッチングは他の文字の比較よりかなり遅くなっています。 .PP 入力バッファの動的な大きさの再調整は時間がかかります。これは現トークン (一般に巨大)までのマッチした全テキストの再スキャンを伴うためです。 .PP 入力のバッファリングと先読みのため、 ルーチンと 混合して使うことが出来ません。例えば、 .B getchar() と .I flex のルールはうまく行きません。代わりに .B input() を使って下さい。 .PP .B \-v オプションで表示される全テーブルエントリには、 どのルールがマッチしたのかを決定するのに必要なテーブルエントリ数が 含まれていません。エントリの数はスキャナが .B REJECT を使っていないときには DFA 状態数に等しく、 使っているときには DFA 状態数よりいくらか大きくなります。 .PP .B REJECT がオプション .B \-f もしくは .B \-F とともに使えません。 .PP .I flex の内部アルゴリズムについてのドキュメントが必要です。 .SH 関連項目 .PP lex(1), yacc(1), sed(1), awk(1). .PP John Levine, Tony Mason, and Doug Brown, .I Lex & Yacc, O'Reilly and Associates. 第 2 版を入手すること。 .PP M. E. Lesk and E. Schmidt, .I LEX \- Lexical Analyzer Generator .PP Alfred Aho, Ravi Sethi and Jeffrey Ullman, .I Compilers: Principles, Techniques and Tools, Addison-Wesley (1986). .I flex で使用しているパターンマッチング技法を解説している(決定性オートマトン)。 .SH 作者 Vern Paxson が多くのアイディアとインスピレーションを得る助けを Van Jacobson から受けました。 オリジナルバージョンは Jef Poskanzer が作成しました。 高速テーブル表現は Van Jacobson のデザインの部分実装です。 この実装は Kevin Gong と Vern Paxson が行いました。 .PP 多くの .I flex ベータテスタ、フィードバッカ、コントリビュータ、特に Francois Pinard, Casey Leedom, Robert Abramovitz, Stan Adermann, Terry Allen, David Barker-Plummer, John Basrai, Neal Becker, Nelson H.F. Beebe, benson@odi.com, Karl Berry, Peter A. Bigot, Simon Blanchard, Keith Bostic, Frederic Brehm, Ian Brockbank, Kin Cho, Nick Christopher, Brian Clapper, J.T. Conklin, Jason Coughlin, Bill Cox, Nick Cropper, Dave Curtis, Scott David Daniels, Chris G. Demetriou, Theo Deraadt, Mike Donahue, Chuck Doucette, Tom Epperly, Leo Eskin, Chris Faylor, Chris Flatters, Jon Forrest, Jeffrey Friedl, Joe Gayda, Kaveh R. Ghazi, Wolfgang Glunz, Eric Goldman, Christopher M. Gould, Ulrich Grepel, Peer Griebel, Jan Hajic, Charles Hemphill, NORO Hideo, Jarkko Hietaniemi, Scott Hofmann, Jeff Honig, Dana Hudes, Eric Hughes, John Interrante, Ceriel Jacobs, Michal Jaegermann, Sakari Jalovaara, Jeffrey R. Jones, Henry Juengst, Klaus Kaempf, Jonathan I. Kamens, Terrence O Kane, Amir Katz, ken@ken.hilco.com, Kevin B. Kenny, Steve Kirsch, Winfried Koenig, Marq Kole, Ronald Lamprecht, Greg Lee, Rohan Lenard, Craig Leres, John Levine, Steve Liddle, David Loffredo, Mike Long, Mohamed el Lozy, Brian Madsen, Malte, Joe Marshall, Bengt Martensson, Chris Metcalf, Luke Mewburn, Jim Meyering, R. Alexander Milowski, Erik Naggum, G.T. Nicol, Landon Noll, James Nordby, Marc Nozell, Richard Ohnemus, Karsten Pahnke, Sven Panne, Roland Pesch, Walter Pelissero, Gaumond Pierre, Esmond Pitt, Jef Poskanzer, Joe Rahmeh, Jarmo Raiha, Frederic Raimbault, Pat Rankin, Rick Richardson, Kevin Rodgers, Kai Uwe Rommel, Jim Roskind, Alberto Santini, Andreas Scherer, Darrell Schiebel, Raf Schietekat, Doug Schmidt, Philippe Schnoebelen, Andreas Schwab, Larry Schwimmer, Alex Siegel, Eckehard Stolz, Jan-Erik Strvmquist, Mike Stump, Paul Stuart, Dave Tallman, Ian Lance Taylor, Chris Thewalt, Richard M. Timoney, Jodi Tsai, Paul Tuinenga, Gary Weik, Frank Whaley, Gerhard Wilhelms, Kent Williams, Ken Yap, Ron Zellar, Nathan Zelle, David Zuhn, および私の最低のメールアーカイブ能力から滑り落ちた方々、 それらの方々の協力にも同様に感謝します。 .PP Keith Bostic, Jon Forrest, Noah Friedman, John Gilmore, Craig Leres, John Levine, Bob Mulcahy, G.T. Nicol, Francois Pinard, Rich Salz, Richard Stallman には多くの悩みの分散に関して感謝します。 .PP Esmond Pitt と Earle Horton には 8 ビット文字サポートに関して; Benson Margulies と Fred Burke には C++ サポートに関して; Kent Williams と Tom Epperly には C++ クラスサポートに関して; Ove Ewerlid には NUL のサポートに関して; Eric Hughes には複数バッファのサポートに関して、それぞれ感謝します。 .PP この作品は当初、私が CA Berkeley の Lawrence Berkeley Laboratory における Real Time Systems Group にいた時に作成されました。 私に協力してくれた方々に感謝します。 .PP コメントは vern@ee.lbl.gov に送って下さい。 diff --git a/ja/man/man1/lpr.1 b/ja/man/man1/lpr.1 index abea91d085..09f3234caa 100644 --- a/ja/man/man1/lpr.1 +++ b/ja/man/man1/lpr.1 @@ -1,242 +1,242 @@ .\" Copyright (c) 1980, 1990, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)lpr.1 8.1 (Berkeley) 6/6/93 .\" %Id: lpr.1,v 1.8 1997/09/24 06:48:07 charnier Exp % .\" jpman %Id: lpr.1,v 1.3 1997/08/11 14:28:54 horikawa Stab % .\" .Dd June 6, 1993 .Dt LPR 1 .Os BSD 4 .Sh 名称 .Nm lpr .Nd 印刷ジョブを生成し、キューに登録する .Sh 書式 .Nm lpr .Op Fl P Ns Ar printer .Op Fl \&# Ns Ar num .Op Fl C Ar class .Op Fl J Ar job .Op Fl T Ar title .Op Fl U Ar user .Op Fl i Ar numcols .Op Fl 1234 Ar font .Op Fl w Ns Ar num .Op Fl cdfghlnmprstv .Op Ar name ... .Sh 解説 .Nm lpr は、プリンタが利用可能になったときにファイルをプリント アウトするためにスプーリングデーモンを利用します。 もしファイル名が指定されないようなら、標準入力から読みます。 .Pp 以下の単一文字のオプションは、ファイルが通常のテキストファイルでないこ とをラインプリンタのスプールデーモンに教えるためのものです。スプールデー モンはそのデータを適切に出力するために、データにふさわしいフィルタを使 うようになります。 .Bl -tag -width indent .It Fl c ファイルが .Xr cifplot 1 で作成されたデータを含んでいるものとみなします。 .It Fl d ファイルが .Tn TeX の .Tn DVI フォーマットであるとみなします。 .It Fl f 各行の最初の文字を、標準的な FORTRAN のキャリッジコントロール キャラクタとして処理するフィルタを使うようになります。 .It Fl g ファイルが .Xr plot ルーチンで作成された 標準的な plot データであるとみなします。 .It Fl l コントロールキャラクタを通し、ページの区切りを抑制するフィルタを利用します。 .It Fl n ファイルが .Em ditroff (デバイスに依存しないtroff) からのデータであるとみなします。 .It Fl p ファイルの整形に .Xr pr 1 を利用します。 .It Fl t ファイルが(写植印字コマンドである) .Xr troff 1 からのデータであるとみなします。 .It Fl v ファイルが Benson Varian のようなデバイスのためのラスターイメージを 含むものとみなします。 .El .Pp 以下のオプションは、プリントジョブを操作するときに適用します: .Bl -tag -width indent .It Fl P 指定したプリンタに出力します。これを指定しない通常の場合は、 デフォルトプリンタが使われる (これはサイトごとに依存します)か、 環境変数 .Ev PRINTER の値が使われます。 .It Fl h バーストページを出力しないようにします。 .It Fl m 終了時にメールを送ってきます。 .It Fl r -スプーリングの終了時、もしくは、出力の終了時にファイルを削除します ( +スプーリングの終了時にファイルを削除します。 .Fl s -オプション使用時)。 +オプション使用時には出力の終了時に削除します。 .It Fl s シンボリックリンクを利用します。通常、ファイルはスプールディ レクトリにコピーされますが、大きなファイルをコピーするよりは .Fl s オプションで .Xr symlink 2 を使ってデータファイルにリンクを張ったほうがよ いでしょう。つまり、これはファイルのプリントアウトが完了するまではファ イルに変更を加えたり、削除したりするべきではないということを意味します。 .El .Pp 残りのオプションはコピーを行ったり、ページの表示やヘッダの表示を行います: .Bl -tag -width indent .It Fl \&# Ns Ar num .Ar num は、各ファイルのコピーの枚数です。例えば、 .Bd -literal -offset indent lpr \-#3 foo.c bar.c more.c .Ed は、foo.cのコピーを3回行った後、bar.cのコピーを3回行います。一方、 .Bd -literal -offset indent cat foo.c bar.c more.c \&| lpr \-#3 .Ed .Pp は、連結されたファイルのコピーを3回行います。 をこの機能を禁止してコピー機の使用を推奨しているサイトがあるかもしれません。 .It Xo .Fl Ns Oo Cm 1234 Oc Ar font .Xc フォントポジション .Ar i のフォントを指定します。デーモンはフォントのパス名を参照する .Li .railmag ファイルを作成します。 .It Fl C Ar class バーストページで使うジョブ見出しです。例えば、 .Bd -literal -offset indent lpr \-C EECS foo.c .Ed .Pp は、バーストページのシステム名( .Xr hostname 1 で返される)を EECS に置き換えて、foo.c をプリントします。 .It Fl J Ar job バーストページに書くジョブ名です。通常は、 一番最初のファイルの名前が使われます。 .It Fl T Ar title .Xr pr 1 のタイトル名に、ファイル名のかわりにこのタイトルを使います。 .It Fl U Ar user バーストページで使うユーザー名であり、課金目的でも利用されます。 このオプションは実ユーザidがデーモン(あるいはデーモンの代わりに printcap中で指定されているユーザ)のみ使用できます。 .It Fl i numcols 出力が .Pq Ar numcols でインデントされます。 .It Fl w Ns Ar num .Xr pr 1 のページ幅を .Ar num にします。 .El .Sh 環境変数 以下の環境変数が存在すると、 .Nm lpr が使用します: .Bl -tag -width PRINTER .It Ev PRINTER かわりのデフォルトプリンタを指定する .El .Sh 関連ファイル .Bl -tag -width /var/spool/output/*/tf* -compact .It Pa /etc/passwd 個人の識別を行うためのファイル .It Pa /etc/printcap プリンタの特徴を記述したデータベース .It Pa /usr/sbin/lpd ラインプリンタデーモン .It Pa /var/spool/output/* スプーリングのために利用するディレクトリ .It Pa /var/spool/output/*/cf* デーモンの制御のためのファイル .It Pa /var/spool/output/*/df* ``cf'' ファイルが指定するデータファイル .It Pa /var/spool/output/*/tf* ``cf'' ファイルの一時的なコピー .El .Sh 関連項目 .Xr lpq 1 , .Xr lprm 1 , .Xr pr 1 , .Xr symlink 2 , .Xr printcap 5 , .Xr lpc 8 , .Xr lpd 8 .Sh 歴史 .Nm コマンドは .Bx 3 から登場しました。 .Sh 診断 もしとても大きいファイルをスプールしようとするなら、途中で切れてしまう でしょう。 .Nm はバイナリファイルを印刷することを目的としています. もしルート以外のあるユーザーがファイルを印刷しようとしてスプールに 失敗したら、 .Nm はその旨のメッセージを印刷してそのファイルは印刷されません。 もしローカルマシンの .Xr lpd 8 との接続ができなければ、 .Nm はデーモンを起動できなかったと言うでしょう。その結果は .Xr lpd 8 によってファイルのスプールに失敗したとデーモンのログファイルに 残されるでしょう。 .Sh バグ .Xr troff 1 と .Xr tex のフォントは,プリンタがつながっているホストにないといけません。 これは,現在はローカルのフォントライブラリを使うことができないことを 意味します。 diff --git a/ja/man/man8/adding_user.8 b/ja/man/man8/adding_user.8 index 79c684d361..5bbcbb2298 100644 --- a/ja/man/man8/adding_user.8 +++ b/ja/man/man8/adding_user.8 @@ -1,125 +1,126 @@ .\" Copyright (c) 1980, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)adduser.8 8.1 (Berkeley) 6/5/93 .\" %Id: adding_user.8,v 1.2 1997/03/07 03:28:19 jmg Exp % .\" jpman %Id: adding_user.8,v 1.3 1997/07/22 16:44:29 horikawa Stab % .\" .Dd June 5, 1993 .Dt ADDING_USER 8 .Os BSD 4 .Sh 名称 .Nm adding_user .Nd 新規ユーザ登録のためのプロシージャ .Sh 解説 新規ユーザはログイン名を選ばなければなりません。 ここで、ログイン名は既に .Pa /etc/passwd や .Pa /etc/aliases に登録されているものであってはいけません。 また、ハイフン .Ql Fl 文字で始まるものも使えません。 メーラを混乱させないためにも、全ての文字は英小文字でドット .Ql \&. 文字を含まないことが、強く推奨されています。 アカウントは、パスワードファイルを一行編集することで加えることが できます。これを行う時は、パスワードファイルはロックされていなければ なりません。このロックは、 .Xr chpass 1 や .Xr vipw 8 を使うことで可能です。 .Pp 新規ユーザには、グループとユーザ id を与えます。 ログイン名とユーザ id は、システム全体やしばしばシステムグループで 一意でなければなりません。これは、ファイルのアクセスを制御するために 使われるからです。 典型的には、似たようなプロジェクトで働いているユーザは同じグループに -入ります。カルフォルニア大学バークレイ分校では、システムスタッフ・ +入ります。 +University of California の Berkley 校では、システムスタッフ・ 学部・大学院・大きなプロジェクトのための特別なプロジェクトのグループが あります。 .Pp 新規ユーザ \*(lqernie\*(rq のための骨格となるアカウントは、以下のようになります。 .Bd -literal ernie::25:30::0:0:Ernie Kovacs,508 Evans Hall,x7925, 642-8202:/a/users/ernie:/bin/csh .Ed .Pp 個々のフィールドの解説は、 .Xr passwd 5 を参照してください。 .Pp 新規ユーザに始めるにあたっていくつかの助けを与えることは良いことです。 このために、いくつかの骨格となるファイルを与えてあげれます。 .Pa /bin/sh ユーザには、 .Pa \&.profile を、 .Pa /bin/csh ユーザには、 .Pa \&.cshrc や .Pa \&.login を与えれば良いでしょう。 .Pa /usr/share/skel ディレクトリに、そのようなファイルの骨格の定義を置いておけます。 新規ユーザは、これらのファイルの複製を与えられます。 ここで、例えば .Xr tset 1 をログインする度に自動的に実行するように設定できます。 .Sh 関連ファイル .Bl -tag -width /etc/master.passwdxx -compact .It Pa /etc/master.passwd ユーザデータベース .It Pa /usr/share/skel ログインディレクトリのための骨格データ .El .Sh 関連項目 .Xr chpass 1 , .Xr finger 1 , .Xr passwd 1 , .Xr aliases 5 , .Xr passwd 5 , .Xr adduser 8 , .Xr pwd_mkdb 8 , .Xr vipw 8 .Sh バグ ユーザ情報は (段々とそうなってきていますが)、別のところに 記憶するべきです。 .Sh 歴史 .Nm プロシージャは .Bx 3.0 から導入されました. diff --git a/ja/man/man8/makekey.8 b/ja/man/man8/makekey.8 index 4f87fc1da4..9dec316883 100644 --- a/ja/man/man8/makekey.8 +++ b/ja/man/man8/makekey.8 @@ -1,60 +1,60 @@ .\" Copyright (c) 1990, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)makekey.8 8.2 (Berkeley) 12/11/93 .\" %Id: makekey.8,v 1.8 1997/11/24 07:29:12 charnier Exp % .\" jpman %Id: makekey.8,v 1.2 1997/05/21 07:56:47 yugawa Stab % .\" .Dd December 11, 1993 .Dt MAKEKEY 8 .Os .Sh 名称 .Nm makekey .Nd 暗号キーやパスワードを作成する .Sh 書式 .Nm makekey .Sh 解説 .Nm makekey は標準入力から読み込んだキーと隠しキー (salt) を暗号化し、 結果を標準出力へ書き込みます。 -キーは 8 バイト、隠しキーは 2 バイトであること期待されます。 +キーは 8 バイト、隠しキーは 2 バイトであることが期待されます。 キーと隠しキーはどんな文字を含んでよいか、 どうやって暗号化計算が行なわれるか、の詳しい情報は .Xr crypt 3 を参照のこと。 .Sh 関連項目 .Xr login 1 , .Xr crypt 3 .Sh 歴史 .Nm コマンドは .At v7 から登場しました。 diff --git a/ja/man/man8/ppp.8 b/ja/man/man8/ppp.8 index dd29957147..cdca52191c 100644 --- a/ja/man/man8/ppp.8 +++ b/ja/man/man8/ppp.8 @@ -1,3742 +1,3742 @@ .\" %Id: ppp.8,v 1.126 1998/09/18 23:28:10 brian Exp % .\" jpman %Id: ppp.8,v 1.4 1997/06/08 18:41:58 saeki Stab % .\" WORD: expect string 受信待ち文字列 (chat.8) .\" WORD: negotiation 交渉 .Dd 20 September 1995 .Os FreeBSD .Dt PPP 8 .Sh 名称 .Nm ppp .Nd PPP (Point to Point Protocol) (別名 user-ppp) .Sh 書式 .Nm .Oo .Fl auto | .Fl background | .Fl ddial | .Fl direct | .Fl dedicated .Oc .Op Fl alias .Op Ar system .Sh 解説 本プログラムは、ユーザプロセスとして動作する .Em PPP パッケージです。 .Em PPP は通常、( .Xr pppd 8 でそうなっているように) カーネルの一部として実装されますが、 そのため、デバッグや動作の変更が少々難しい場合があります。 それに対し、この実装ではトンネルデバイスドライバ (tun) を利用して、 ユーザプロセスで .Em PPP を実現しています。 .Sh 主な特徴 .Bl -diag .It 対話的なユーザインタフェースを提供 コマンドモードで利用する場合、ユーザがコマンドを 入力することで、簡単にリモートコンピュータとの接続の確立、 接続状態の確認、 接続の切断を行うことができます。 オプションとして、セキュリティ確保のために すべての機能をパスワードで保護することができます。 .It 手動と自動でのダイヤルをサポート 対話モードでは、直接モデムと通信できるように .Dq term コマンドが用意されています。 モデムがリモートホストと接続されて、 .Em PPP での通信が始まったら、 .Nm はそれを検出して自動的にパケットモードに移行します。 ひとたびリモートホストとの接続に必要なコマンドシーケンスがわかったら、 後々の接続を簡単にするため、必要なダイヤル手順やログイン手順を定義した チャットスクリプトを書くことができます。 .It オンデマンドでのダイヤルアップをサポート .Fl auto モード (自動モード) では .Nm はデーモンとして動作し、 .Em PPP リンクを通して送られるパケットを待ちうけます。 パケットを検出すると、デーモンが自動的にダイヤルを行って接続を確立します。 .Fl ddial モード (直接ダイヤルモード) でも ほぼ同様に、自動ダイヤルと接続の確立を行います。 しかしながらこのモードは、送るべきパケットが存在しない場合にも、 リンクが切れていることを検出するといつでもリモートへダイヤルするという点が auto モードと異なります。 このモードは、電話料金よりも常時接続されていることが重視される場合に有用です。 3 番目の .Fl dedicated モード (専用線モード) も利用可能です。 このモードは 2 つのマシン間の専用線を対象にしています。 専用線モードでは .Nm は自発的に動作を終了することはありません - 終了するには .Dq quit all コマンドを診断ソケットを介して送る必要があります。 .Dv SIGHUP は LCP の再交渉を強要し、 .Dv SIGTERM は終了を強要します。 .It クライアントコールバックをサポート .Nm は標準 LCP コールバックプロトコルならびに Microsoft コールバック制御プロトコル (ftp://ftp.microsoft.com/developr/rfc/cbcp.txt) を使用できます。 .It パケットエイリアシングをサポート パケットエイリアシング (別名: IP マスカレード) により、 未登録でプライベートなネットワーク上のコンピュータからも インターネットにアクセスすることが可能です。 .Em PPP ホストはマスカレードゲートウェイとして動作します。 送信パケットの IP アドレスと TCP や UDP のポート番号は どちらもエイリアスされ、返信パケットではエイリアスが元に戻されます。 .It バックグラウンド PPP 接続をサポート バックグラウンドモードでは、接続を確立するのに成功した場合に .Nm はデーモンになります。 それ以外の場合はエラーで終了します。 これにより、 接続が成功裏に確立した場合のみコマンドを実行するようなスクリプト をセットアップすることが出来ます。 .It サーバとしての PPP 接続をサポート ダイレクトモードでは、 .Nm は標準入力/標準出力からの .Em PPP 接続を受け入れるサーバとして動作させることができます。 .It PAP と CHAP による認証をサポート PAP もしくは CHAP を用いることにより、Unix スタイルの .Xr login 1 手続きをスキップし、 .Em PPP プロトコルを代りに認証に使用することが可能です。 相手が Microsoft CHAP 認証を要求し、かつ .Nm が DES をサポートするようにコンパイルされている場合、適当な MD4/DES 応答がなされます。 .It 代理 arp (Proxy Arp) をサポート .Em PPP がサーバとして動作している時、その接続について代理 arp を行うよう 設定できます。 .It パケットのフィルタリングをサポート ユーザは 4 種類のフィルタを定義できます。 .Em in は受信パケットに対するフィルタです。 .Em out は送信パケットに対するフィルタです。 .Em dial はダイヤルを行うきっかけとなるパケットを定義するフィルタで、 .Em alive は接続を保持するためのパケットを定義するフィルタです。 .It トンネルドライバは bpf (Berkeley Packet Filter) をサポート .Em PPP リンクを流れるパケットを調べるために、 .Xr tcpdump 1 を使うことができます。 .It PPP オーバ TCP をサポート デバイス名が .Em host Ns No : Ns Em port 形式で指定された場合、 .Nm は通常のシリアルデバイスを使うのではなく、データ転送のための TCP 接続を開きます。 .It IETF ドラフトの Predictor-1 と DEFLATE 圧縮をサポート .Nm は VJ 圧縮の他に Predictor-1 と DEFLATE 圧縮もサポートしています。 モデムは通常 (例えば v42.bis のような) 組み込みの圧縮機能を持っており、 その結果システムは .\"(訳注)「転送データレートよりも」をここにいれたいと考えています。 .\" 2.2.1R 対象(1997/04/02) Takeshi MUTOH より高いデータレートで通信できます。 これは一般には良いことですが、より高速のデータによってシリアル回線からの 割り込みが増加します。 システムはこの割り込みをモデムと通信して処理しなくてはならないため、 システムの負荷と遅延時間が増加することになります。 VJ 圧縮とは異なり、Predictor-1 と DEFLATE 圧縮はリンクを通る .Em すべての ネットワークトラフィックをあらかじめ圧縮しておくことで、オーバヘッドを 最小にします。 .It Microsoft の IPCP 拡張をサポート Microsoft の .Em PPP スタックを使用するクライアント (つまり Win95, WinNT) との間で ネームサーバのアドレスと NetBIOS ネームサーバのアドレスを 交渉することができます。 .It マルチリンク PPP をサポート 接続先への複数の物理的な回線をオープンし、すべてのリンクの 帯域幅を合わせてより高いスループットを得ることができます。 .El .Sh パーミッション .Nm はユーザ .Dv root 、グループ .Dv network 、パーミッション .Dv 4554 でインストールされます。 デフォルトでは .Nm は、起動したユーザ ID が 0 でない場合には実行しません。 これは .Dq allow users コマンドを .Pa /etc/ppp/ppp.conf に記載することにより変更することが可能です。 通常ユーザとして実行する場合には、 .Nm はユーザ ID 0 に変わり、システムの経路表の変更と、 システムロックファイルの作成と、 ppp の設定ファイルの読み込みを行います。 すべての外部コマンド ("shell" や "!bg" で実行されます) は、 .Nm を起動したユーザ ID で実行されます。 ユーザ ID 0 にて正確になにが行われているのかに興味がある場合には、 ログ機能の .Sq ID0 を参照してください。 .Sh 始める前に 最初に .Nm を実行する時には、いくつかの初期設定を整える必要があります。 .Bl -bullet .It カーネルにトンネルデバイスが含まれていなければ なりません (GENERIC カーネルではデフォルトで 1 つ含まれます)。 もし含まれていない場合や複数の tun インタフェースが必要な場合、 次の行をカーネル設定ファイルに追加して、 カーネルを再構築する必要があります: .Pp .Dl pseudo-device tun N .Pp ここで .Ar N は .Em PPP 接続を行いたい最大の数です。 .It .Pa /dev ディレクトリにトンネルデバイスのエントリ .Pa /dev/tunN があるかどうかを調べてください。 ここで .Sq N は、0 から始まる tun デバイスの番号です。 もし無いようならば、"sh ./MAKEDEV tunN" を実行すれば作ることができます。 これにより 0 から .Ar N までの tun デバイスが作成されます。 .It あなたのシステムの .Pa /etc/group ファイルに .Dq network グループがあり、そのグループが .Nm を使うと想定されるすべてのユーザ名を含んでいることを確かめてください。 詳細は .Xr group 5 マニュアルページを参照してください。また、これらのユーザは .Pa /etc/ppp/ppp.conf ファイルで .Dq allow users コマンドを使用してアクセス権が与えられなければなりません。 .It ログファイルを作成します。 .Nm は .Xr syslog 3 を使用して情報をログします。通常のログファイル名は .Pa /var/log/ppp.log です。 このファイルに出力を行うためには、次の行を .Pa /etc/syslog.conf ファイルに記述してください: .Bd -literal -offset indent !ppp *.*/var/log/ppp.log .Ed .Pp TAB と書かれている場所には、実際にはタブを入力します。 空白文字を使うと、 .Xr syslogd 8 はこの行を無視し、そのことも報告しません。 .Pp .Nm の実行形式にリンクを作成することにより、複数の .Em PPP ログファイルを持つことが可能です: .Pp .Dl # cd /usr/sbin .Dl # ln ppp ppp0 .Pp として .Pa /etc/syslog.conf で .Bd -literal -offset indent !ppp0 *.*/var/log/ppp0.log .Ed .Pp とします。 .Pa /etc/syslog.conf を更新した後に、 .Xr syslogd 8 に .Dv HUP シグナルを送ることをお忘れなく。 .It 厳密には .Nm の操作とは関係ありませんが、リゾルバが正しく働くように設定した方が 良いでしょう。 これは .Pq Xr named 8 を用いて ローカルな DNS サーバを設定するか、もしくは .Pa /etc/resolv.conf ファイルに適切な .Sq name-server 行を加えることで行われます。 詳細は .Xr resolv.conf 5 のマニュアルを参照してください。 .Pp 他の方法として、もし接続先がサポートしている場合には .Nm が接続先にネームサーバのアドレスを尋ねて、自動的に .Pa /etc/resolv.conf を更新することができます。詳細は後述の .Dq enable dns コマンドを参照してください。 .El .Sh 手動ダイヤル 次の例では、あなたのマシン名が .Dv awfulhak であるとして説明します。 .Nm を引数無しで起動すると (前述の .Em パーミッション 参照) 次のプロンプトが表示されます: .Bd -literal -offset indent ppp ON awfulhak> .Ed .Pp プロンプトの .Sq ON の部分は常に大文字であるべきです。ここが小文字の場合、 .Dq passwd コマンドを使用してパスワードを入力しなければならないことを意味します。 実行中の .Nm に接続し、 まだ正しいパスワードを入力していない場合にのみこのような状態になります。 .Pp ここで、モデムのデバイス名、スピードやパリティの設定、 CTS/RTS 信号を使うかどうか (デフォルトでは CTS/RTS が使用されます) を 指定して、開始可能です。もしハードウェアが CTS/RTS 信号を持っていない場合 (これは PPP 可能な端末サーバに直接つなぐ場合に起こり得ます)、 .Nm はそのポートを通してどんな出力も送らず、来るはずのない信号を待ち続けます。 したがって、直接接続で通信ができないような場合には、 CTS/RTS を off にしてみてください: .Bd -literal -offset indent ppp ON awfulhak> set line /dev/cuaa0 ppp ON awfulhak> set speed 38400 ppp ON awfulhak> set parity even ppp ON awfulhak> set ctsrts on ppp ON awfulhak> show modem * モデム関連のパラメータが、ここに示されます * ppp ON awfulhak> .Ed .Pp ここでは、直接モデムと通信するために term コマンドを使用可能です: .Bd -literal -offset indent ppp ON awfulhak> term at OK atdt123456 CONNECT login: ppp Password: Protocol: ppp .Ed .Pp 相手が .Em PPP で話しはじめると、 .Nm はそれを自動的に検出してコマンドモードに戻ります。 .Bd -literal -offset indent ppp ON awfulhak> Ppp ON awfulhak> PPp ON awfulhak> PPP ON awfulhak> .Ed .\" your end で「あなた側」 このようにならない場合、接続先がこちらの開始交渉を 待っている可能性があります。強制的に .Nm に接続先への PPP 設定パケットの送出を開始させるためには .Dq ~p コマンドを使ってパケットモードに移行して下さい。 .Pp これで接続されました! プロンプトの .Sq PPP が大文字に変化して、接続されたことを知らせます。もし 3 つの P の内 いくつかだけが大文字になっている場合には、すべての文字が大文字もしくは 小文字になるまで待ってください。もし小文字に戻った場合には、それは .Nm が接続先との交渉に成功しなかったことをを意味します。 たいてい、その原因は PAP もしくは CHAP 認証の name や key が 正しくないことです。 .Dq set log local phase することが、この時点でのトラブルシューティングへの第一歩としては 良いでしょう。 詳細は、下記の .Dq set log コマンドの説明を参照してください。 .Pp リンクが確立したら、show コマンドを使用することで、 どのように事態が進行しているのかが分ります: .Bd -literal -offset indent PPP ON awfulhak> show modem * モデム関連の情報がここに表示されます * PPP ON awfulhak> show ccp * CCP (圧縮) 関連の情報がここに表示されます * PPP ON awfulhak> show lcp * LCP (回線制御) 関連の情報がここに表示されます * PPP ON awfulhak> show ipcp * IPCP (IP) 関連の情報がここに表示されます * PPP ON awfulhak> show link * (高レベル) リンク関係の情報がここに表示されます * PPP ON awfulhak> show bundle * (高レベル) 論理接続関係の情報がここに表示されます * .Ed .Pp この時点で、マシンは接続先に対するホスト単位の経路 (host route) を持っています。 これはリンクの相手のホストとのみ接続可能であるという意味です。 デフォルト経路のエントリ (他の経路エントリを持たずに、全パケットを .Em PPP リンクの相手に送る ように、あなたのマシンに指示します)を追加したければ、 次のコマンドを入力してください。 .Bd -literal -offset indent PPP ON awfulhak> add default HISADDR .Ed .Pp .Sq HISADDR という文字列は、相手側の IP アドレスを表します。 .Sq HISADDR の位置に .Sq INTERFACE キーワードを使用可能です。 これにより tun インタフェース上に直接経路を作成します。 既存の経路のために失敗する場合には、 .Bd -literal -offset indent PPP ON awfulhak> add! default HISADDR .Ed .Pp を用いることで既存の経路を上書きできます。 ここで、(ping, telnet, ftp のような) ネットワークアプリケーションを 別のウィンドウで使用可能です。 使用可能コマンドの詳細は .Em PPP コマンドリスト の節を参照してください。 .Sh 自動ダイヤル 自動ダイヤルを行うためには、ダイヤルとログインのチャットスクリプトを 用意しなければなりません。定義の例は .Pa /etc/ppp/ppp.conf.sample を見てください ( .Pa /etc/ppp/ppp.conf の書式は非常に簡単です)。 各行は単一のコメント、インクルード、ラベル、コマンドのいずれかを含みます。 .Bl -bullet .It .Pq Dq # 文字で始まる行は、コメントとして扱われます。 コメント行と認識した場合、先行する空白は無視されます。 .It インクルードは語 .Sq !include から始まる行です。 1 つの引数 - インクルードするファイル - を持つ必要があります。 古いバージョンの .Nm との互換性のために、 .Dq !include ~/.ppp.conf を使用したいかもしれません。 .It ラベルは行頭から始まり、最後にコロン .Pq Dq \&: が続かなければなりません。 .It コマンド行は、最初の桁に空白かタブを含む必要があります。 .El .Pp .Pa /etc/ppp/ppp.conf ファイルには少なくとも .Dq default セクションが存在する必要があります。 このセクションは常に実行されます。 このファイルには 1 つ以上のセクションが含まれます。 セクション名は用途に応じて付けます。例えば、 .Dq MyISP はあなたの ISP を表したり、 .Dq ppp-in は入力の .Nm 構成を表したります。 .Nm ppp を立ち上げる際に、接続先のラベル名を指定可能です。 .Dq default ラベルに関係づけられたコマンドが実行されてから、 接続先ラベルに関連づけられたコマンドが実行されます。 .Nm を引数無しで起動した場合、 .Dq default だけは実行されます。load コマンドを使用して、 .Pa /etc/ppp/ppp.conf のセクションを手動でロード可能です: .Bd -literal -offset indent PPP ON awfulhak> load MyISP .Ed .Pp ひとたび接続が確立したなら、プロンプトの .Sq ppp は .Sq PPP に変わります: .Bd -literal -offset indent # ppp MyISP ... ppp ON awfulhak> dial Ppp ON awfulhak> PPp ON awfulhak> PPP ON awfulhak> .Ed .Pp Ppp プロンプトは .Nm が認証フェースに入ったことを示します。PPp プロンプトは .Nm がネットワークフェーズに入ったことを示します。PPP プロンプトは .Nm がネットワーク層プロトコルの交渉に成功し、使用可能状態にあることを示します。 .Pp もし .Pa /etc/ppp/ppp.linkup が利用可能ならば、 .Em PPP 接続が確立された時に、その内容が実行されます。 接続が確立された後のバックグラウンドでのスクリプト実行については、 提供されている .Pa /etc/ppp/ppp.conf.sample の .Dq pmdemand の例を参照してください。 .Dv HISADDR , .Dv MYADDR , .Dv INTERFACE というリテラル文字列を使用することができ、それらは関連する IP アドレスと インタフェース名に置換されます。 同様に、接続が閉じられると、 .Pa /etc/ppp/ppp.linkdown ファイルの内容が実行されます。 これらのファイルのフォーマットは .Pa /etc/ppp/ppp.conf と同じです。 .Pp 以前のバージョンの .Nm では、デフォルト経路のような経路は .Pa ppp.linkup ファイルで追加し直す必要がありました。 現在では .Nm は、 .Dv HISADDR もしくは .Dv MYADDR が変化したときに、自動的に .Dv HISADDR もしくは .Dv MYADDR 文字列を含むすべての経路を更新する .Sq スティッキー経路 をサポートします。 .Sh バックグラウンドダイヤル .Nm を使って非対話的に接続を確立したい場合 (例えば .Xr crontab 5 エントリや .Xr at 1 ジョブから使うような場合) には、 .Fl background オプションを使います。 .Fl background が指定された場合、 .Nm はすぐに接続を確立しようとします。 複数の電話番号が指定された場合には、各電話番号が 1 回づつ試されます。 これらに失敗すると、 .Nm は即座に終了し、0 でない終了コードを返します。 接続に成功すると .Nm はデーモンになり、呼び出し側に終了コード 0 を返します。 デーモンは、リモートシステムが接続を終了した場合、 もしくは .Dv TERM シグナルを受け取った場合に、自動的に終了します。 .Sh ダイヤルオンデマンド デマンドダイヤル機能は .Fl auto または .Fl ddial オプションにて有効にされます。この場合にも .Pa /etc/ppp/ppp.conf で定義された接続先のラベルを指定しなければなりません。 これには、リモート接続先の IP アドレスを指定するための .Dq set ifaddr コマンドも書かれていなければなりません ( .Pa /etc/ppp/ppp.conf.sample を参照してください)。 .Bd -literal -offset indent # ppp -auto pmdemand .Ed .Pp .Fl auto または .Fl ddial が指定された時に .Nm はデーモンとして動作しますが、 .Pa /etc/ppp/ppp.conf 中で .Dq set server コマンドを使うことで、設定を確認したり変更したりすることができます。 .Po たとえば、 .Dq set server +3000 mypasswd とすると .Pc 次のように診断ポートを通じて接続することができます。 .Bd -literal -offset indent # pppctl 3000 (tun0 を仮定 - ``set server'' の記述を参照) Password: PPP ON awfulhak> show who tcp (127.0.0.1:1028) * .Ed .Pp .Dq show who コマンドは現在 .Nm 自身に接続しているユーザの一覧を表示します。診断ソケットが閉じられる、 もしくは異なるソケットに変更された場合、すべての接続は即座に終了します。 .Pp .Fl auto モードにて 送信パケットが検出された時、 .Nm は (チャットスクリプトに基づいて) ダイヤルを行い、 通信相手に接続しようとします。 .Fl ddial モードでは回線がダウンしていることが確認された場合にはいつでも ダイヤルが行われます。 接続に失敗したら、デフォルトの動作では 30 秒間待ってから、 別の送信パケットが検出された時に接続しようとします。 この動作は次の方法で変更できます。 .Bd -literal -offset indent set redial seconds|random[.nseconds|random] [dial_attempts] .Ed .Pp .Sq seconds は、再び接続しようとするまでの秒数です。 引数が .Sq random の場合には、待ち時間を 0 秒から 30 秒の間でランダムに選びます。 .Sq nseconds は電話番号リストの中の次の番号をダイヤルする前に待つ秒数です。( .Dq set phone コマンドを参照してください)。これのデフォルトは 3 秒です。 繰り返しますが、引数が .Sq random の場合には、待ち時間を 0 秒から 30 秒の間でランダムに選びます。 .Sq dial_attempts は、受け取った個々の送信パケットに対して、何回接続を試みるのかを示す 数字です。 このパラメータが省略された場合には、以前の値がそのまま使われます。 .Sq dial_attempts に 0 が指定された場合には、 .Nm は接続できるまでダイヤルを続けます。 .Bd -literal -offset indent set redial 10.3 4 .Ed .Pp は個々の送信パケットに対して 4 回接続を試み、 番号間の待ち時間が 3 秒で、すべての番号を試した後に 10 秒待つことを表します。 複数の電話番号が指定されている場合でも、トータルのダイヤル回数は 4 回のままです。 (それぞれの番号を 4 回ダイヤルするのではありません)。 リンクの両端が .Nm のデマンドダイヤルモードを利用している場合は、 ダイヤル間隔を変更しておくのが良いでしょう。 もし、リンクの両端が同じタイムアウト時間に設定されていて、 リンクが切れて両方に送信待ちのパケットがあった場合、 両方が同時に相手を呼び出しあうことになってしまいます。 場所によっては、シリアルリンクに信頼性がなく、 切れるべきでない時にキャリアが失われるかもしれません。 セッションの途中で予期せずキャリアが失われた場合、 .Nm にリダイヤルさせることができます。 .Bd -literal -offset indent set reconnect timeout ntries .Ed .Pp このコマンドは、キャリアが失われた時に .Ar timeout 秒の間隔を置いて .Ar ntries 回まで接続を再確立するよう .Nm に指示します。例えば、 .Bd -literal -offset indent set reconnect 3 5 .Ed .Pp は、予期せぬキャリア喪失の際に .Ar 3 秒待ってから再接続を試みるように .Nm に指示します。これは .Nm があきらめる前に .Ar 5 回まで行われます。 ntries のデフォルト値は 0 (再接続しない) です。 このオプションを使用する際には注意が必要です。 もしローカル側のタイムアウトがリモート側よりもわずかに長いと、 リモート側がタイムアウトにより回線を切断した場合に、 再接続機能が (指定した回数まで) 起動されてしまいます。 注: この文脈においては、多くの LQR を喪失するとキャリア喪失を引き起こし、 ひいては再接続を引き起こします。 .Fl background フラグが指定された場合、接続が行えるまで すべての電話番号が最大 1 回ダイヤルされます。 .Dq set redial コマンドにて、リダイヤル期間の後に、 再接続回数を指定します。 リダイヤル値が指定した電話番号数より少ない場合、 指定した電話番号で使用されないものが出来ます。 プログラムを終了させるには、次のように入力してください。 .Bd -literal -offset indent PPP ON awfulhak> close ppp ON awfulhak> quit all .Ed .Pp .Dq quit コマンドは .Xr pppctl 8 もしくは .Xr telnet 1 による接続を終了しますが、 プログラム自身は終了させません。 .Nm も終了させたい場合には、 .Dq quit all を実行してください。 .Sh PPP 接続の受け入れ (方法その 1) .Em PPP 接続要求を受け入れるには、次の手順にしたがってください。 .Bl -enum .It モデムと、 (必要であれば) .Pa /etc/rc.serial が正しく設定されていることを確認します。 .Bl -bullet -compact .It フロー制御にはハードウェアハンドシェイク (CTS/RTS) を使います。 .It モデムはエコーバックを行わず (ATE0) 、コマンドの結果も報告しない (ATQ1) ように設定されていなければなりません。 .El .Pp .It モデムが接続されているポートで .Xr getty 8 が起動されるように .Pa /etc/ttys を編集します。 例えば、次のように設定すれば良いでしょう: .Pp .Dl ttyd1 "/usr/libexec/getty std.38400" dialup on secure .Pp .Xr getty 8 を起動するために .Xr init 8 プロセスに .Dv HUP シグナルを送るのを 忘れないでください: .Pp .Dl # kill -HUP 1 .It .Pa /usr/local/bin/ppplogin ファイルを次のような内容で作成します: .Bd -literal -offset indent #!/bin/sh exec /usr/sbin/ppp -direct incoming .Ed .Pp ダイレクトモード .Pq Fl direct では、 .Nm は標準入力と標準出力を使って動作します。クライアント動作の .Nm と同様に、 .Xr pppctl 8 を使用することで、構成された診断ポートに接続可能です。 .Pp ここで .Pa /etc/ppp/ppp.conf 中の .Ar incoming セクションが設定されていなければなりません。 .Pp .Ar incoming セクションに適当な .Dq allow users コマンドがあることを確かめておいてください。 .It 受け入れるユーザのアカウントを用意してください。 .Bd -literal ppp:xxxx:66:66:PPP Login User:/home/ppp:/usr/local/bin/ppplogin .Ed .Pp 詳細は .Xr adduser 8 と .Xr vipw 8 のマニュアル項目を参照してください。 .Dq accept dns および .Dq set nbns コマンドを使うことで IPCP によるドメインネームサーバと NetBIOS ネームサーバの 交渉を有効にすることが可能です。 下記の記述を参照してください。 .El .Pp .Sh PPP 接続の受け入れ (方法その 2) この方法は、 .Xr login 1 ではなく .Nm ppp で接続の認証を行うという点が異なります。 .Bl -enum .It .Pa /etc/gettytab の default セクションに .Dq pp ケーパビリティを指定することで ppp を自動的に認識するように 設定してください。 .Bd -literal default:\\ :pp=/usr/local/bin/ppplogin:\\ ..... .Ed .It 上記の方法その 1 の最初の 3 手順と同じように、 シリアルデバイスを設定し、 .Xr getty 8 を有効にして、 .Pa /usr/local/bin/ppplogin を作成してください。 .It .Pa /etc/ppp/ppp.conf の .Sq incoming ラベル (もしくは .Pa ppplogin が用いるラベルならなんでも構いません) 下に .Dq enable chap か .Dq enable pap .Pq もしくはその両方 を加えてください。 .It .Pa /etc/ppp/ppp.secret に、受け入れるユーザそれぞれについて、エントリを作成してください。 .Bd -literal Pfredxxxx Pgeorgeyyyy .Ed .El .Pp これで、 .Xr getty 8 は (HDLC フレームヘッダを認識することで) ppp 接続を検出すると、すぐに .Dq /usr/local/bin/ppplogin を実行します。 .Pp 上記のように PAP もしくは CHAP を有効にすることは .Em 必須 です。そうしなければ、あらゆる人があなたのマシンにパスワード .Em なしに ppp セッションを確立することを許可し、 あらゆる種類の潜在的な攻撃に対して門戸を開いていることになります。 .Sh 内向き接続の認証 通常、接続の受信側は相手が相手自身を認証することを要求します。 これは通常 .Xr login 1 にて行われますが、代りに PAP か CHAP を使用可能です。 2 つのうちで CHAP の方がより安全ですが、 クライアントによってはサポートしていないものがあります。 どちらを使いたいか決めたら、 .Sq enable chap または .Sq enable pap を .Pa ppp.conf の適切なセクションに追加してください。 .Pp その後、 .Pa /etc/ppp/ppp.secret ファイルの設定を行う必要があります。 このファイルは、クライアントになりうるマシンごとに 1 行を含みます。 各行は 4 つまでのフィールドからなります: .Bd -literal -offset indent name key [hisaddr [label]] .Ed .Pp .Ar name と .Ar key は期待されるクライアントを指定します。 .Ar key が .Dq \&* で PAP が使用される場合、 .Nm は認証時にパスワードデータベース .Pq Xr passwd 5 を検索します。 .Pa ppp.secret の如何なる .Ar name No / Ar key の組み合わせにおいても適切でない返答をクライアントが与える場合、 認証は失敗します。 .Pp 認証に成功したならば、 .Pq 指定時には .Ar hisaddr を IP 番号交渉時に使用します。詳細は .Dq set ifaddr コマンドを参照してください。 .Pp 認証に成功し .Ar label が指定された場合、現在のシステムラベルは .Ar label にマッチするように修正されます。 このことはファイル .Pa ppp.linkup と .Pa ppp.linkdown の後続のパーズに影響があります。 .Sh PPP オーバ TCP (別名: トンネリング) シリアルリンク上以外の .Nm の使用方法として、 device にホストとポートを指定することにより、 TCP 接続を使用することが可能です: .Pp .Dl set device ui-gate:6669 .Pp シリアルデバイスをオープンする代りに、 .Nm は指定されたマシンの指定されたソケットへの TCP 接続をオープンします。 .Nm は telnet プロトコルを使用しないこと、 telnet サーバと交渉できないことに注意を払うべきです。 受信マシン (ui-gate) 上に、 この ppp 接続を受信するポートを設定する必要があります。まず .Pa /etc/services を更新して、サービスを定義します: .Pp .Dl ppp-in 6669/tcp # Incoming PPP connections over tcp .Pp そして .Pa /etc/inetd.conf を更新して、このポートへの受信接続をどのように扱うかを .Xr inetd 8 に指示します: .Pp .Dl ppp-in stream tcp nowait root /usr/sbin/ppp ppp -direct ppp-in .Pp .Pa /etc/inetd.conf を更新した後には、 .Xr inetd 8 に .Dv HUP シグナルを送るのをお忘れなく。 ここではラベル名 .Dq ppp-in を使用します。 ui-gate (受信側) の .Pa /etc/ppp/ppp.conf エントリは次の内容を含みます: .Bd -literal -offset indent ppp-in: set timeout 0 set ifaddr 10.0.4.1 10.0.4.2 add 10.0.1.0/24 10.0.4.2 .Ed .Pp セキュリティのために PAP もしくは CHAP の設定をしたいかもしれません。 PAP を有効にするには次の行を追加します: .Bd -literal -offset indent enable PAP .Ed .Pp また、次のエントリを .Pa /etc/ppp/ppp.secret に作成する必要があります: .Bd -literal -offset indent MyAuthName MyAuthPasswd .Ed .Pp .Ar MyAuthPasswd が .Pq Dq * の場合には、パスワードは .Xr passwd 5 データベースから検索されます。 .Pp awfulhak (起動側) の .Pa /etc/ppp/ppp.conf エントリは次の内容を含む必要があります: .Bd -literal -offset indent ui-gate: set escape 0xff set device ui-gate:ppp-in set dial set timeout 30 set log Phase Chat Connect hdlc LCP IPCP CCP tun set ifaddr 10.0.4.2 10.0.4.1 add 10.0.2.0/24 10.0.4.1 .Ed .Pp PAP を有効にしようとしている場合、次の設定も必要です: .Bd -literal -offset indent set authname MyAuthName set authkey MyAuthKey .Ed .Pp 我々は、 ui-gate に 10.0.4.1 のアドレスを割り当て、 awfulhak に 10.0.4.2 のアドレスを割り当てようとしています。 接続をオープンするためには、次の内容をタイプするだけで良いです。 .Pp .Dl awfulhak # ppp -background ui-gate .Pp 結果として、 awfulhak にはネットワーク 10.0.2.0/24 への新たな「経路」が、 ui-gate にはネットワーク 10.0.1.0/24 への新たな「経路」が、 TCP 接続経由でそれぞれ作成されます。 ネットワークは実質的にブリッジされます - 下位レベルの TCP 接続はパブリックなネットワーク (例えばインターネット) を またがっても良いです。 また 2 つのゲートウェイ間では ppp トラフィックは 概念的に TCP ストリーム中でカプセル化されます (パケットがパケットに対応するわけではありません)。 この機構の大きな欠点は、同時に 2 つの「配送保証」機構が存在することです - この 2 つとは、下位レベルの TCP ストリームと .Em PPP リンク上で使用されるプロトコルであり、おそらくまた TCP でしょう。 パケット喪失が起ると、両者はそれぞれの方法で喪失した パケットを再送しようと するでしょう。 .Sh パケットエイリアシング .Fl alias コマンドラインオプションにより、 パケットエイリアシングが有効になります。 これにより、 .Nm ホストがローカルエリアネットワークの他のコンピュータに対して マスカレードゲートウェイとして動作するようになります。 送信される IP パケットは、まるで .Nm ホストから来たかのようにエイリアスされ、 受信パケットは、それがローカルエリアネットワークの正しいマシンに 送られるようにエイリアスが戻されます。 パケットエイリアシングにより、 未登録でプライベートなサブネット上のコンピュータを 外部から見えないようにしつつ、 インターネットへアクセス可能とします。 一般に、 .Nm が正しく動作していることの確認は、 まず最初にパケットエイリアシングを禁止して行います。 次に .Fl alias オプションを有効にして、 .Nm ホストの上で (ウェブブラウザや .Xr telnet 1 , .Xr ftp 1 , .Xr ping 8 , .Xr traceroute 8 などの) ネットワークアプリケーションの動作を確認します。 最後に、LAN 上の別のコンピュータの上で同様なアプリケーションの 動作を確認することになります。 .Nm ホストではネットワークアプリケーションが正しく動作するのに、 LAN 上の別のコンピュータでは動かないのであれば、マスカレードソフトウェアは 正しく動いているけれども、ホストが IP パケットをフォワーディングしないか、 ひょっとするとパケットが送られて来ていないかのどちらかです。 .Pa /etc/rc.conf で IP フォワーディングが有効にされていることと、 他のコンピュータで .Nm ホストがその LAN のゲートウェイとして 指定されていることを確認してください。 .Sh パケットのフィルタリング この実装では、パケットのフィルタリングがサポートされています。 .Em in フィルタ、 .Em out フィルタ、 .Em dial フィルタ、そして .Em alive フィルタの 4 種類のフィルタがあります。 ここでは基本的なことについて書くことにします。 .Bl -bullet .It フィルタ定義は次のような構文になっています。 .Pp set filter .Ar name .Ar rule-no .Ar action .Op Ar src_addr Ns Op / Ns Ar width .Op Ar dst_addr Ns Op / Ns Ar width [ .Ar proto .Op src Op Ar cmp No Ar port .Op dst Op Ar cmp No Ar port .Op estab .Op syn .Op finrst ] .Bl -enum .It .Ar name -には、 +は、 .Sq in , .Sq out , .Sq dial , .Sq alive -のいずれかです。 +のうちのいずれか 1 つです。 .It .Ar rule-no は .Sq 0 から .Sq 19 までの数値で、ルール番号を指定します。 ルールは .Ar rule-no の番号順に指定されます。 ただしルール .Sq 0 が指定されている場合のみです。 .It .Ar action は .Sq permit , .Sq deny のいずれかです。 もし、あるパケットがルールに一致した場合、 結びつけられた action が直ちに実行されます。 .It .Op Ar src_addr Ns Op / Ns Ar width と .Op Ar dst_addr Ns Op / Ns Ar width は始点と終点の IP アドレスです。 .Op / Ns Ar width が指定された場合には、それによって適切なネットマスクのビット値を与え、 アドレスの範囲を指定することができます。 .It .Ar proto は .Sq icmp , .Sq udp , .Sq tcp のうちのいずれか 1 つです。 .It .Ar cmp は .Sq \< , .Sq \&eq , .Sq \> のうちいずれか 1 つです。それぞれ、より小さい、等しい、 より大きいを意味します。 .Ar port はポート番号で指定するか、 .Pa /etc/services のサービス名で指定することができます。 .It .Sq estab , .Sq syn , .Sq finrst フラグは .Ar proto が .Sq tcp に設定されているときにのみ許可され、それぞれ TH_ACK、TH_SYN、および TH_FIN もしくは TH_RST という TCP フラグを表わします。 .El .Pp .It 各フィルタはルール 0 から始まり、20 個までのルールをもつことができます。 規則のルールは、ルール 0 が定義されていなければ、有効にはなりません。 すなわち、デフォルトではすべてが通されます。 .It パケットにマッチするルールが無い場合は、パケットは破棄 (ブロック) されます。 .It すべての規則を消去するには、 .Dq set filter Ar name No -1 を使ってください。 .El .Pp .Pa /etc/ppp/ppp.conf.example を参照してください。 .Sh アイドルタイマの設定 アイドルタイマを調べたり/設定するためには、それぞれ .Dq show bundle と .Dq set timeout コマンドを使ってください: .Bd -literal -offset indent ppp ON awfulhak> set timeout 600 .Ed .Pp タイムアウト時間は秒数で指定します。デフォルト値は timeout が 180 秒 .Pp 3 分 です。 アイドルタイマ機能を使わないようにするためには、 次のコマンドを利用してください。 .Bd -literal -offset indent ppp ON awfulhak> set timeout 0 .Ed .Pp .Fl ddial と .Fl direct モードではアイドルタイムアウトは無視されます。 .Fl auto モードでは、アイドルタイムアウトが発生すると .Nm プログラムは実行したままで .Em PPP セッションを終了します。別の引金となるパケットがきた時に リンクを再び確立しようとします。 .Sh Predictor-1 および DEFLATE 圧縮 .Nm は Predictor type 1 圧縮および deflate 圧縮をサポートしています。 デフォルトでは、 .Nm は、接続相手が同意 .Pq あるいは要求 した場合に、 この機能を使おうと (もしくは受け入れようと) します。 .Nm は deflate プロトコルを優先します。 これらの機能を使用したくない時には .Dq disable と .Dq deny のコマンドを参照してください。 .Pp .Dq disable deflate か .Dq deny deflate の一方を使用することにより、 方向ごとに異ったアルゴリズムを使用することができます。 .Pq 接続相手が両方のプロトコルをサポートしていると仮定しています。 .Pp デフォルトでは、DEFLATE について交渉するときには .Nm はウィンドウサイズとして 15 を使います。この動作を変更したい場合には .Dq set deflate コマンドを参照してください。 .Pp デフォルトでは無効にされ受け付けませんが、DEFLATE24 と呼ばれる特殊な アルゴリズムを使用することもできます。これは CCP ID 24 を 交渉に使う点を除いては DEFLATE と完全に同じものです。 これを使用することで .Nm は .Nm pppd バージョン 2.3.* と DEFLATE 交渉を成功させることができます。 .Sh IP アドレスの制御 .Nm は IP アドレスの交渉のために IPCP を使います。接続の両側は、自分が 使おうとするアドレスを提示し、要求された IP アドレスが受け入れ可能な ものであれば、相手に ACK (肯定応答) を返します。 受け入れることができなければ、別の IP アドレスの使用を促すために .Nm は相手に NAK (否定応答) を返します。 接続の両側が受け取った要求に同意し (ACK を送っ) た時、 IPCP はオープン状態にセットされ、ネットワーク層での接続が確立されます。 IPCP の動作を制御するために、この実装はローカルとリモートの IP アドレスを定義するための .Dq set ifaddr コマンドを持っています。 .Bd -literal -offset indent set ifaddr [src_addr [dst_addr [netmask [trigger_addr]]]] .Ed .Pp ここで、 .Sq src_addr はローカル側で使おうと思っている IP アドレスで、 .Sq dst_addr はリモート側が使用すべき IP アドレスです。 .Sq netmask は使用すべきネットマスクです。 .Sq src_addr のデフォルトは現在の .Xr hostname 1 のもの、 .Sq dst_addr のデフォルトは 0.0.0.0 であり、 .Sq netmask のデフォルトは .Sq src_addr に適したマスク値です。 .Sq netmask はデフォルトより小さくすることのみ可能です。 ほとんどのカーネルが POINTOPOINT インタフェースのネットマスクを 無視するので、便利な値は 255.255.255.255 でしょう。 .Pp 誤った .Em PPP の実装には、接続交渉のために、 .Sq src_addr ではなく特別な IP アドレスを使用しなければならないものがあります。 この場合、 .Sq trigger_addr で指定した IP アドレスが使用されます。 相手がこの提案された番号に同意しない限り、経路表には影響しません。 .Bd -literal -offset indent set ifaddr 192.244.177.38 192.244.177.2 255.255.255.255 0.0.0.0 .Ed .Pp 上の例の意味は次の通りです: .Pp .Bl -bullet -compact .It 自分の IP アドレスとしてまず 0.0.0.0 を提案しますが、アドレス 192.244.177.38 のみは受け付けます。 .It 相手側のアドレスとして 192.244.177.2 を使うように要求し, 192.244.177.2 以外のどんなアドレスを使うことも許可しません。 相手側が別の IP アドレスを要求してきた時は、いつでも 192.244.177.2 を提案します。 .It 経路表のネットマスク値は 0xffffffff に設定されます。 .El .Pp これは、両側が既に決まった IP アドレスを持っている場合には うまくいきますが、多くの場合、一方がすべての IP アドレスを制御する サーバとして動作しており、もう一方はその方針に従わなくてはなりません。 より柔軟な動作をさせるために、`ifaddr' 変数の IP アドレス指定を もっと緩やかにすることが可能です: .Pp .Dl set ifaddr 192.244.177.38/24 192.244.177.2/20 .Pp スラッシュ (/) に続く数字は、この IP アドレスで意味のあるビットの数を 表現しています。上の例は次のことを示しています。 .Pp .Bl -bullet -compact .It 可能なら自分のアドレスとして 192.244.177.38 を使おうとしますが、 192.244.177.0 から 192.244.177.255 の間の任意の IP アドレスも受け入れます。 .It 相手のアドレスとして 192.244.177.2 を使うことを希望しますが、 192.244.176.0 から 192.244.191.255 の間の任意の IP アドレスも許可します。 .It すでにお気づきと思いますが、 192.244.177.2 は 192.244.177.2/32 と書くことと 等価です。 .It 例外として、0 は 0.0.0.0/0 と等価であり、希望する IP アドレスは 特に無く、リモート接続先の選択に従うことを意味します。 0 を使用した場合は、接続が確立するまで、経路表のエントリは まったく設定されません。 .It 192.244.177.2/0 は、どんな IP アドレスでも受け入れる/許可することを 意味しますが、最初に 192.244.177.2 を使うように提案します。 .El .Pp .Sh インターネットサービスプロバイダと接続する プロバイダに接続する際には、次のステップを踏む必要があるでしょう: .Bl -enum .It .Dq set phone コマンドを使って、ダイヤルスクリプトにプロバイダの電話番号を記述します。 ダイヤルやリダイヤルに使用する電話番号は、 パイプ (|) またはコロン (:) で区切って 複数指定することができます。例えば、次のようになります。 .Bd -literal -offset indent set phone "111[|222]...[:333[|444]...]..." .Ed .Pp 最初のパイプで区切られたリストの番号は、 直前の番号でダイヤルもしくはログインスクリプトが失敗した場合のみ使用されます。 コロンで区切られた番号は、直前の番号の使用によりなにが起ったのかにかかわらず、 この順番で使用されます。例えば: .Bd -literal -offset indent set phone "1234567|2345678:3456789|4567890" .Ed .Pp この場合、まず 1234567 にダイヤルしてみます。 ダイヤルもしくはログインスクリプトに失敗したら、 次は 2345678 を使用します。 しかしこれはダイヤルもしくはログインスクリプトに失敗したとき *のみ* です。 このダイヤルの後、3456789 が使用されます。 4567890 は 345689 でダイヤルもしくはログインスクリプトに失敗したときのみ 使用されます。 2345678 のログインスクリプトが失敗したとしても、次の番号は 3456789 です。 必要な数だけ、パイプとコロンを使用可能です (しかし、通常はパイプのみかコロンのみであり両方の使用はないでしょう)。 次の番号へのリダイヤルまでのタイムアウトは、すべての番号にて使用されます。 リストが終了すると、 通常のリダイヤル期間だけ待ち、 最初から再開します。 .Dq set dial コマンドの \\\\T 文字列は選択された番号で置きかえられます。 (以降を参照してください)。 .It リダイヤルに関する設定は、 .Dq set redial で行います。 例えば回線の調子が悪かったり、 (最近では それほど多くないでしょうが) プロバイダがいつも話中だったりすると、 次のように設定したくなるかもしれません: .Bd -literal -offset indent set redial 10 4 .Ed .Pp これは最初の番号にリダイヤルを行う前に 10 秒待って、 4 回までダイヤルしてみるという意味になります。 .It .Dq set dial と .Dq set login コマンドを使ってログイン手続きを記述します。 .Dq set dial コマンドはモデムと通信してプロバイダへのリンクを確立するのに使われます。 例えば、次のようになります: .Bd -literal -offset indent set dial "ABORT BUSY ABORT NO\\\\sCARRIER TIMEOUT 4 \\"\\" \e ATZ OK-ATZ-OK ATDT\\\\T TIMEOUT 60 CONNECT" .Ed .Pp このモデム「チャット」文字列の意味は次の通りです。 .Bl -bullet .It \&"BUSY" または "NO CARRIER" を受信した場合には処理を中止します。 .It タイムアウトを 4 秒にセットします。 .It 文字列の受信待ちは行いません。 .It ATZ を送信します。 .It OK の受信待ちを行います。もし 4 秒以内に受信できなければ、 もう 1 度 ATZ を送信し、OK の受信待ちを行います。 .It ATDTxxxxxxx を送信します。xxxxxxx は 上記の電話番号リストの中の、次にダイヤルする番号です。 .It タイムアウトを 60 にセットします。 .It 文字列 CONNECT の受信待ちを行います。 .El .Pp 一旦接続が確立されると、ログインスクリプトが実行されます。 このスクリプトはダイヤルスクリプトと同じスタイルで書かれますが、 パスワードがログされないように注意してください: .Bd -literal -offset indent set authkey MySecret set login "TIMEOUT 15 login:-\\\\r-login: awfulhak \e word: \\\\P ocol: PPP HELLO" .Ed .Pp このログイン「チャット」文字列の意味は次の通りです。 .Bl -bullet .It タイムアウトを 15 秒にセットします。 .It "login:" の受信待ちを行います。もし受信できなければ 復改文字を送信して、再び "login:" の受信待ちを行います。 .It "awfulhak" を送信します。 .It "word:" ("Password:" プロンプトの末尾) の受信待ちを行います。 .It .Ar authkey に現在設定されている値を送信します。 .It "ocol:" ("Protocol:" プロンプトの末尾) の受信待ちを行います。 .It "PPP" を送信します。 .It "HELLO" の受信待ちを行います。 .El .Pp .Dq set authkey ( .Ar command ログ使用時には) コマンドのログは特別な方法でとられ、( .Sq ******** とログされますので) 実際のパスワードが危険にさらされることはありません。 .Ar chat ログ使用時には、実際のパスワードの代りに '\\P' とログされます。 .Pp ログインスクリプトはプロバイダによって大きく違うものになるでしょう。 始めてそれを設定するときには .Em チャットログを有効化 することで、あなたのスクリプトが予定通りに動いているかを 調べることができます。 .It シリアル回線と通信速度を指定するためには .Dq set line と .Dq set speed を使います。例えば次のようになります。 .Bd -literal -offset indent set line /dev/cuaa0 set speed 115200 .Ed .Pp FreeBSD では cuaa0 が 1 つめのシリアルポートになります。 OpenBSD で .Nm を実行している場合には cua00 が 1 つめです。 あなたのモデムが 28800 かそれ以上のビットレートで通信することが できるなら、シリアルポートの速度には 115200 を指定しておくべきでしょう。 一般に、シリアルポートの速度はモデムの速度の約 4 倍にしておきます。 .It .Dq set ifaddr コマンドで IP アドレスを定義します。 .Bl -bullet .It プロバイダがどの IP アドレスを使っているのか知っている場合には、 それをリモートアドレス (dst_addr) として使ってください。 知らない場合には、10.0.0.2/0 か何かを使ってください (以降を参照してください)。 .It 特定の IP アドレスをプロバイダから割り当てられている場合は、 それをローカルアドレス (src_addr) として使ってください。 .It プロバイダが IP アドレスを動的に割り当てる場合は、適当に控えめで 緩やかに記述した IP アドレスをローカルアドレスに選んでください。 10.0.0.1/0 が適切でしょう。 / に続く数値は、このアドレスのうち何ビットを重視しているかを示します。 もしもクラス C のネットワーク 1.2.3.0 上のアドレスを使うことを 主張したいのなら、1.2.3.1/24 と指定することができます。 .It プロバイダがあなたが提示した最初の IP 番号を受け付ける場合、 第 3, 4 の引数に .Dq 0.0.0.0 を指定してください。 これによりプロバイダが番号を割り当てます。 (3 つめの引数は、 .Sq src_addr に対してデフォルトのマスクよりも制約が緩いため、無視されます。) .El .Pp 自分の IP アドレスもプロバイダの IP アドレスも 知らない場合には、次の例のようにするとよいでしょう。 .Bd -literal -offset indent set ifaddr 10.0.0.1/0 10.0.0.2/0 0.0.0.0 0.0.0.0 .Ed .Pp .It ほとんどの場合、プロバイダはデフォルトルータでもあるでしょう。 この場合、次の行を .Pa /etc/ppp/ppp.conf に追加します。 .Bd -literal -offset indent add default HISADDR .Ed .Pp これは、 .Nm 接続先のアドレスが何であっても .Pq この例では 10.0.0.2 デフォルト経路として追加するように指示します。 この経路は .Sq スティッキー です。これは .Dv HISADDR の値が変わると、経路もそれに従って自動的に更新されるという意味です。 .Pp 以前のバージョンの .Nm では .Pa /etc/ppp/ppp.linkup ファイルにこれと似たエントリが必要でした。 .Sq スティッキー経路 の出現により、これはもはや必要ではなくなりました。 .It プロバイダが PAP/CHAP による認証を要求している場合は、 .Pa /etc/ppp/ppp.conf ファイルに次の行を追加してください: .Bd -literal -offset indent set authname MyName set authkey MyPassword .Ed .Pp デフォルトではどちらも受け付けられますので、ISP が何を要求しても大丈夫です。 .Pp PAP もしくは CHAP を使用する場合、ログインスクリプトはほとんどの場合、 必要とされないことを記述しておくべきでしょう。 .It 次のような行を加え、ISP にネームサーバアドレスを確認してください。 .Bd -literal -offset indent enable dns .Pp .Ed ローカル DNS を走らせている場合には、これを .Em やらない でください。 .Nm は単純に .Pa /etc/resolv.conf に nameserver 行を入れることで、ローカル DNS の使用を 出し抜いてしまうからです。 .El .Pp 現実の例を見たい場合には、 .Pa /etc/ppp/ppp.conf.sample と .Pa /etc/ppp/ppp.linkup.sample を参照してください。 ラベル pmdemand は、ほとんどのプロバイダで使用できるでしょう。 .Sh ログ機能 .Nm は次のログ情報を、 .Xr syslog 3 経由で、もしくはスクリーンに出力することができます: .Bl -column SMMMMMM -offset indent .It Li Async 非同期レベルパケットの 16 進ダンプ .It Li CBCP CBCP (CallBack Control Protocol) ログの生成 .It Li CCP CCP パケットトレースの生成 .It Li Chat チャットスクリプトのトレースログの生成 .It Li Command コマンド実行のログ .It Li Connect 完全なチャットログの生成 .It Li Debug デバッグ情報のログ .It Li HDLC HDLC パケットの 16 進ダンプ .It Li ID0 ユーザ ID 0 で実行された全関数呼び出しを詳細に記録 .It Li IPCP IPCP パケットトレースの生成 .It Li LCP LCP パケットトレースの生成 .It Li LQM LQR レポートの生成 .It Li Phase フェーズ遷移ログの出力 .It Li TCP/IP 全 TCP/IP パケットのダンプ .It Li Timer タイマ操作のログ .It Li TUN ログの各行に tun デバイスを含めます .It Li Warning 端末デバイスへの出力。端末が存在しない場合は、LOG_WARNING を使用してログファイルに送ります。 .It Li Error 端末デバイスとログファイルへの出力で、LOG_ERROR を使用します。 .It Li Alert ログファイルへの出力で、LOG_ALERT を使用します。 .El .Pp .Dq set log コマンドで、ログの出力レベルを設定することができます。 また、複数のレベルを単一コマンドラインにて指定することも可能です。 デフォルトは、 .Dq set log Phase です。 .Pp スクリーンに直接ログを表示することも可能です。 文法は同じで、語 .Dq local が .Dq set log の直後に付くことだけが違います。 デフォルトは .Dq set log local (つまり、マスクされない警告、エラーと注意のみ出力) です。 .Pp .Dq set log Op local への最初の引数が '+' か '-' の文字で始まる場合、 現在のログレベルを消去せずに修正します。例えば: .Bd -literal -offset indent PPP ON awfulhak> set log phase PPP ON awfulhak> show log Log: Phase Warning Error Alert Local: Warning Error Alert PPP ON awfulhak> set log +tcp/ip -warning PPP ON awfulhak> set log local +command PPP ON awfulhak> show log Log: Phase TCP/IP Warning Error Alert Local: Command Warning Error Alert .Ed .Pp レベル Warning, Error, Alert のメッセージログは .Dq set log Op local では制御できません。 .Pp .Ar Warning レベルは特別で、ローカルに表示可能な場合にはログされません。 .Sh シグナルハンドリング .Nm は次のシグナルを扱います: .Bl -tag -width XX .It INT このシグナルを受信すると、現在の接続がもしあればそれを終了します。 .Fl auto もしくは .Fl ddial のモードではない場合、 .Nm は終了します。 .It HUP, TERM, QUIT .Nm を終了させます。 .It USR2 .Nm に全サーバソケットを閉じさせ、すべての既存の診断ポートへの接続を 取り下げます。 .El .Pp .Sh マルチリンク PPP .Em PPP 相手に接続するのに複数の物理的なリンクを利用したいなら、 接続相手も .Em マルチリンク PPP プロトコルを理解する必要があります。 仕様の詳細は RFC 1990 を参照してください。 .Pp 接続先は、 .Dq 終点の選択 とその .Dq 認証 ID の組み合わせによって識別されます。 これらの一方、もしくは両方を指定することができます。 最低でも片方は指定しておくことが推奨されます。 そうでないと、すべてのリンクが実際に同一のプログラムに接続されていることを 確認する方法がなくなり、 混乱してロックアップを引き起こすことがあります。 ローカルには、これらの識別変数は .Dq set enddisc と .Dq set authname コマンドを用いることで指定されます。先立って接続相手と .Sq authname .Pq と Sq authkey について合意しておく必要があります。 .Pp マルチリンクの能力は .Dq set mrru コマンド (set maximum reconstructed receive unit) を用いることで 有効になります。一度マルチリンクが有効になれば、 .Nm は接続相手とマルチリンク接続の交渉を行います。 .Pp デフォルトでは .Po .Sq deflink と呼ばれる .Pc ただ 1 つの .Sq リンク のみが有効です。さらにリンクを作成するには .Dq clone コマンドが使われます。このコマンドは既存のリンクを複製します。 それは次の点を除いてすべての性質が同じものです: .Bl -enum .It 新しいリンクは .Dq clone コマンドラインで指定された独自の名前を持ちます。 .It 新しいリンクは .Sq interactive リンクです。そのモードは次の .Dq set mode コマンドで変更することができます。 .It 新しいリンクは .Sq closed の状態にあります。 .El .Pp すべての有効なリンクのまとめは、 .Dq show links コマンドを用いて見ることができます。 .Pp 一度リンクが作成されると、コマンドの使用方法が変わります。 すべてのリンク固有のコマンドの前には、 .Dq link Ar name プレフィックスをつけて、 コマンドを適用するリンクを指定する必要があります。 .Nm は十分賢いので、 利用可能なリンクが 1 つだけの場合には、 .Dq link Ar name プレフィックスは不要です。 .Pp コマンドの中には依然としてリンクの指定なしに使用できるものがあり、それは .Sq バンドル レベルの操作を行います。たとえば、2 つ以上のリンクが存在するとき .Dq show ccp はマルチリンクレベルの CPP 設定と統計を表示し .Dq link deflink show ccp は .Dq deflink のリンクレベルの同じ情報を表示します。 .Pp これらの情報を用いて、次の設定を用いることができます: .Pp .Bd -literal -offset indent mp: set timeout 0 set log phase chat set device /dev/cuaa0 /dev/cuaa1 /dev/cuaa2 set phone "123456789" set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \\"\\" ATZ \e OK-AT-OK \\\\dATDT\\\\T TIMEOUT 45 CONNECT" set login set ifaddr 10.0.0.1/0 10.0.0.2/0 set authname ppp set authkey ppppassword set mrru 1500 clone 1,2,3 link deflink remove .Ed .Pp すべての複製が設定の最後で行われていることに注意してください。 一般にはリンクは最初に設定され、そして複製されます。 あなたが常にすべてのリンクがアップ状態であることを望む場合には、 設定の最後に次の行を追加することができます。 .Pp .Bd -literal -offset indent link 1,2,3 set mode ddial .Ed .Pp リンクが必要に応じてダイヤルされることを望む場合には、次のコマンドを 使うことができます。 .Pp .Bd -literal -offset indent link * set mode auto .Ed .Pp 上記の .Dq set device 行を取り除き、 .Dq clone コマンドに続けて次の内容を指定することで、 リンクを特定の名前に結びつけることもできます: .Pp .Bd -literal -offset indent link 1 set device /dev/cuaa0 link 2 set device /dev/cuaa1 link 3 set device /dev/cuaa2 .Ed .Pp どのコマンドが ( .Dq link コマンドを使用した) コンテキスト (文脈) を要求し、 どのコマンドがコンテキストをオプションとし、 そしてどのコマンドがコンテキストを一切とらないかを調べるには、 .Dq help コマンドを使用します。 .Pp .Nm が接続相手と .Em マルチリンク モードで交渉をすると、 .Nm はローカルドメインソケットを .Pa /var/run ディレクトリに作成します。このソケットは、 リンク情報 (実際のリンクファイル記述子も含む) を、異なる .Nm の間で受け渡しするために使われます。 この機能によって、 .Nm はシリアル回線の初期制御を行う必要なしに .Xr getty 8 から、もしくは直接 .Pa /etc/gettydefs から ( .Sq pp= ケーパビリティを用いて) 実行することが可能となっています。 ひとたび .Nm がマルチリンクモードの交渉を行うと、 .Nm は自分がオープンした リンクをすでに実行されている任意の他のプロセスに渡すことができます。 すでに実行されているプロセスがない場合、 .Nm はマスタとして振る舞い、ソケットを作成し、新たな接続を待ちます。 .Sh PPP コマンドリスト この節では利用可能コマンドとその効果をリストします。 .Nm ppp セッションで対話的に使用することも、 設定ファイルで指定することも、 .Xr pppctl 8 もしくは .Xr telnet 1 セッションで指定することも可能です。 .Bl -tag -width XX .It accept|deny|enable|disable Ar option.... これらのディレクティブは 最初の接続においてどのように相手と交渉するかを .Nm に指示します。各 .Dq option は、accept/deny および enable/disable のデフォルトを持ちます。 .Dq accept は相手がこのオプションを要求したら、ACK を送ることを意味します。 .Dq deny は相手がこのオプションを要求したら、NAK を送ることを意味します。 .Dq enable はこのオプションを当方が要求することを意味します。 .Dq disable はこのオプションを当方が要求しないことを意味します。 .Pp .Dq option は次のいずれかです: .Bl -tag -width XX .It acfcomp デフォルト: enable かつ accept。 ACFComp はアドレスおよびコントロールフィールド圧縮 (Address and Control Field Compression) を意味します。 LCP パケット以外は非常に良く似たフィールドを持ちますので、 簡単に圧縮可能です。 .It chap デフォルト: disable かつ accept。 CHAP はチャレンジ交換認証プロトコル (Challenge Handshake Authentication Protocol) を意味します。 CHAP もしくは PAP (後述) のどちらか一方のみ交渉可能です。 CHAP では、認証者は「チャレンジ」メッセージを相手に送ります。 相手は一方向ハッシュ関数を使用して「チャレンジ」を暗号化し、 結果を送り返します。 認証者は同じことを行い結果を比較します。 この機構の利点は、接続を介してパスワードを送らないことです。 接続が最初に確立する時にチャレンジが行われます。 更なるチャレンジが行われるかもしれません。 相手の認証を行いたい場合は、 .Dq enable chap を .Pa /etc/ppp/ppp.conf に書き、相手のエントリを .Pa /etc/ppp/ppp.secret に書く必要があります。 .Pp クライアントとして CHAP を使用する場合、 .Dq AuthName と .Dq AuthKey を .Pa /etc/ppp/ppp.conf に指定するだけで良いです。 CHAP はデフォルトで accept されます。 .Em PPP の実装によっては、チャレンジの暗号化に MD5 ではなく "MS-CHAP" を使用するものがあります。 MS-CHAP は MD4 と DES の組み合わせです。もし .Nm が DES ライブラリの存在するマシン上で構築された場合 MS-CHAP 認証要求に応答しますが、MS-CHAP 認証を要求することは 決してありません。 .It deflate デフォルト: enable かつ accept。 このオプションは圧縮制御プロトコル (Compression Control Protocol; CCP) に deflate 圧縮を使用するか否かを決定します。 使用されるアルゴリズムは .Xr gzip 1 プログラムが使用するものと同じです。 注: .Xr pppd 8 - 多くのオペレーティングシステムで使用可能な .Em PPP の実装 - との .Ar deflate 能力についての交渉には問題があります。 .Nm pppd (バージョン 2.3.1) が .Ar deflate 圧縮の交渉を行おうとする CCP コンフィギュレーションタイプは、 .Pa rfc1979 に規定されたタイプ .Em 26 ではなくタイプ .Em 24 であり、誤っています。 タイプ .Ar 24 は実際には .Pa rfc1975 では .Dq PPP Magna-link Variable Resource Compression と指定されています! .Nm は .Nm pppd と交渉する能力がありますが、 .Dq deflate24 が .Ar enable かつ .Ar accept されている場合のみです。 .It deflate24 デフォルト: disable かつ deny。 これは .Ar deflate のバリエーションで、 .Xr pppd 8 プログラムとの交渉を許可します。 詳細は上記の .Ar deflate セクションを参照してください。 これは .Pa rfc1975 に反するため、デフォルトでは disable となっています。 .It dns デフォルト: disable かつ deny。 このオプションは DNS 交渉を許可します。 .Pp .Dq enable にすることにより、 .Nm は接続相手が .Pa /etc/resolv.conf ファイルのエントリを確認することを要求します。 もし接続相手が当方の要求に否定応答をした場合 (新しい IP アドレスを 提案したら)、 .Pa /etc/resolv.conf ファイルは更新され、新しいエントリを確認するように要求を送ります。 .Pp .Dq accept にすることにより、 .Nm は接続相手からの DNS 検索要求を拒否せずに、返答します。 .Dq set dns コマンドの使用によって上書きされていない場合には、応答は .Pa /etc/resolv.conf から採られます。 .It lqr デフォルト: disable かつ accept。 このオプションはリンク品質要求 (Link Quality Request) を送信する、 もしくは受け入れるかどうかを決定します。 LQR は、モデムのキャリア検出を使用せずに、リンクダウンを .Nm に決定させるプロトコルです。 LQR が enable になっていると、 .Nm は LCP 要求の一部として .Em QUALPROTO オプション (後述の .Dq set lqrperiod を参照) を送ります。 接続相手が同意した場合、両端は同意した間隔で LQR パケットを交換し、 LQM ロギングを有効にすることで、詳細なリンク品質を監視することが 可能になります。 接続相手が同意しなかった場合、ppp は代りに ECHO LQR 要求を 送ります。これらのパケットは興味ある情報を何も渡しませんが、 .Em 必ず 接続相手に応答しなければなりません。 .Pp LQR, ECHO LQR のいずれを用いるにせよ、 .Nm は 5 つのパケットを送ったが確認応答が無い場合、6 つ目のパケットを送らずに 回線を切断します。 メッセージを .Em PHASE レベルで記録し、回線切断の原因が接続相手にあるものとして、適当な .Dq reconnect 値を使用します。 .It pap デフォルト: disable かつ accept。 PAP はパスワード認証プロトコル (Password Authentication Protocol) を 意味します。 CHAP (前述) もしくは PAP のどちらか一方のみ交渉可能です。 PAP では、ID とパスワードが相手に送られ続け、 認証されるか接続が終了されるまでこれが続きます。 これは比較的良くないセキュリティ機構です。 接続が最初に確立した時のみ実行可能です。 相手の認証を行いたい場合は、 .Dq enable pap を .Pa /etc/ppp/ppp.conf に書き、相手のエントリを .Pa /etc/ppp.secret に書く必要があります (ただし、後述の .Dq passwdauth オプションを参照)。 .Pp クライアントとして PAP を使用する場合、 .Dq AuthName と .Dq AuthKey を .Pa /etc/ppp/ppp.conf に指定するだけで良いです。 PAP はデフォルトで accept されます。 .It pred1 デフォルト: enable かつ accept。 このオプションは圧縮制御プロトコル (Compression Control Protocol; CCP) に Predictor 1 圧縮を使用するかどうかを決定します。 .It protocomp デフォルト: enable かつ accept。 このオプションは PFC (プロトコルフィールド圧縮) の交渉を行うために使用されます。 この機構により、 プロトコルフィールド数が 2 オクテットから 1 オクテットに減ります。 .It shortseq デフォルト: enable かつ accept。 このオプションは .Nm がマルチリンクモードの交渉時に .Pq 12 ビットの 短いシーケンス番号を要求し、そして受け入れるかどうかを決定します。 これは、当方の MMRU が設定されたときのみ (マルチリンクが有効になっているときのみ) 適用されます。 .It vjcomp デフォルト: enable かつ accept。 このオプションは Van Jacobson ヘッダ圧縮を使用するかどうかを決定します。 .El .Pp 次に示すオプションは、実際には相手と交渉しません。 それゆえ accept および deny は意味を持ちません。 .Bl -tag -width 20 .It idcheck デフォルト: enable。 低レベルな LCP, CCP, IPCP 設定トラフィックを交換するときに、 すべての応答の識別子フィールドはその要求の識別子フィールドと 同一であることが予定されています。デフォルトでは .Nm は予定された識別子フィールドを持たないすべての応答パケットを 捨て、それぞれのログレベルで報告します。もし .Ar idcheck が disable になっている場合、 .Nm は識別子フィールドを無視します。 .It loopback デフォルト: enable。 .Ar loopback が enable の場合、 .Nm は自動的に .Em PPP インタフェースと同じ終点アドレス宛に送出されたパケットを ループバックします。 disable の場合、 .Nm がパケットを送ると、おそらく他の終点からの ICMP リダイレクトとなります。 インタフェースがデフォルト経路であるため、 ループバック経路を必要とすることを避けたい場合、 このオプションを enable にすると便利です。 .It passwdauth デフォルト: disable。 このオプションを enable にすることにより、 PAP 認証コードが呼び出し側を認証する時に、 .Pa /etc/ppp/ppp.secret ファイル中でみつからない場合、パスワードデータベース ( .Xr passwd 5 参照) を使用します。 .Pa /etc/ppp/ppp.secret は常に、最初に調べられます。 .Xr passwd 5 からパスワードを調べ、かつそのクライアントに対して IP アドレスもしくは ラベルを指定したい場合には、 .Pa /etc/ppp/ppp.secret ファイル中のクライアントのパスワードとして .Dq \&* を用いてください。 .It proxy デフォルト: disable。 このオプションを enable にすることにより、 .Nm に相手のために代理 ARP をさせます。 .It sroutes デフォルト: enable。 .Dq add コマンドが .Dv HISADDR もしくは .Dv MYADDR という値とともに用いられると、エントリは .Sq スティック経路 リストに格納されます。 .Dv HISADDR もしくは .Dv MYADDR が変更される度に、このリストが経路表に適用されます。 .Pp このオプションを disable にすると、 スティッキー経路が適用されなくなります。 .Sq スティック経路 リストは依然として保守されます。 .It throughput デフォルト: enable。 このオプションを有効にすると、 .Nm はスループット統計を収集します。 ずれ動く 5 秒間のウィンドウにおいて入出力が検査され、 現在、最良時、総計の数値が保持されます。 このデータは関連する .Em PPP 層が終了するときに出力され、また .Dq show コマンドで表示することで得られます。スループット統計は .Dq IPCP と .Dq modem のレベルで利用可能です。 .It utmp デフォルト: enable。 通常ユーザが PAP もしくは CHAP で認証された時で、 .Nm が .Fl direct モードで実行されている時は、このユーザのエントリが utmp ファイルおよび wtmp ファイルに作成されます。 このオプションを disable にすると、 .Nm は utmp および wtmp のエントリを作成しません。 通常、 ユーザがログインしかつ認証することを要求する場合のみ必要です。 .El .It add[!] Ar dest[/nn] [mask] gateway .Ar dest は宛先 IP アドレスです。 ネットマスクは .Ar /nn によってビット数で指定するか、もしくは .Ar mask を用いて IP 番号で指定します。 .Ar 0 0 ならびにマスクなしの .Ar 0 はデフォルト経路を意味します。 .Ar 0 の代りにシンボル名 .Ar default を使うことが可能です。 .Ar gateway は、 .Ar dest マシン/ネットワークに至る、次のホップのゲートウェイです。 詳細は .Xr route 8 コマンドを参照してください。 .Pp 宛先にシンボル名 .Sq MYADDR と .Sq HISADDR を使用可能であり、 .Ar gateway には .Sq HISADDR もしくは .Sq INTERFACE を使用可能です。 .Sq MYADDR はインタフェースアドレスに置き換えられ、 .Sq HISADDR はインタフェースの宛先アドレスに置き換えられ、 .Sq INTERFACE は現在のインタフェース名に置き換えられます。 インタフェースの宛先アドレスが ( .Dq set ifaddr によって) 割り当てられていない場合、現在の .Sq INTERFACE が .Sq HISADDR の代りに使用されます。 .Pp .Ar add! コマンド .Po .Dq \&! に注意 .Pc 使用時には、経路が存在する場合には .Sq route change コマンド (詳細は .Xr route 8 参照) にて経路を更新します。 .Pp .Dq HISADDR もしくは .Dq MYADDR を含む経路は .Sq スティッキー と見なされます。これらはリスト (リストを見るには .Dq show ipcp コマンドを使用します) に格納され、 .Dv HISADDR もしくは .Dv MYADDR の値が変更される度に、経路表の関連するエントリが更新されます。 この機能は .Dq disable sroutes を使用することで無効にできます。 .It allow Ar command Op Ar args このコマンドは .Nm と設定ファイルへのアクセスを制御します。 ユーザレベルでのアクセスは可能であり、 設定ファイルのラベルと .Nm の実行モードに依存します。 例えば、ユーザ .Sq fred のみがラベル .Sq fredlabel に .Fl background モードでアクセスできるように、 .Nm を構成したいかもしれません。 .Pp ユーザ ID 0 はこれらのコマンドの対象外です。 .Bl -tag -width XX .It allow user[s] Ar logname... デフォルトでは、ユーザ ID 0 のみが .Nm へのアクセスを許されています。 このコマンドが指定されると、 .Dq allow users が記載されているセクションに列挙されているユーザのアクセスが可能となります。 .Sq default セクションは 常に最初にチェックされます (スタートアップ時に常にロードされる唯一の セクションです)。後続する .Dq allow users コマンドは、先行するコマンドに優先します。 あるラベル以外のすべてにアクセスを許すことが可能であり、 そのためにはデフォルトユーザを .Sq default セクションで指定し、新しいユーザリストをこのあるラベルに指定します。 .Pp ユーザ .Sq * が指定されると、全ユーザにアクセスが許されます。 .It allow mode[s] Ar modelist... デフォルトでは全 .Nm モードが使用可能です。 このコマンドが使用されると、 このコマンドが指定されたラベルのロードに許されるアクセスモードが制限されます。 .Dq allow users コマンドと同様、 各 .Dq allow modes コマンドは先行するコマンドに優先し、 .Sq default セクションは常に最初にチェックされます。 .Pp 使用可能なモードは次の通りです: .Sq interactive , .Sq auto , .Sq direct , .Sq dedicated , .Sq ddial , .Sq background , .Sq * 。 .Pp マルチリンクモードで動作するときには、 現在存在する回線モードを許可するセクションをロード可能です。 .El .Pp .It alias Ar command Op Ar args このコマンドは .Nm 組込みのエイリアシング (マスカレーディング) 機能を 制御するために使用します。 あなたのシステムでエイリアシングが有効になると (コンパイル時に削除できます)、 次のコマンドが使用可能となります: .Bl -tag -width XX .It alias enable [yes|no] エイリアシングを有効もしくは無効にします。 .Fl alias コマンドラインフラグは .Dq alias enable yes と同じ意味です。 .It alias port Op Ar proto targetIP:targetPORT [aliasIP:]aliasPORT このコマンドにより、 マシン .Ar aliasIP の .Ar aliasPORT へ到着する接続を、 .Ar targetIP の .Ar targetPORT へリダイレクトします。 .Ar proto は .Sq tcp もしくは .Sq udp のいずれかで、指定したプロトコルの接続のみマッチします。 あなたのゲートウェイの後のマシンでインターネット電話等を実行したい場合に、 このオプションは有用です。 .It alias addr Op Ar addr_local addr_alias このコマンドにより、 .Ar addr_alias へのデータを .Ar addr_local へリダイレクトします。 少数の実 IP アドレスを持っていて、これらをあなたのゲートウェイの後の 特定のマシンにマップしたい場合に有用です。 .It alias deny_incoming [yes|no] yes に設定した場合、ファイアウォールがパケットを落すのと同様に、 すべての入力の接続を拒否します。 .It alias help|? このコマンドにより、 使用可能なエイリアスコマンドのまとめを表示します。 .It alias log [yes|no] このオプションを指定することにより、 種々のエイリアシングの統計と情報を、ファイル .Pa /var/log/alias.log にログします。 .It alias same_ports [yes|no] 有効になると、 エイリアスライブラリが出力パケットのポート番号を変更しようとすることを 止めさせます。 RPC や LPD といった、 ウェルノウンポート (well known port) からの接続を要求する プロトコルをサポートするのに有用です。 .It alias use_sockets [yes|no] 有効になると、 エイリアスライブラリにソケットを作成させ、 正しい ftp データ入力や IRC 接続を保証できるようになります。 .It alias unregistered_only [yes|no] 登録されていない送信元アドレスの出力パケットのみを、変更します。 RFC1918 によると、登録されていない送信元アドレスは 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 です。 .El .Pp これらのコマンドはソース配布物の .Pa README.alias ファイル中でも議論されています。 .Pp .It [!]bg Ar command 指定した .Ar command を、次の語を置換した後に、バックグラウンドで実行します: .Bl -tag -width PEER_ENDDISC .It Li AUTHNAME これは、ローカルの .Ar authname の値と置き換えられます。後述の .Dq set authname コマンドを参照してください。 .It Li ENDDISC これは、ローカルの終点選択値と置き換えられます。 後述の .Dq set enddisc コマンドを参照してください。 .It Li HISADDR これは、相手の IP 番号と置き換えられます。 .It Li INTERFACE これは、使用中のインタフェース名と置き換えられます。 .It Li LABEL これは、最後に使用したラベル名と置き換えられます。 ラベルは、 .Nm のコマンドラインから .Dq load または .Dq dial のコマンドから指定するか、 .Pa ppp.secret ファイルから指定可能です。 .It Li MYADDR これは、ローカルインタフェースに割り当てられた IP 番号と置き換えられます。 .It Li PEER_ENDDISC これは、相手の終点選択番号と置き換えられます。 .It Li USER これは、PAP もしくは CHAP で認証されたユーザ名と置き換えられます。 通常、この変数は -direct モードでのみ割り当てられます。 この値は、utmp ロギングが有効になっているかどうかに関わらず、利用可能です。 .El .Pp コマンド実行中に .Nm を停止させたい場合は、 .Dq shell コマンドを使用してください。 .It clear modem|ipcp Op current|overall|peak... .Dq modem もしくは .Dq ipcp 階層で、指定されたスループット値をクリアします。 .Dq modem を指定する場合にはコンテキストが与えられなければなりません (後述の .Dq link コマンドを参照)。 第 2 引数が与えられない場合、すべての値がクリアされます。 .It clone Ar name[,name]... 指定されたリンクを複製し、引数の .Ar name に関連づけた新しいリンクを作成します。 このコマンドは、リンクが 1 つしかない場合 (この場合にはそのリンクがデフォルトになります) を除いて後述の .Dq link コマンドから使用する必要があります。 リンクは下記の .Dq remove コマンドで削除できます。 .Pp デフォルトのリンク名は .Dq deflink です。 .It close Op lcp|ccp[!] 引数が与えられないと、適切なプロトコル層がダウンし、リンクが閉じられます。 .Dq lcp が指定されると LCP 層がダウンしますが、 .Nm をオフラインにはしません。例えば .Dq slirp のようなものを使用すれば、 .Dq term .Pq 後述 を使用して相手のマシンと会話できます。 .Dq ccp が指定されると適切な圧縮層が閉じられます。 .Dq \&! が使用されると、圧縮層はクローズ状態のままとなります。 使用されない場合には、STOPPED 状態へ再度入り、 相手が更なる CCP 交渉を開始するのを待ちます。 なにが起きようとも、ユーザを .Nm から切り離すことはありませんし、 .Nm を終了させることもありません。 後述の .Dq quit を参照してください。 .It delete[!] Ar dest このコマンドは指定した .Ar dest IP アドレスの経路を削除します。 .Ar dest に .Sq ALL が指定された場合、 現在のインタフェースの経路表の非直接エントリと .Sq スティッキー経路 がすべて削除されます。 .Ar dest に .Sq default が指定された場合、デフォルト経路が削除されます。 .Pp .Ar delete! コマンドが使用された場合 .Po 最後の .Dq \&! に注意 .Pc 、存在しない経路について .Nm は文句を言わなくなります。 .It dial|call Op Ar label 引数なしで使用された場合、このコマンドは .Dq open コマンドと同一です。 .Ar label が指定された場合、最初に .Dq load が実行されます。 .It down Op Ar lcp|ccp 適切な階層をダウンさせますが、 綺麗な方法ではなく、下位層が使用不能になったように見えます。 オープン状態にある有限状態機械でこのコマンドを使用することは、 丁寧ではないとされています。 引数が与えられない場合、すべてのリンクが閉じられます (コンテキストが与えられない場合にはすべてのリンクが終了されます)。 .Sq lcp が指定された場合、 .Em LCP 層は終了されますが、モデムはオフラインに移行せず、 リンクも閉じられません。 .Sq ccp が指定された場合、 関連する圧縮層のみが終了されます。 .It help|? Op Ar command 利用可能なコマンドをリストします。 .Ar command を指定した場合、このコマンドの使用方法を表示します。 .It [data]link Ar name[,name...] command Op Ar args コマンドが影響を与えるリンクを特定したい場合に、このコマンドを 任意の他のコマンドのプレフィックスとして使うことができます。 これはマルチリンクモードで .Dq clone コマンドを使って複数のリンクを作成した後でのみ適用されます。 .Pp .Ar name は存在するリンク名を指定します。 .Ar name がコンマ区切りのリストの場合には、 .Ar command はそれぞれのリンクに対して実行されます。 .Ar name が .Dq * の場合には、 .Ar command はすべてのリンクに対して実行されます。 .It load Op Ar label .Pa ppp.conf ファイルから指定された .Dq label をロードします。 .Dq label が指定されない場合、 .Dq default ラベルが仮定されます。 .It open Op lcp|ccp|ipcp これは .Dq close の反対のコマンドです。 .Dq open コマンドを引数なしで用いることは .Dq dial を引数なしで用いることと同一です。 すなわちすべての閉じられたリンクが、現在の設定を用いて起動されます ( .Dq set autoload コマンドに基づいた自動リンクの中には起動されないものもあります)。 .Pp LCP 層がすでにオープンされているときに .Dq lcp を指定すると、LCP は再度交渉されます。 したがって、種々の LCP オプションを変更したあとで .Dq open lcp コマンドを用いることで、変更を有効にすることができます。 LCP が再度交渉された後、 同意したあらゆる認証が実行されます。 .Pp .Dq ccp 引数が用いられると、関連する圧縮層がオープンされます。 すでにオープンされている場合には、再度交渉されます。 .Pp .Dq ipcp 引数が用いられると、リンクが通常通り起動されます。すでに IPCP が オープンされている場合には、IPCP は再度交渉され、 ネットワークインタフェースが再設定されます。 .Pp このようにして PPP の状態機械を再オープンするのは、 おそらく良い手段ではありません。 接続相手が正しく振る舞わない可能性があるためです。 しかしながら、強制的に CCP もしくは VJ 辞書をリセットする手段としては 便利です。 .It passwd Ar pass すべての .Nm コマンドセットにアクセスするために要求されるパスワードを指定します。 このパスワードは診断ポート ( .Dq set server コマンド参照) に接続するときに必要です。 .Ar pass は .Dq set server コマンドラインで指定します。 .Ar command ログが有効でも、値 .Ar pass はログされず、文字列 .Sq ******** がログされます。 .It quit|bye [all] .Dq quit が制御接続もしくはコマンドファイルから実行されると、 ppp はすべての接続を閉じた後に終了します。その他の場合、 つまりユーザが診断ソケットから接続している場合には、 単にその接続が失われます。 .Pp .Ar all 引数が与えられた場合、 .Nm はコマンドがどこから発行されたかに関わらず、 すべての存在する接続を閉じて終了します。 .It remove|rm このコマンドは与えられたリンクを消去します。 これはマルチリンクモードでのみ有用です。リンクは消去する前に .Dv CLOSED 状態になっていなければなりません。 .It rename|mv Ar name このコマンドは与えられたリンクの名前を .Ar name に変更します。 .Ar name がすでに他のリンクで使用されている場合には、失敗します。 .Pp デフォルトリンクの名前は .Sq deflink です。これを .Sq modem , .Sq cuaa0 , .Sq USR のいずれかに変更すると、ログファイルの可読性が向上するかも知れません。 .It save このオプションは (まだ) 実装されていません。 .It set[up] Ar var value このオプションは次に示す変数の設定のために使用します: .Bl -tag -width XX .It set accmap Ar hex-value ACCMap は非同期制御文字マップ (Asyncronous Control Character Map) を 意味します。 これはいつも相手と交渉され、デフォルト値は 16 進数で 00000000 です。 このプロトコルが必要なのは、 (XON/XOFF などの) 特定の文字を終点間で受渡すことに依存するハードウェアを 使用する場合です。 .Pp XON/XOFF については .Dq set accmap 000a0000 を使用します。 .It set authkey|key Ar value クライアントモードでの PAP または CHAP の交渉で使用される 認証キー (もしくはパスワード) を、指定した値に設定します。 ダイヤルもしくはログインスクリプトの '\\P' シーケンス で使用されるパスワードを指定しますが、 実際のパスワードがログされることを防ぎます。 .Ar command ログが有効な場合、セキュリティの観点から、 .Ar value は .Sq ******** としてログされます。 .It set authname Ar id クライアントモードでの PAP または CHAP の交渉で使用される 認証 ID を設定します。 .Pp PAP もしくは CHAP を enable にして .Fl direct モードで利用すると、 .Ar id は初期認証要求で用いられ、通常はローカルマシン名に設定されます。 .It set autoload Ar max-duration max-load [min-duration min-load] これらの設定はマルチリンクモードでのみ適用され、 デフォルト値はすべて 0 です。 1 つ以上の .Ar demand-dial .Po .Fl auto としても知られる .Pc モードのリンクが存在する場合、 .Nm が最初に tun デバイスからデータを読むときには最初のリンクのみが 有効になっています。 次の .Ar demand-dial リンクは、 .Ar max-duration 秒の間、送出キューに .Ar max-load 以上のパケットが存在した場合にのみ開かれます。 両方のデフォルト値が 0 であるため、 .Ar demand-dial リンクはデフォルトでは 1 つだけオープンされます。 .Pp 複数のリンクが開かれていて、少なくともその内の 1 つが .Ar demand-dial リンクである場合、 .Ar min-duration 秒の間、送出キューに最大 .Ar min-packets 未満のパケットしか存在しなかったときに閉じられます。 .Ar min-duration が 0 の場合には、タイマは無効になります。 デフォルトでは両方の値が 0 であるため、 .Ar demand-dial リンクはバンドルされたアイドルタイマが期限切れになるまで アクティブであり続けます。 .It set callback [none|auth|cbcp|E.164 *|number[,number]...]... 引数が与えられない場合、コールバックは disable になります。 そうでない場合には、 .Nm は与えられたプロトコルでコールバックを要求します (もしくは .Ar direct モードでは受け付けます)。 要求の否定応答が返されると、 .Nm は他に選択肢がなくなるまで別の要求を出します。 選択肢が尽きると .Nm は交渉を終了します。 オプションは下記の通りです (優先度順): .Pp .Bl -tag .It auth コールバック応答側は、認証に基づいてコールバック番号を 決定することが求められます。 .Nm がコールバック応答側である場合、番号は .Pa /etc/ppp/ppp.secret 中の接続先エントリの 5 番目のフィールドで指定されます。 .It cbcp Microsoft コールバック制御プロトコルが用いられます。後述の .Dq set cbcp を参照してください。 .It E.164 *|number[,number]... コールバック要求側が .Ar number を指定します。 .Nm がコールバック応答側である場合、 .Ar number は許可する番号をコンマで区切って並べたリスト、もしくは 任意の番号を許可するという意味の .Dq \&* とします。 .Nm がコールバック要求側である場合、1 つの数字だけを指定します。 .Pp .Dq \&* を用いる場合、このオプションはとても危険なものとなることに 注意してください。 というのは、悪意あるコールバック要求者が、最初の認証なしに 電話すべき番号として任意の (国際通話番号も可能です) 番号を 伝えることができるからです。 .It none 接続相手がコールバックをまったく望まない場合、 .Nm はそのことを受け入れ、接続を終了するのではなく コールバックせずに処理を続けます。 .El .Pp .It set cbcp Op *|number[,number]... Op delay Op retry 引数が与えられない場合、CBCP (Microsofts CallBack Control Protocol) は disable です。言い換えれば .Dq set callback コマンドで CBCP を設定すると .Nm が CBCP フェーズでコールバック要求を行わなくなります。 そうでない場合、 .Nm は与えられた電話番号 .Ar number を使おうとします。 .Pp サーバモード .Pq Fl direct では、 .Dq \&* を使わない限り .Nm はクライアントがこれらの番号の 1 つを使うことを主張します。 .Dq \&* を使った場合には、クライアントが番号を指定するものと想定します。 .Pp クライアントモードでは .Nm は与えられた番号 (そのうち接続相手と合意可能なもの) を使用しようとします。 .Dq \&* が指定された場合には、 .Nm 接続相手が番号を指定するものと想定します。 .It set choked Op Ar timeout これは .Nm がすべての未送出パケットを破棄する前に 送出キュー詰まりを保持する秒数を設定します。 .Ar timeout が 0 以下もしくは .Ar timeout が指定されない場合、デフォルト値の .Em 120 秒 に設定されます。 .Pp 送出キュー詰まりは .Nm がローカルネットワークから特定の数の送出パケットを読み込んだが、 リンク失敗 (接続相手がビジーなど) のためにデータを送れない場合に 発生します。 .Nm はパケットを無限には読み込みません。代りに .Em 20 パケット (マルチリンクモードでは .Em 20 No + .Em nlinks No * .Em 2 パケット) まで読み込み、 .Ar timeout 秒経過するか、1 つ以上のパケットが送られるまで ネットワークインタフェースの読み込みを停止します。 .Pp .Ar timeout 秒が経過すると、すべての未送出パケットは破棄されます。 .It set ctsrts|crtscts on|off ハードウェアフロー制御をセットします。 デフォルトではハードウェアフロー制御は .Ar on です。 .It set deflate Ar out-winsize Op Ar in-winsize DEFLATE アルゴリズムの、 デフォルトの出力ウィンドウサイズと入力ウィンドウサイズを設定します。 .Ar out-winsize および .Ar in-winsize は、 .Em 8 から .Em 15 までの値をとる必要があります。 .Ar in-winsize が指定されると、 .Nm はこのウィンドウサイズの使用を強要し、相手が他の値を示しても受け入れません。 .It set dns Op Ar primary Op Ar secondary .Dq accept dns コマンドで使用される、DNS 上書きを設定します。 詳細については前述の .Dq accept コマンドの記述を参照してください。本コマンドは .Dq enable dns を使用して要求される IP 番号には影響を与えません。 .It set device|line Ar value[,value...] .Nm が使用するデバイスを、指定された .Dq value に設定します。 全シリアルデバイス名は .Pa /dev/ から始まることが仮定されています。 .Dq value が .Pa /dev/ から始まらない場合、エクスクラメーションマーク .Pq Dq \&! から始めるか、 .Dq host:port の形式である必要があります。 .Pp エクスクラメーションマークで始まる場合、 デバイス名の残りはプログラム名として扱われ、 そのデバイスがオープンされるときにそのプログラムが実行されます。 標準入出力およびエラーは .Nm にフィードバックされ、それらが通常デバイスであるかのように読み書きされます。 .Pp .Dq host:port の組が与えられる場合、 .Nm は、指定された .Dq host の指定された .Dq port と接続しようとします。 詳細は上述の .Em PPP オーバ TCP の節を参照してください。 .Pp 複数の .Dq value を指定した場合、 .Nm は成功するか全デバイスについて実行し終るまで、順番にオープンを試みます。 .It set dial Ar chat-script 相手へダイヤルする際に使用されるチャットスクリプトを指定します。 後述の .Dq set login コマンドも参照してください。 チャットスクリプトのフォーマットの詳細については、 .Xr chat 8 と設定ファイルの例を参照してください。 次の特殊な .Sq value をチャットスクリプトに指定可能です: .Bd -unfilled -offset indent .It \\\\\\\\\\\\\\\\c .Sq 送信 文字列の最後の文字として使用した場合、 改行を追加してはならないことを意味します。 .It \\\\\\\\\\\\\\\\d チャットスクリプトがこのシーケンスに出会うと、2 秒待ちます。 .It \\\\\\\\\\\\\\\\p チャットスクリプトがこのシーケンスに出会うと、1/4 秒待ちます。 .It \\\\\\\\\\\\\\\\n 改行文字と置き換えられます。 .It \\\\\\\\\\\\\\\\r 復改文字と置き換えられます。 .It \\\\\\\\\\\\\\\\s 空白文字と置き換えられます。 .It \\\\\\\\\\\\\\\\t タブ文字と置き換えられます。 .It \\\\\\\\\\\\\\\\T 現在の電話番号と置き換えられます (後述の .Dq set phone 参照)。 .It \\\\\\\\\\\\\\\\P 現在の .Ar authkey 値と置き換えられます (前述の .Dq set authkey 参照)。 .It \\\\\\\\\\\\\\\\U 現在の .Ar authname 値と置き換えられます (前述の .Dq set authname 参照)。 .Ed .Pp 2 つのパーザがこれらのエスケープシーケンスを検査することに注意してください。 .Sq チャットのパーザ にエスケープ文字を見せるには、 .Sq コマンドパーザ からエスケープする必要があります。 つまり、2 つのエスケープを使用する必要があります。例えば次のようにします: .Bd -literal -offset indent set dial "... ATDT\\\\T CONNECT" .Ed .Pp チャットスクリプトから外部コマンドを実行することもできます。 そうするためには、 受信待ち文字列または送信文字列の最初の文字をエクスクラメーションマーク .Pq Dq \&! にします。 コマンドが実行されると、標準入力と標準出力がモデムデバイス ( .Dq set device 参照) に向けられ、標準エラー出力が .Nm に読まれて受信待ち文字列もしくは送信文字列に置き換えられます。 .Nm が対話モードで実行されている場合、ファイルデスクリプタ 3 は .Pa /dev/tty に接続されます。 .Pp 例えば (読み易さのために折り返しています); .Bd -literal -offset indent set login "TIMEOUT 5 \\"\\" \\"\\" login:--login: ppp \e word: ppp \\"!sh \\\\\\\\-c \\\\\\"echo \\\\\\\\-n label: >&2\\\\\\"\\" \e \\"!/bin/echo in\\" HELLO" .Ed .Pp は次のチャットシーケンスになります (ダイヤル前の .Sq set log local chat コマンドによる出力): .Bd -literal -offset indent Dial attempt 1 of 1 dial OK! Chat: Expecting: Chat: Sending: Chat: Expecting: login:--login: Chat: Wait for (5): login: Chat: Sending: ppp Chat: Expecting: word: Chat: Wait for (5): word: Chat: Sending: ppp Chat: Expecting: !sh \\-c "echo \\-n label: >&2" Chat: Exec: sh -c "echo -n label: >&2" Chat: Wait for (5): !sh \\-c "echo \\-n label: >&2" --> label: Chat: Exec: /bin/echo in Chat: Sending: Chat: Expecting: HELLO Chat: Wait for (5): HELLO login OK! .Ed .Pp 複数レベルのネストについて、 エスケープ文字の使用方法に (再度) 注意してください。 ここでは、4 つのパーザが動作してます。 1 番目は、オリジナルの行をパーズし、3 つの引数として読みます。 2 番目は、第 3 引数を 11 個の引数として読みます。 ここで、 .Dq \&- 記号がエスケープされていることが重要です。 そうでなければパーザは、 受信待ち-送信-受信待ちのシーケンスとして見てしまいます。 .Dq \&! 文字を見付けると、実行パーザは最初のコマンドを 3 つの引数として読み、 .Xr sh 1 自身が .Fl c 以降の引数を展開します。 我々は出力をモデムに送り返したいので、 1 番目の例では出力をファイルデスクリプタ 2 (stderr) にリダイレクトして .Nm 自身に送信およびログさせ、 2 番目の例では単に stdout に出力して直接モデムに出力させます。 .Pp もちろん全体を、組み込みのものではなく外部の .Dq chat コマンドに実行させることが可能です。 良い代替方法については .Xr chat 8 を参照してください。 .It set enddisc Op label|IP|MAC|magic|psn value このコマンドは、ローカル終点の選択値を設定します。 LCP 交渉の前に設定されると、 .Nm は LCP 終点選択値オプションを使用して、相手に情報を送ります。 次の選択値を設定可能です。 .Bd -unfilled -offset indent .It Li label 現在のラベルが使用されます。 .It Li IP 当方のローカル IP 番号を使用します。 LCP は IPCP より前に交渉されますので、 IPCP 層が後からこの値を変更することが可能です。 その場合、手動でリセットしない限り、終点の選択値は古い値のままとなります。 .It Li MAC 前述の .Ar IP オプションに似ていますが、 ローカル IP 番号に関係する MAC アドレスが使用される点が異なります。 ローカル IP 番号がどのイーサネットインタフェースにも存在しない場合、 本コマンドは失敗します。 .Pp ローカル IP 番号のデフォルトは、 マシンンホスト名がなんであれ、その名前になりますので、通常 .Dq set enddisc mac を .Dq set ifaddr コマンドよりも先に実行します。 .It Li magic 20 桁の乱数が使用されます。 .It Li psn Ar value 指定された .Ar value が使用されます。 .Ar value は、絶対的な公衆スイッチネットワーク番号の先頭に 国コードを付けたものであるべきです。 .Ed .Pp 引数が与えられない場合、終点の選択値はリセットされます。 .It set escape Ar value... このオプションは前述の .Dq set accmap オプションに似ています。 リンクを経由する時に「エスケープ」される文字を指定するために使用します。 .It set filter dial|alive|in|out rule-no permit|deny Ar "[src_addr/width] [dst_addr/width] [proto [src [lt|eq|gt port]] [dst [lt|eq|gt port]] [estab] [syn] [finrst]]" .Nm は 4 つのフィルタセットをサポートします。 .Em alive フィルタは接続を活性状態に保つパケットを指定します - アイドルタイマをリセットします。 .Em dial フィルタは、 .Fl auto モード時に .Nm にダイヤルさせるパケットを指定します。 .Em in フィルタは、マシンに入力可能なパケットを指定します。 .Em out フィルタは、マシンから出力可能なパケットを指定します。 .Pp フィルタリングは、 エイリアスエンジンが行う IP 変更の前に適用されます。 デフォルトでは、全フィルタセットが全パケットの通過を許可します。 ルールは .Ar rule-no に従って順番に処理されます。 各セットに対し 20 までのルールを指定可能です。 指定されるセットにおけるどのルールにもマッチしないパケットは破棄されます。 .Em in と .Em out のフィルタでは、パケットをドロップすることを意味します。 .Em alive フィルタでは、アイドルタイマをリセットしないことを意味します。 .Em dial フィルタではダイアルさせることにはならないことを意味します。 ダイヤルを引き起こさないパケットは、 キューされるのではなく、捨てられることに注意してください。 上述のパケットのフィルタリングの節を参照してください。 .It set hangup Ar chat-script モデムを閉じる前にこれをリセットする時に使用する、 チャットスクリプトを指定します。 通常は不要であるべきですが、 閉じる時に自己を正しくリセットできないデバイスに対して使用できます。 .It set help|? Op Ar command 利用可能な set コマンドのまとめを表示するか、 .Ar command が指定されると、コマンドの使用方法を表示します。 .It set ifaddr Ar [myaddr [hisaddr [netmask [triggeraddr]]]] このコマンドは、IPCP 交渉の間使用される IP アドレスを指定します。 アドレスのフォーマットは次の通りです。 .Pp .Dl a.b.c.d/n .Pp ここで .Ar a.b.c.d は希望する IP アドレスであり、 .Ar n はこのうち何ビットが有効であるかを示します。 .Ar /n が省略された場合、デフォルトの .Ar /32 になります。 ただし IP アドレスが 0.0.0.0 である場合には、マスクのデフォルトは .Ar /0 です。 .Pp .Ar hisaddr に IP 番号の範囲として .Pp .Dl a.b.c.d[-d.e.f.g][,h.i.j.k[-l,m,n,o]]... .Pp のフォーマットを指定できます。例えば: .Pp .Dl set ifaddr 10.0.0.1 10.0.1.2-10.0.1.10,10.0.1.20 .Pp は .Ar 10.0.0.1 のみをローカル IP 番号として交渉しますが、指定された 10 個の IP 番号から 相手に割り当てを行います。 相手がこれらの番号のうちの 1 つを要求し、この番号が未使用な場合には、 .Nm は相手の要求を認めます。 相手がリンクを再確立して前回割り当てていた IP 番号を使用したい場合に有用です (既存の TCP 接続を保存します)。 .Pp 相手が要求した IP 番号が範囲外もしくは使用中の場合、 .Nm は範囲内の未使用 IP 番号をランダムに指示します。 .Pp .Ar triggeraddr が指定された場合、この値が .Ar myaddr の代りに IPCP 交渉で使用されます。 ただし、 .Ar myaddr の範囲のアドレスのみ受け入れられます。 これが有用なのは、相手が .Ar 0.0.0.0 を要求しない限り IP アドレスを割り当てようとしない .Dv PPP 実装と交渉するときです。 .Pp .Fl auto モードでは設定ファイルの .Dq set ifaddr 行を読んだ直後に .Nm がインタフェースを構成することに注意してください。 他のモードではこれらの値は IPCP 交渉で使用され、 IPCP 層がアップするまでこれらのインタフェースは構成されません。 .Pp .Po PAP か CHAP が .Dq enable である場合 .Pc クライアントが自己証明をした後では、 .Ar HISADDR 引数は .Pa ppp.secret ファイルの第 3 引数で上書きされうることに注意してください。 .Em 内向き接続の認証 の節を参照してください。 .Pp どの場合でも、インタフェースが既に構成されている場合には、 .Nm はインタフェースの IP 番号を保存して、 既にバインドされているソケットが正しいままであるようにします。 .It set ccpretry Ar period .It set chapretry Ar period .It set ipcpretry Ar period .It set lcpretry Ar period .It set papretry Ar period これらのコマンドは .Nm が有限状態機械 (Finite State Machine; FSM) に要求パケットを送る前に 待つ秒数を指定します。 .Ar period のデフォルトは、全 FSM において 3 秒です (ほとんどの場合十分です)。 .It set log [local] [+|-] Ns Ar value... このコマンドにより現在のログレベルを修正できます。 詳細はログ機能の節を参照してください。 .It set login chat-script この .Ar chat-script はダイヤルスクリプトを補います。 もし両方が指定された場合、ダイヤルスクリプトの後で、 ログインスクリプトが実行されます。 ダイヤルスクリプト中で使用可能なエスケープシーケンスはここでも使用可能です。 .It set lqrperiod Ar frequency このコマンドは、 .Em LQR または .Em ECHO LQR のパケットが送信される頻度 .Ar frequency を秒で指定します。デフォルトは 30 秒です。 相手に LQR 要求を送りたい場合には、 .Dq enable lqr コマンドもまた使用する必要があります。 .It set mode Ar interactive|auto|ddial|background 指定したリンクにおけるモード .Sq mode を変更できます。通常マルチリンクモードでのみ有用ですが、 単一リンクモードでも使用可能です。 .Pp .Sq direct または .Sq dedicated のリンクを変更することはできません。 .It set mrru Op Ar value このオプションを設定すると、 マルチリンクプロトコルまたは MP としても知られる、 マルチリンク PPP 交渉を有効にします。 MRRU (Maximum Reconstructed Receive Unit) の値にはデフォルトはありません。 引数を指定しないと、マルチリンクモードは無効にされます。 .It set mru Op Ar value デフォルトの MRU (最大受信単位; Maximum Receive Unit) は 1500 です。 この値を増加させた場合、相手は MTU を増加させても *かまいません*。 デフォルトの MRU より減らすことは意味がありません。 なぜなら、 .Em PPP プロトコルでは少なくとも 1500 オクテットのパケットを 受信できなければ *ならない* からです。 引数が指定されないと、1500 が仮定されます。 .It set mtu Op Ar value デフォルトの MTU は 1500 です。 交渉時に、(296 バイト未満でなければ) 相手が望むいかなる MRU および MRRU も受け付け可能です。 MTU が設定されると、 .Nm は .Ar value よりも小さい MRU/MRRU の値を受け付けなくなります。 交渉が完了すると、相手がより大きな MRU/MRRU を要求していたとしても、 インタフェースに対して MTU が割り当てられます。 当方のパケットサイズを制限するのに有用です (よりよくバンド幅を共有できるようになりますが、 ヘッダデータが増えるというコストがかかります)。 .Pp .Ar value を指定しないと、1500 または相手が要求した値が使用されます。 .It set nbns Op Ar x.x.x.x Op Ar y.y.y.y このオプションは、相手の要求によって返される Microsoft NetBIOS ネームサーバの値を設定します。 値を指定しないと、 .Nm はそのような要求を拒否するようになります。 .It set openmode active|passive Op Ar delay デフォルトでは、 .Ar openmode は常に、1 秒の .Ar delay をもって .Ar active となります。 この場合、 .Nm は回線が設定されてから 1 秒が経過したなら いつでも LCP/IPCP/CCP の交渉を開始します。 相手が交渉を開始するのを待ちたい場合は、値 .Dq passive を使用します。 直ちにもしくは 1 秒以上待ってから交渉を開始したい場合、 .Ar delay を秒単位で指定します。 .It set parity odd|even|none|mark 回線のパリティを設定できます。デフォルト値は .Ar none です。 .It set phone Ar telno[|telno]...[:telno[|telno]...]... ダイヤルおよびログインのチャットスクリプトで使用される \\\\T 文字列が 置き換えられる電話番号を指定できます。 複数の電話番号をパイプ (|) もしくはコロン (:) で区切って指定可能です。 パイプの後の番号がダイヤルされるのは、 直前の番号へのダイヤルもしくはログインのスクリプトが失敗した場合のみです。 回線の切断の理由にかかわらず、 コロンで区切られた番号は順番に試行されます。 複数の番号を指定した場合、接続が確立するまで .Nm はこのルールに基づいてダイヤルします。 再試行の最大値は、後述の .Dq set redial で指定します。 .Fl background モードでは各番号は最大 1 回試行されます。 .It set reconnect Ar timeout ntries (CD の喪失もしくは LQR の失敗により) 予想外の回線切断となった場合、 指定した .Ar timeout の後に接続が再確立されます。 回線は最大 .Ar ntries 回、再接続されます。 .Ar ntries のデフォルトは 0 です。 .Ar timeout に .Ar random を指定すると、0 から 30 秒の間の任意時間の停止となります。 .It set redial Ar seconds[.nseconds] [attempts] .Nm に .Ar attempts 回のリダイヤルを指示できます。 1 より大きな数を指定した場合 (前述の .Ar set phone 参照)、 各番号にダイヤルする前に、 .Ar nseconds だけ停止します。 最初の番号に戻ってダイヤル開始する前に .Ar seconds だけ停止します。 .Dq random を .Ar seconds および .Ar nseconds のところで使用でき、0 から 30 秒の間の任意時間の停止となります。 .Pp .Ar attempts が経過した後でもこの遅延は効果があるので、 すぐに手動でダイヤルしても何も起ってないように見えるかもしれません。 すぐにダイヤルする必要がある場合、 .Dq \&! を .Dq open キーワードの直後に付けます。 更なる詳細については、前述の .Dq open の記述を参照してください。 .It set server|socket Ar TcpPort|LocalName|none password Op Ar mask このコマンドは .Nm に指定したソケットもしくは .Sq 診断ポート にてコマンド接続の入力を listen するように指示します。 .Pp 語 .Ar none は .Nm に既に存在するソケットを閉じさせます。 .Pp ローカルドメインソケットを指定したい場合、 .Ar LocalName に絶対ファイル名を指定します。そうしないと、TCP ポートの名前もしくは番号 であると解釈されます。 ローカルドメインソケットに使用される 8 進 umask を指定可能です。 .Sq 0 から始まる 4 桁 8 進数で指定します。 umask の詳細については .Xr umask 2 を参照してください。TCP ポート名がどのように変換されるかについては .Xr services 5 を参照してください。 .Pp このソケットにクライアントが接続するときに使用されねばならないパスワードも 指定可能です ( 前述の .Dq passwd コマンドを使用します)。 パスワードが空文字列として指定される場合、 クライアントが接続するときにパスワードを必要とされません。 .Pp ローカルドメインソケットが指定される場合、ソケット名中の最初の .Dq %d シーケンスは現在のインタフェースユニット番号で置換されます。 複数接続のために同一のプロファイルを使用したい場合に便利です。 .Pp 同様の方法で TCP ソケットの前に .Dq + 文字を付けることができます。 この場合、現在のインタフェースユニット番号が、ポート番号に加算されます。 .Pp .Nm をサーバソケットと共に使用する場合、通信機構として .Xr pppctl 8 コマンドを使用することが好ましいです。 現在 .Xr telnet 1 も使用可能ですが、将来リンク暗号化が実装されるかもしれませんので、 .Xr telnet 1 に依存しないようにしてください。 .It set speed Ar value シリアルデバイスの速度を指定します。 .It set stopped Ar [LCPseconds [CCPseconds]] このオプションが指定されると、 指定した FSM (有限状態機械; Finite State Machine) が停止状態になってから .Dq seconds で指定した秒数だけ停止したのち、 .Nm はタイムアウトします。 このオプションは、 相手が終了要求を送り我々が終了確認応答を送ったにもかかわらず 実際には接続を閉じない場合に、有用かもしれません。また、 .Dq set openmode passive を使用した場合に相手が指定時間内に Configure Request を送らないことを タイムアウト検出する場合には、便利かもしれません。 .Dq set log +lcp +ccp を使用すると、 .Nm は適切な状態遷移をログします。 .Pp デフォルト値は 0 であり、 停止状態による .Nm のタイムアウトは発生しません。 .Pp この値は openmode の遅延 (上述の .Dq set openmode 参照) より小さくなってはなりません。 .It set timeout Ar idleseconds このコマンドはアイドルタイマの値を指定します。 更なる詳細については .Dq アイドルタイマの設定 というタイトルの節を参照してください。 .It set vj slotcomp on|off このコマンドは .Nm に VJ スロット圧縮を交渉するか否かを指示します。 デフォルトではスロット圧縮は .Ar on です。 .It set vj slots Ar nslots このコマンドは最初の .Ar slots 番号を指定します。 .Nm は VJ 圧縮が enable されている時には、 これを使用して相手と交渉をします (前述の .Sq enable コマンドを参照してください)。 デフォルト値は 16 です。 .Ar nslots は .Ar 4 以上 .Ar 16 以下の値です。 .El .Pp .It shell|! Op Ar command .Ar command が指定されない場合、 .Dv SHELL 環境変数で指定されるシェルが起動されます。 そうでなければ指定された .Ar command が実行されます。 語の置換は、前述の .Dq !bg コマンドと同様の方法で行われます。 .Pp 文字 ! を使用する場合、コマンドとの間に空白が必要です。 このコマンドはフォアグラウンドで実行されることに注意してください - .Nm はプロセスが終了するまでは実行を続けません。 バックグラウンドでコマンド処理を行いたい場合には、 .Dv bg コマンドを使用してください。 .It show Ar var このコマンドを使用して、次の内容を確認できます: .Bl -tag -width 20 .It show bundle 現在のバンドル設定を表示します。 .It show ccp 現在の CCP 圧縮統計を表示します。 .It show compress 現在の VJ 圧縮統計を表示します。 .It show escape 現在のエスケープ文字を表示します。 .It show filter Op Ar name 指定したフィルタの現在のルールをリストします。 .Ar name を指定しないと、全フィルタが表示されます。 .It show hdlc 現在の HDLC 統計を表示します。 .It show help|? 利用可能な show コマンドのまとめを表示します。 .It show ipcp 現在の IPCP 統計を表示します。 .It show lcp 現在の LCP 統計を表示します。 .It show [data]link 高レベルリンク情報を表示します。 .It show links 利用可能な論理リンクのリストを表示します。 .It show log 現在のログ値を表示します。 .It show mem 現在のメモリ統計を表示します。 .It show modem 現在の下位レベルリンク情報を表示します。 .It show proto 現在のプロトコルの総計を表示します。 .It show route 現在の経路表を表示します。 .It show stopped 現在の stopped タイムアウト値を表示します。 .It show timer アクティブアラームタイマを表示します。 .It show version .Nm の現在のバージョン番号を表示します。 .El .Pp .It term 端末モードに移行します。 キーボードからタイプした文字はモデムに送られます。 モデムから読んだ文字はスクリーンに表示されます。 モデムの相手側に .Nm の相手が認識された時には、 .Nm は自動的にパケットモードを有効にし、コマンドモードに戻ります。 .El .Pp .Sh 更に詳細について .Bl -bullet .It 設定ファイルの例を読んでください。良い情報源です。 .It 何が利用できるかについては、 .Dq help , .Dq show ? , .Dq alias ? , .Dq set ? , .Dq set ? コマンドを使って、オンライン情報を取得してください。 .It 次の URL に有用な情報があります: .Bl -bullet -compact .It http://www.FreeBSD.org/FAQ/userppp.html .It http://www.FreeBSD.org/handbook/userppp.html .El .Pp .El .Pp .Sh 関連ファイル .Nm は、4 つのファイル .Pa ppp.conf , .Pa ppp.linkup , .Pa ppp.linkdown , .Pa ppp.secret を参照します。 これらのファイルは .Pa /etc/ppp に置かれます。 .Bl -tag -width XX .It Pa /etc/ppp/ppp.conf システムのデフォルト設定ファイル。 .It Pa /etc/ppp/ppp.secret 各システム用の認証設定ファイル。 .It Pa /etc/ppp/ppp.linkup .Nm がネットワークレベルの接続を確立した時に実行されるファイル。 .It Pa /etc/ppp/ppp.linkdown .Nm がネットワークレベルの接続を閉じる時にチェックするファイル。 .It Pa /var/log/ppp.log ログとデバッグ情報のファイル。このファイル名は .Pa /etc/syslogd.conf にて指定されます。詳細は .Xr syslog.conf 5 を参照してください。 .It Pa /var/spool/lock/LCK..* tty ポートをロックするためのファイル。詳細は .Xr uucplock 3 を参照してください。 .It Pa /var/run/tunN.pid tunN デバイスに接続されている .Nm プログラムのプロセス ID (pid) 。 ここで .Sq N はデバイスの番号です。 .It Pa /var/run/ttyXX.if このポートで使われている tun インタフェース。 このファイルも .Fl background , .Fl auto , .Fl ddial のいずれかのモードの時のみ作成されます。 .It Pa /etc/services サービス名でポート番号が指定されている場合に、ポート番号を取得します。 .It Pa /var/run/ppp-authname-class-value マルチリンクモードでは、 相手の認証名称 .Pq Sq authname と相手の終点選択クラス .Pq Sq class と相手の終点選択値 .Pq Sq value を使用して、ローカルドメインソケットが生成されます。 終点選択値はバイナリ値であってもかまわないため、 実際のファイル名を判定するために 16 進数に変換されます。 .Pp このソケットは、別の .Nm のインスタンスとリンクを受け渡しを行うために使用します。 .El .Pp .Sh 関連項目 .Xr at 1 , .Xr ftp 1 , .Xr gzip 1 , .Xr hostname 1 , .Xr login 1 , .Xr tcpdump 1 , .Xr telnet 1 , .Xr syslog 3 , .Xr uucplock 3 , .Xr crontab 5 , .Xr group 5 , .Xr passwd 5 , .Xr resolv.conf 5 , .Xr syslog.conf 5 , .Xr adduser 8 , .Xr chat 8 , .Xr getty 8 , .Xr inetd 8 , .Xr init 8 , .Xr named 8 , .Xr ping 8 , .Xr pppctl 8 , .Xr pppd 8 , .Xr route 8 , .Xr syslogd 8 , .Xr traceroute 8 , .Xr vipw 8 .Sh 歴史 元のプログラムは Toshiharu OHNO (tony-o@iij.ad.jp) が作成し、 FreeBSD-2.0.5 に Atsushi Murai (amurai@spec.co.jp) が提出しました。 .Pp 1997 年中に本質的に Brian Somers (brian@Awfulhak.org) が修正をし、 11 月に OpenBSD に移植されました (2.2-RELEASE の直後です)。 .Pp 1998 年初頭にマルチリンク ppp サポートが追加されたときに、 ほとんどのコードを Brian Somers が書き直しました。 diff --git a/ja/man/man8/sendmail.8 b/ja/man/man8/sendmail.8 index bcada3cbe3..0e798c79ec 100644 --- a/ja/man/man8/sendmail.8 +++ b/ja/man/man8/sendmail.8 @@ -1,562 +1,562 @@ .\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. .\" Copyright (c) 1983, 1997 Eric P. Allman. All rights reserved. .\" Copyright (c) 1988, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" By using this file, you agree to the terms and conditions set .\" forth in the LICENSE file which can be found at the top level of .\" the sendmail distribution. .\" .\" .\" @(#)sendmail.8 8.19 (Berkeley) 5/19/98 .\" jpman %Id: sendmail.8,v 1.2 1997/06/05 01:31:44 yugawa Stab % .\" .Dd May 19, 1998 .Dt SENDMAIL 8 .Os BSD 4 .Sh 名称 .Nm sendmail .Nd 電子メール配送デーモン .Sh 書式 .Nm sendmail .Op Ar flags .Op Ar address ... .Nm newaliases .Nm mailq .Op Fl v .Sh 解説 .Nm sendmail はメッセージを他の人に送ります。必要ならばネットワークを 通してメッセージを正しい場所に転送します。 .Pp ただし、 .Nm sendmail はユーザインタフェースとして使われることは考慮さ れていません。ユーザにとって使いやすいフロントエンドは別のプログラムで 提供されます。 .Nm sendmail は、あらかじめメールとして整形されたメッセージ を配送するためだけに使われます。 .Pp .Nm sendmail を引数を指定せずに起動すると、 .Nm sendmail は標準入力を EOF (エンド・オブ・ ファイル)か `.'だけを含む行まで読み込み、メッセージのなかに記述されている アドレスにメッセージのコピーを送ります。アドレスの文法や内容にもとづいて 経路に使用するネットワークを決定します。 .Pp ローカルアドレスは、ファイルの中を検索して適当なエイリアスを行います。 先頭にバックスラッシュ `\\' のついたアドレスについては、エイリアスは 行なわれません。 通常、送り手はエイリアスの対象に含まれません。つまり、もし `john' が `group' にメールを送って、 `john' が `group' に 含まれている場合、送ったメッセージは `john' には送られません。 .Ss パラメータ .Bl -tag -width Fl .It Fl B Ns Ar type ボディのタイプを .Ar type に設定します。現在有効なのは、 .Li `7BIT' か .Li `8BITMIME' です。 .It Fl ba .Tn ARPANET モードに移行します。すべての入力行は CR-LF で終わらなければならず、 すべてのメッセージの末尾には CR-LF がつきます。また、``From:'' と ``Sender:'' フィールドは送り手の名前としてチェックされます。 .It Fl bd -デーモンモードで実行します。バークレー +デーモンモードで実行します。Berkley .Tn IPC が必要です。 .Nm sendmail は .Xr fork 2 を行い、バックグラウンドで動作し、ソケット番号 25 で .Tn SMTP コネクションを 待ちます。通常このモードは、 .Pa /etc/rc から実行されています。 .It Fl bD フォアグラウンドで動作する以外は .Fl bd と同じです。 .It Fl bh 現在のホストの状況のデータベースを表示します。 .It Fl bH 現在のホストの状況のデータベースをパージします。 .It Fl bi エイリアスデータベースを初期化します。 .It Fl bm 普通にメールを配送します(デフォルト)。 .It Fl bp メールキューのリストを表示します。 .It Fl bs 標準入出力で .Tn RFC821 にもとづいた .Tn SMTP プロトコルを使います。この フラグは、 .Fl ba フラグのうち .Tn SMTP 互換の全ての操作を含みます。 .It Fl bt アドレスのテストモードで起動します。このモードは対話 モードでアドレスを入力し、処理の過程を表示します。設定ファイル をデバッグするのに使います。 .It Fl bv 名前のチェックだけを行います。メッセージの収集や配送は行い ません。ベリファイモードは、ユーザやメーリングリストが有効かどうかを確認する ために使います。 .It Fl C Ns Ar file 別の設定ファイルを使います。 .Nm sendmail は、別の設定ファイル を使用する場合は root として実行することはできません。 .It Fl d Ns Ar X デバッグ値を .Ar X に設定します。 .ne 1i .It Fl F Ns Ar fullname 送り手のフルネームを設定します。 .It Fl f Ns Ar name ``from'' に入る名前(つまり、送り手の名前です)を設定します。 .Fl f は、``trusted''なユーザ(普通は .Em root , .Em daemon , .Em network です)が使うか、 送り手が自分自身の名前を指定して使う場合のみ指定することができます。 .It Fl h Ns Ar N ホップカウントを .Ar N に設定します。ホップカウントは、 メールが処理されるたびに増えていきます。ホップカウントがリミットになった とき、メールは「エイリアスがループしている」という旨のエラーメッセージと いっしょに送り返されます。 もしこのフラグが指定されなければ、メッセージのなかの ``Received:'' 行がカウント されます。 .It Fl i 入力されるメッセージ中の `.' だけを含む行を無視します。 このフラグは、データをファイルから読み込むような場合に使用する必要があります。 .It Fl N Ar dsn 配送状況の通知条件を .Ar dsn に設定します。 .Ar dsn には、 .Ql never (何も通知しない)または、コンマで区切った、 .Ql failure (配送が失敗した場合に通知する) .Ql delay (配送が遅れた場合に通知する) .Ql success (配送が正常に行われた場合に通知する) の組み合わせを指定する事ができます。 .It Fl n エイリアスを行いません。 .It Fl O Ar option Ns = Ns Em value オプション .Ar option を、指定した .Em value に設定します。この形式では長いオプション名が使用されます。 詳しくは後に記述します。 .It Fl o Ns Ar x Em value オプション .Ar x を、指定した .Em value に設定します。 この形式では、一文字のオプション名しか使用できません。 短いオプション名についてはこのマニュアルには記述されていません。 詳しくは、 .%T "Sendmail Installation and Operation Guide" を参照して下さい。 .It Fl p Ns Ar protocol メッセージを受け取るのに利用するプロトコル名を設定します。 設定できるのは、 ``UUCP'' のようなプロトコル名だけかプロトコル+ホスト名、たとえば ``UUCP:ucbvax'' などです。 .It Fl q Ns Bq Ar time キューのなかにあるメッセージを処理する間隔を設定します。 .Ar time を省略した場合は、キューの内容を一度だけしか処理しません。 .Ar time は、 .Ql s (秒)、 .Ql m (分)、 .Ql h (時間)、 .Ql d (日)、 .Ql w (週)の単位を付けた数字で指定します。 たとえば、 .Ql -q1h30m や .Ql -q90m は、タイムアウトを 1 時間 30 分に設定します。 .Ar time が指定されると、 .Nm sendmail はデーモンとしてバックグラウンドで 実行されます。 デーモンとして実行させる際には、同時にオプション .Fl bd を つけておくほうが安全です。 .It Fl qI Ns Ar substr キュー ID の文字列に .Ar substr が含まれるジョブのみを処理します。 .It Fl qR Ns Ar substr 受信者のリストの文字列に .Ar substr が含まれるジョブのみを処理します。 .It Fl qS Ns Ar substr 送信者の文字列に .Ar substr が含まれるジョブのみを処理します。 .It Fl R Ar return メッセージがバウンスした時に返送されるメッセージの量を設定します。 .Ar return パラメータには、メッセージ全体を返送する場合は .Ql full を、ヘッダのみを返送する場合は .Ql hdrs を指定します。 .It Fl r Ns Ar name .Fl f フラグと同じですが、古い形式です。 .It Fl t 受信者をメッセージから読み取ります。To:, Cc:, Bcc: フィールドが受信者 のアドレスとして読み込まれます。Bcc: フィールドはメッセージの転送前に 削除されます。 .It Fl U 最初の(ユーザからの)発送である事を示します。 このフラグは、 .Nm Mail や .Nm exmh の様なユーザエージェントから呼び出す場合は .Em 必ず 指定する必要があり、 .Nm rmail 等のネットワーク配送エージェントから呼び出す場合は、 .Em 絶対に 指定してはいけません。 .It Fl V Ar envid オリジナルのエンベロープ ID を設定します。 これは、DSN をサポートするサーバ間では SMTP 上を伝達し、 DSN に従ったエラーメッセージの中で返送されます。 .It Fl v 詳細モードに移行します。展開されるエイリアスなどが報告されます。 .It Fl X Ar logfile 指定された .Ar logfile に、メーラに出たり入ったり するすべてメッセージに関する情報を記録します。メーラをデバッグする際の 最後の手段としてのみ使ってください。非常に大量の情報があっという間に記録 されます。 .El .Ss オプション .Nm sendmail には、設定することができる多くの処理オプションがあります。 通常、これらのオプションはシステム管理者のみが使います。 オプションは、コマンドラインから .Fl o フラグを使って(短いオプション名で)指定したり、 .Fl O フラグを使って(長いオプション名で)指定したり、 設定ファイルから指定することができます。ここに記述して いるのは部分的なもので、コマンド行から指定する場合に便利な物だけを、 長いオプション名で示しています。完全なリスト(と詳細)は、 .%T "Sendmail Installation and Operation Guide" を参照してください。 オプションには以下の物があります。 .Bl -tag -width Fl .It Li AliasFile= Ns Ar file 別のエイリアスファイルを使います。 .It Li HoldExpensive 接続するのに時間がかかるホストと接続するときは、 すぐに接続せず、リクエストはキューに入れられます。 .It Li CheckpointInterval= Ns Ar N .Nm sendmail が、 .Ar N 個の配送に成功するたびにキューファイルに チェックポイントを設定します(デフォルトは 10 個です)。これによって、 システムのクラッシュによって長いメーリングリストの配送が中断 されたときでも、再開時に同じ人に重複して配送されることを防ぎます。 .ne 1i .It Li DeliveryMode= Ns Ar x 配送モードを .Ar x に設定します。配送モードには .Ql i 対話的(同期的)配送モード、 .Ql b バックグラウンド(非同期的)配送モード、 .Ql q キューモード(実際の配送は、キューが実行されるときに行われる)、 .Ql d 延期モード(データベースの検索(特に DNS や NIS )が行われない以外は .Ql q と同じ)があります。 .It Li ErrorMode= Ns Ar x エラー処理をモード .Ar x に設定します。 .Ql m はエラーメッセージを送り返します。 .Ql w はエラーメッセージを送り手の端末に書き出します (送り手がログインしていなければ、メールを返します)。 .Ql p は、エラーメッセージを端末に表示します(デフォルト)。 .Ql q は、エラーメッセージを捨てます(exit コードだけを返します)。 .Ql e は、BerkNet 用に特別処理をします。 もし、モード .Ql m や .Ql w を使っている場合に、エラーとなったメッセージが エラーメールとして送り返されず、送り手が .Nm sendmail を実行している マシン上のユーザならば、 メッセージのコピーは送り手のホームディレクトリにある .Pa dead.letter に追加されます。 .It Li SaveFromLine メッセージのはじめに .Tn UNIX Ns \-style From 行を残します。 .It Li MaxHopCount= Ar N メールがループしていると判断されない、最大のホップ数を 指定します。 .It Li IgnoreDots `.' だけを含む行をメッセージの終わりとして解釈しません。 .It Li SendMimeErrors エラーメッセージをMIMEフォーマットで送り返します。 設定されていない場合は、DSN (Delivery Status Notification: 配送状況通知) SMTP 拡張は無効になります。 .It Li ConnectionCacheTimeout= Ns Ar timeout コネクションキャッシュの .Ar timeout を設定します。 .It Li ConnectionCacheSize= Ns Ar N コネクションキャッシュのサイズを .Ar N に設定します。 .It Li LogLevel= Ns Ar n ログレベルを .Ar n にします。 .It Li MeToo エイリアスに自分自身が含まれている場合、``me''(送り手自身)にも送ります。 .It Li CheckAliases .Xr newaliases 1 コマンドの実行の際、 エイリアスの右側の項目(エイリアスの値)を有効性をチェックします。 .It Li OldStyleHeaders もしオプションが設定されていれば、メッセージが古いスタイルのヘッダ を持つことがあることを意味します。 このオプションが設定されていなければ、このメッセージが新しい スタイルを持っていることが保証されます(2 つのアドレスの間はスペースのかわり にコンマで区切られます)。このオプションが設定されていると、大抵の場合、 ヘッダのフォーマットを正しく決定するためのアルゴリズムが用いられます。 .It Li QueueDirectory= Ns Ar queuedir キューメッセージを保存するディレクトリを選択します。 .It Li StatusFile= Ns Ar file 指定した名前のファイルに統計情報をセーブします。 .It Li Timeout.queuereturn= Ns Ar time キューのなかの配送されなかったメッセージのタイムアウト時間を設定します。 この時間内に(ホストのダウンなどにより)配送が行われなかったときには、 失敗した旨のメッセージが送り返されます。デフォルトは 5 日です。 .It Li UserDatabaseSpec= Ns Ar userdatabase このオプションが設定されると、情報を送る際にユーザデータ ベースに対する問い合わせが行われます。 この方法をエイリアス機構の補助として使用する事ができます。ただし、 エイリアスはそのホストローカルでのみ有効なので、データベースが意図的に 分散されている場合は使用できません。 .Nm sendmail が .Dv USERDB 付きでコンパイルされていなければ使うことはできません。 .It Li ForkEachJob キューを処理する間、 .Xr fork 2 を行います。メモリが少ないマシン では便利です。 .It Li SevenBitInput 到着するメッセージを 7 ビットにします (8 ビット目は落します)。 .It Li EightBitMode= Ns Ar mode 8 ビットの入力を 7 ビットの宛先へ送る場合の処理方法を .Ar mode に設定します。 処理方法には、 .Li m (mime 化) 7 ビット MIME 形式へ変換、 .Li p (パス) 8 ビットのまま配送(プロトコルには違反します)、 .Li s (厳密) メッセージをバウンス、 があります。 .It Li MinQueueAge= Ns Ar timeout 配送の試行の間、ジョブがキューに蓄積される時間を設定します。 .It Li DefaultCharSet= Ns Ar charset 特に指定されていない場合に、8 ビットのデータである事を示す ラベルとして使用されるデフォルトのキャラクタを設定します。 .It Li DialDelay= Ns Ar sleeptime コネクションの確立が失敗した場合に、再試行までに .Ar sleeptime だけスリープします。オンデマンドでダイアル接続するサイトでの使用に便利です。 .It Li NoRecipientAction= Ns Ar action 受信者ヘッダ (To: Cc: あるいは Bcc:) がない場合の動作を .Ar action に設定します。 .Li none メッセージを変更しない、 .Li add-to To: ヘッダにエンベロープで指定された受信者を加える、 .Li add-apparrently-to Apparrently-To: ヘッダにエンベロープで指定された受信者を加える、 .Li add-bcc 空の Bcc: ヘッダを加える、 .Li add-to-undisclosed .Ql "To: undisclosed-recipients:;" というヘッダを加える、という動作が指定できます。 .It Li MaxDaemonChildren= Ns Ar N 待ち受け SMTP デーモンが同時に動作できる子プロセスの最大数を .Ar N に設定します。 .It Li ConnectionRateThrottle= Ns Ar N SMTP ポートへの 1 秒当りの最大コネクション数を .Ar N に設定します。 .El .Pp エイリアスのなかで最初の文字が `|' で始まるものは、メールの内容をパイプで コマンドに送るものと解釈されます。引数などをつけるために空白文字が 必要な場合はクォートする (" でくくる)必要があります。以下に、例を示します: .Pp .Bd -literal -offset indent -compact msgs: "|/usr/bin/msgs -s" .Ed .Pp エイリアスには、 .Dq :include: Ns Ar filename という文法もあります。 .Nm sendmail は、 メールの受け手のエイリアスとして、指定されたファイルを読みます。 以下に、例を示します: .Pp .Bd -literal -offset indent -compact poets: ":include:/usr/local/lib/poets.list" .Ed .Pp 上記の例の場合は、 .Pa /usr/local/lib/poets.list を読み、`poets' のグループの ためのアドレスリストを作ります。 .Pp .Nm sendmail は、以下に示すような終了コードを返します。これらの コードは、 .Aq Pa sysexits.h に定義されています。 .Bl -tag -width EX_UNAVAILABLE -compact -offset indent .It Dv EX_OK すべてのアドレスについて完全に成功しました。 .It Dv EX_NOUSER ユーザ名が認識できません。 .It Dv EX_UNAVAILABLE 処理に必要なリソースを得ることができません。 .It Dv EX_SYNTAX アドレスに文法的な間違いがあります。 .It Dv EX_SOFTWARE 引数が間違っている等の、内部的なエラーです。 .It Dv EX_OSERR .Dq cannot fork のような、一時的な OS エラーです。 .It Dv EX_NOHOST ホスト名が認識できません。 .It Dv EX_TEMPFAIL メッセージはすぐには送られませんでしたが、 キューには入れられました。 .El .Pp .Nm newaliases というコマンドで実行されると、 .Nm sendmail はエイリアス データベースを再構築します。 .Nm mailq というコマンドで実行されると、 .Nm sendmail はメールキューの内容を表示します。 .Sh 関連ファイル .Pa /etc/sendmail.cf とデーモンプロセス ID ファイルを除き、以下のファイルのパスはすべて .Pa /etc/sendmail.cf 内部で決められています。以下は一例に過ぎません。 .Pp .Bl -tag -width /usr/lib/sendmail.fc -compact .It Pa /etc/aliases エイリアス名の生データ .It Pa /etc/aliases.db エイリアス名のデータベース .It Pa /etc/sendmail.cf 設定ファイル .It Pa /usr/share/misc/sendmail.hf ヘルプファイル .It Pa /var/log/sendmail.st 統計情報ファイル .It Pa /var/spool/mqueue/* テンポラリファイル .El .Sh 関連項目 .Xr mail 1 , .Xr syslog 3 , .Xr aliases 5 , .Xr mailaddr 7 , .Xr mail.local 8 , .Xr rc 8 , .Xr rmail 8 ; .Pp DARPA Internet Request For Comments .%T RFC819 , .%T RFC821 , .%T RFC822 . .Rs .%T "Sendmail \- An Internetwork Mail Router" .%V SMM .%N \&No. 9 .Re .Rs .%T "Sendmail Installation and Operation Guide" .%V SMM .%N \&No. 8 .Re .Sh 歴史 .Nm コマンドは .Bx 4.2 から登場しました。 diff --git a/ja/man/man8/swapon.8 b/ja/man/man8/swapon.8 index 357e0e84ec..e0106c8c9d 100644 --- a/ja/man/man8/swapon.8 +++ b/ja/man/man8/swapon.8 @@ -1,93 +1,93 @@ .\" Copyright (c) 1980, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)swapon.8 8.1 (Berkeley) 6/5/93 .\" %Id: swapon.8,v 1.10 1998/08/03 06:35:01 charnier Exp % .\" jpman %Id: swapon.8,v 1.2 1997/05/03 13:45:14 horikawa Stab % .\" .Dd June 5, 1993 .Dt SWAPON 8 .Os BSD 4 .Sh 名称 .Nm swapon .Nd ページングやスワッピングに使用する追加デバイスを指定する .Sh 書式 .Nm swapon .Fl a .Nm swapon .Ar special_file ... .Sh 解説 .Nm は、ページングやスワッピングを行うための追加デバイス指定にて使用します。 システムは、ただ一つのデバイス上にページングやスワッピングして立ち上がるので、 起動時にはただ一つのディスクを要求します。 通常 .Nm は、システムのマルチユーザモードの初期化ファイル .Pa /etc/rc から起動され、全てのスワップデバイスを有効にし、 ページングとスワッピング動作を複数デバイスにインタリーブします。 .Pp 通常は、最初の書式を使用します: .Bl -tag -width indent .It Fl a .Pa /etc/fstab で、``noauto'' オプションが設定されていない、 ``sw'' と指定されているすべてのスワップデバイスを使用可能にします。 .El .Pp 二番目の書式は、システムスワップコンフィギュレーションテーブルに与えるように、 個々のブロックデバイスを指定します。 これにより、システムは指定されたデバイスのみをスワップ空間として利用します。 .Pp .Sh 関連項目 .Xr swapon 2 , .Xr fstab 5 , .Xr init 8 , -.Xr pstat.8 , +.Xr pstat 8 , .Xr rc 8 , .Xr vnconfig 8 .Sh 関連ファイル .Bl -tag -width /dev/[ru][pk]?b -compact .It Pa /dev/[ru][pk]?b 標準のページングデバイス .It Pa /etc/fstab ascii 形式のファイルシステム記述テーブル .El .Sh バグ デバイスへのページングとスワッピングを停止する方法はありません。 ですから、 システム動作中にデバイスのマウントを解除して使用することは不可能です。 .Sh 歴史 .Nm コマンドは .Bx 4.0 から登場しました。 diff --git a/ja_JP.eucJP/man/man1/cpio.1 b/ja_JP.eucJP/man/man1/cpio.1 index 1fb6821fb4..d563c9c0f3 100644 --- a/ja_JP.eucJP/man/man1/cpio.1 +++ b/ja_JP.eucJP/man/man1/cpio.1 @@ -1,361 +1,361 @@ .TH CPIO 1L \" -*- nroff -*- .\" jpman %Id: cpio.1,v 1.2 1997/05/22 04:01:20 bobson Stab % .SH 名称 cpio \- アーカイブファイルへのファイルのコピーや、アーカイブファイルからファイルへのコピーをおこなう .SH 書式 .B cpio {\-o|\-\-create} [\-0acvABLV] [\-C bytes] [\-H format] [\-M message] [\-O [[user@]host:]archive] [\-F [[user@]host:]archive] [\-\-file=[[user@]host:]archive] [\-\-format=format] [\-\-message=message] [\-\-null] [\-\-reset-access-time] [\-\-verbose] [\-\-dot] [\-\-append] [\-\-block-size=blocks] [\-\-dereference] [\-\-io-size=bytes] [\-\-quiet] [\-\-force\-local] [\-\-help] [\-\-version] < name-list [> archive] .B cpio {\-i|\-\-extract} [\-bcdfmnrtsuvBSV] [\-C bytes] [\-E file] [\-H format] [\-M message] [\-R [user][:.][group]] [\-I [[user@]host:]archive] [\-F [[user@]host:]archive] [\-\-file=[[user@]host:]archive] [\-\-make-directories] [\-\-nonmatching] [\-\-preserve-modification-time] [\-\-numeric-uid-gid] [\-\-rename] [\-\-list] [\-\-swap-bytes] [\-\-swap] [\-\-dot] [\-\-unconditional] [\-\-verbose] [\-\-block-size=blocks] [\-\-swap-halfwords] [\-\-io-size=bytes] [\-\-pattern-file=file] [\-\-format=format] [\-\-owner=[user][:.][group]] [\-\-no-preserve-owner] [\-\-message=message] [\-\-force\-local] [\-\-no\-absolute\-filenames] [\-\-sparse] [\-\-only\-verify\-crc] [\-\-quiet] [\-\-help] [\-\-version] [pattern...] [< archive] .B cpio {\-p|\-\-pass-through} [\-0adlmuvLV] [\-R [user][:.][group]] [\-\-null] [\-\-reset-access-time] [\-\-make-directories] [\-\-link] [\-\-quiet] [\-\-preserve-modification-time] [\-\-unconditional] [\-\-verbose] [\-\-dot] [\-\-dereference] [\-\-owner=[user][:.][group]] [\-\-no-preserve-owner] [\-\-sparse] [\-\-help] [\-\-version] destination-directory < name-list .SH 解説 このマニュアルは、GNU 版の .BR cpio について説明します。 .B cpio は、cpio 形式もしくは tar 形式のアーカイブファイルに格納されたファイルを 取り出したり、その逆を行なったりします。アーカイブファイルとは、格納される ファイルそのものに加え、それら個々のファイルについてのファイル名や所有者、 タイムスタンプ、アクセス権限のような情報を含むようなファイルです。 アーカイブファイルは、ディスク上のファイルでも、 磁気テープ上に格納してあるファイルでも、もしくはパイプであっても構いません。 .B cpio は、3つの操作モードを持っています。 .PP コピーアウトモードでは、 .B cpio はファイルをアーカイブファイルにコピーします。cpio は、標準入力から ファイル名のリストを1行ずつ読み込み、標準出力にそのファイルのアーカイブを 書き出します。ファイルリストの作成には、 .B find コマンドが多く使われます。 .B find コマンドでは、\-d オプションを付加して、ディレクトリの属性によって 読み込み不可であったり、検索が出来なかったりする問題を最小限に抑えるように して下さい。 .PP コピーインモードでは、 .B cpio はファイルをアーカイブファイルからファイルを(取り出して)コピーしたり、 アーカイブの内容のリストを表示したりします。 cpioは、アーカイブを標準入力から読み込みます。オプションでない コマンドラインの引数は、すべてシェルによって展開される文字列として 解釈されます。これにより、アーカイブ内のファイル名が、この文字列によって 指定されるパターンにマッチするファイルのみを展開することができます。 また、シェルでの解釈とは違い、ファイル名の先頭に`.'を含むファイル名は、 取り出すファイルとして指定したパターンの最初にワイルドカードを含む場合、 パターンが一致します。また、ファイル名に `/'を含むファイル名も ワイルドカードによって一致します。パターンが指定されない場合には、 全てのファイルが展開対象となります。 .PP コピーパスモードでは、 .B cpio はファイルをあるディレクトリから別のディレクトリにコピーします。実際には、 アーカイブファイルを用いないで、コピーアウトモードとコピーインモードを 組み合わせて実行するような形になります。cpio は、コピーするファイルリストを 標準入力から読み込みます。これらのファイルのコピー先のディレクトリについては、 オプション以外の引数で与えられます。 .PP .B cpio は、 binary, old ASCII, new ASCII, crc, HPUX binary, HPUX old ASCII, old tar, POSIX.1 tar の各形式のアーカイブフォーマットをサポートします。 binary フォーマットは、異なるマシンアーキテクチャ間では互換性のない方法で、 ファイルの情報をエンコードするので、ほとんど使われません (つまり、binary フォーマットは、異なるマシンアーキテクチャ間で、 互換性のないアーカイブを生成するので、あまり使われないということです)。 old ASCII フォーマットは、異なるマシンアーキテクチャの間での互換性は 保たれますが、65536 個を超える i-nodes を備えるシステムで使われることを 想定してません。 new ASCII フォーマットは、異なるマシンアーキテクチャの間でのアーカイブの 互換性は保たれます。old ASCII フォーマットのように、ファイルシステムの サイズの制限はありませんが、全てのバージョンの .BR cpio でこの形式をサポートするわけではありません。現状でこのフォーマットを サポートする cpio は、GNU cpio と、Unix System V R4 の cpio のみです。 crcフォーマットは、new ASCIIフォーマットと似てますが、アーカイブ作成時に .B cpio が各ファイルについてチェックサムを計算し、アーカイブ内に含めるところが 異なります。このチェックサムは、アーカイブからファイルを取り出す時の ベリファイに使用されます。 HPUX フォーマットは、デバイスファイルを格納する形式が他の cpio と異なる HPUX の cpio 形式との互換性を持たせるために存在します。 .PP tarフォーマットは、 .B tar との互換性を持たせるために存在します。tar フォーマットでは、アーカイブされる ファイル名としては、100 文字を超えるものは使えません。また、 スペシャルファイル(ブロックデバイスややキャラクタデバイス)をアーカイブする こともできません。 POSIX.1 tar フォーマットは、アーカイブされるファイル名としては、255 文字を 超えるものは使えません。(ちょうどその場所に、"/"が含まれる場合は除きます)。 .PP デフォルトでは、 .B cpio は古い .B cpio との互換性を保つためにバイナリフォーマットアーカイブを作成します。 アーカイブを展開する場合には、 .B cpio は自動的に読み込まれたアーカイブの種類を認識するので、異なるバイトオーダの マシンで作成されたアーカイブを読むことができます。 .PP .B cpio のオプションには、操作モードを指定するものもあります。 どのオプションがどのモードに対応するかについては、 書式のセクションを見て下さい。 .SS オプション .TP .I "\-0, \-\-null" コピーアウトおよびコピーパスモードにおいて、改行のかわりにヌル文字で終了する ファイル名のリストを読み込みます。これにより、改行を含むファイル名を持つ ファイルをアーカイブできます。 GNU .B find を使うことで、ヌル文字で終了するファイル名のリストを生成することができます。 .TP .I "\-a, \-\-reset-access-time" ファイルを読み込んだ後に、それらのファイルのアクセスタイムの再設定を 行ないます。これは、これらのファイルがその時点で読み込まれたもののように 見えないようにするためです。 .TP .I "\-A, \-\-append" すでに存在するアーカイブファイルに追加書き込みをします。 このオプションはコピーアウトモードでのみ使用することができます。 このオプションを使うためには、アーカイブファイルが、 .I \-O または、 .I "\-F (\-\-file)" オプションで指定した名前のディスク上の(アーカイブ)ファイルで なければなりません。 .TP .I "\-b, \-\-swap" コピーインモードにおいて、データ中の1ワード(32 ビット)データの上下 16 ビット を入れ換え、1 ハーフワード(16 ビット)の上下 8 ビットを入れ換えます。本オプショ ンは、 .IR "\-sS" と同等です。 このオプションは、ビッグエンディアンマシンとリトルエンディアンのマシンの間で 32ビット整数を変換するために用います。 .TP .I "\-B" I/O ブロックサイズを 5120 バイトに設定します。ブロックサイズの初期値は 512 バイトです。 .TP .I "\-\-block-size=BLOCK-SIZE" I/Oブロックサイズを BLOCK-SIZE * 512 バイトに設定します。 .TP .I "\-c" アーカイブ形式として、old ASCII フォーマット (つまり古い互換アーカイブフォーマット)を用います。 .TP .I "\-C IO-SIZE, \-\-io-size=IO-SIZE" I/O ブロックサイズを IO-SIZE で指定したバイト数に設定します。 .TP .I "\-d, \-\-make-directories" 必要に応じてディレクトリを作成します。 .TP .I "\-E FILE, \-\-pattern-file=FILE" コピーインモードにおいて、ファイル名 FILE から展開したり、ファイルリストを 表示したりするために、ファイル名を特定するパターン指定を読み込みます。 ファイル名 FILE で特定できるファイルに記述された各行は、 .B cpio のオプション以外の文字列で指定されたもののように扱われます。 .TP .I "\-f, \-\-nonmatching" 与えられたパターンのいずれにも一致しないファイルのみ扱います。 .TP .I "\-F, \-\-file=archive" 標準入力もしくは標準出力のかわりに、指定されたアーカイブファイルを 用います。他のマシンのテープドライブをアーカイブファイルとして扱う 場合には、 `HOSTNAME:'で始まるファイル名を使用して下さい。 ホスト名は、そのユーザとしてリモートテープドライブをアクセスするために ユーザネームと '@'を先に書いても構いません(典型的には、そのユーザの `~/.rhosts'エントリにエントリが存在するマシンであることが多いようです)。 .TP .I "\-\-force-local" With .IR \-F 、 .IR \-I 、 もしくは .IR \-O オプションを用いた場合に、コロン文字を含むファイル名をローカルファイル名と みなして扱います。通常、コロン文字は、リモートホスト名とその上の ローカルファイル名を区切る場合に使用されます。 .TP .I "\-H FORMAT, \-\-format=FORMAT" アーカイブフォーマットとして、FORMATのものを用います。 FORMAT の部分に指定できる文字列を以下に示します。 これらの名前は、すべて大文字の場合でも認識されます。 コピーインモードでのデフォルトは、入力ファイルの内容から 自動的にアーカイブフォーマットを判定するもので、コピーアウトモードでは、 "bin"フォーマットがデフォルトです。 .RS .IP bin binaryフォーマットです。ほとんど使われません。 .IP odc old ASCII (POSIX.1 互換)フォーマットです。 .IP newc new ASCII(SVR4 互換)フォーマットです。 new ASCII フォーマットは、65536 個を超える i-nodes を備える ファイルシステムをサポートします。 .IP crc crc フォーマットです。crcフォーマットは、new ASCII フォーマットと似ていますが、 チェックサムを含みます。 .IP tar old tar フォーマットです。 .IP ustar POSIX.1 tar フォーマットです。GNU .B tar アーカイブも取り扱うことができます。POSIX.1 tar と GNU tar は、 よく似ていますが、同じではありません。 .IP hpbin HPUXの cpio で使用されている、あまり使われない binary フォーマットです。 (他の cpio とは異なる形式で、デバイスファイルを保存します)。 .IP hpodc HPUX の cpio で使用されている互換フォーマットです(他のcpioとは異 なる形式で、デバイスファイルを保存します)。 .RE .TP .I "\-i, \-\-extract" コピーインモードで動作します。 .TP .I "\-I archive" 標準入力のかわりに、指定されたアーカイブファイル名を用います。他のマシンの テープドライブをアーカイブファイルとして扱う場合には、`HOSTNAME:'で始 まるファイル名を使用して下さい。 ホスト名は、そのユーザとしてリモートテープドライブをアクセスするために ユーザネームと '@'を先に書いても構いません(典型的には、そのユーザの `~/.rhosts'エントリにエントリが存在するマシンであることが多いようです)。 .TP .I \-k 無視されます。他のバージョンの .BR cpio との互換性を保つためにのみ存在します。 .TP .I "\-l, \-\-link" 可能であれば、ファイルをコピーするかわりにリンクを張ります ( .I \-p オプションと共に指定するときのみ使用できます)。 .TP .I "\-L, \-\-dereference" シンボリックリンクを参照を利用しません。 シンボリックリンクファイルをコピーするかわりに、 シンボリックリンクファイルの指す実体のファイルをコピー します。 .TP .I "\-m, \-\-preserve-modification-time" コピー先のファイル生成時に、コピー元のファイルの更新時刻を保持します。 .TP .I "\-M MESSAGE, \-\-message=MESSAGE" バックアップ媒体(テープやフロッピーディスクなど)のボリューム終端まで 到達した場合に、MESSAGEで指定された文字列を出力します。この指定をすることで、 ユーザに新しい媒体の挿入指示を出すことが可能になります。MESSAGE で指定される文字列に"%d"が含まれる場合には、"%d"文字列は、現在の媒体通番 (1からはじまります)に置き換えられます。 .TP .I "\-n, \-\-numeric-uid-gid" 冗長モードで内容のリストを出す場合に、UID および GID を、その ID の 対応するユーザ名 / グループ名でなく、数字で表示します。 .TP .I " \-\-no-absolute-filenames" -コピーモードで、 +コピーインモードで、 アーカイブ中に絶対ファイル名で格納されていたとしても、 現在のディレクトリからの相対でファイルを生成します。 .TP .I " \-\-no-preserve-owner" コピーインモードおよびコピーパスモードにおいて、ファイルの所有者を 変更しません。これは、展開後のファイルの所有者は、実際にファイルの展開を 行なっているユーザとなることを示します。このオプションは、スーパユーザ以外の ユーザが使用する場合にはデフォルトで有効になります。これは、System V のユーザが、誤ってファイルの所有権を手放さないようにするためです。 .TP .I "\-o, \-\-create" コピーアウトモードで動作します。 .TP .I "\-O archive" 標準出力のかわりに、指定したアーカイブファイルを用います。他のマシンの テープドライブをアーカイブファイルとして扱う場合には、`HOSTNAME:'で 始まるファイル名を使用して下さい。ホスト名は、そのユーザとして リモートテープドライブをアクセスするためにユーザネームと '@'を先に 書いても構いません(典型的には、そのユーザの`~/.rhosts'エントリに エントリが存在するマシンであることが多いようです)。 .TP .I " \-\-only-verify-crc" コピーインモードで CRC フォーマットのアーカイブを読み込む時に、 アーカイブ内の各ファイルの CRC をベリファイするだけで、 実際にファイルを取り出しません。 .TP .I "\-p, \-\-pass-through" コピーパスモードで動作します。 .TP .I "\-\-quiet" コピーされたブロック数を表示しません。 .TP .I "\-r, \-\-rename" 対話的にファイル名を変更します。 .TP .I "\-R [user][:.][group], \-\-owner [user][:.][group]" コピーアウトモードおよびコピーパスモードにおいて、全ての生成ファイルの 所有権を指定したユーザ、グループに設定します。ユーザもしくはグループの どちらか、もしくは両方とも指定される必要があります。もしグループの指定は 省略されたが、":"もしくは"."セパレータが指定された場合には、ユーザの ログイングループがグループとして設定されます。 スーパーユーザのみがファイルの所有権を変更することが可能です。 .TP .I "\-\-sparse" コピーアウトモードおよびコピーパスモードにおいて、ゼロから成る大きなブロックを 持つファイルを疎なファイルとして書きます。 .TP .I "\-s, \-\-swap-bytes" コピーインモードにおいて、ファイル中のデータの16ビットの上位8ビットと下位 8ビットを入れ換えます。 .TP .I "\-S, \-\-swap-halfwords" コピーインモードにおいて、ファイル中のデータの 32 ビットの上位 16 ビットと 下位 16 ビットを入れ換えます。 .TP .I "\-t, \-\-list" 入力ファイル名の一覧を出力します。 .TP .I "\-u, \-\-unconditional" すでに存在している新しいファイルを古いファイルで置き換えるかどうかの 問い合わせをすることなく、全てのファイルを上書きします。 .TP .I "\-v, \-\-verbose" 処理されたファイル名を表示します(冗長モードということです)。 .IR \-t オプションが同時に指定された場合には、`ls \-l'形式の表示を得ることが できます。ustar フォーマットのアーカイブから得られる表示においては、 ローカルシステムに存在しないユーザ名およびグループ名のファイルについては、 アーカイブ内に格納された UID および GID の値に対応するローカルでのユーザ名、 グループ名に置き換えてその部分を表示します。 .TP .I "\-V \-\-dot" 各ファイルを処理するごとに、"."を表示します。 .TP .I "\-\-version" .B cpio のプログラムバージョンを表示して終了します。 diff --git a/ja_JP.eucJP/man/man1/crontab.1 b/ja_JP.eucJP/man/man1/crontab.1 index d2b0fa4cb1..02ac2503b0 100644 --- a/ja_JP.eucJP/man/man1/crontab.1 +++ b/ja_JP.eucJP/man/man1/crontab.1 @@ -1,120 +1,120 @@ .\"/* Copyright 1988,1990,1993 by Paul Vixie .\" * All rights reserved .\" * .\" * Distribute freely, except: don't remove my name from the source or .\" * documentation (don't take credit for my work), mark your changes (don't .\" * get me blamed for your possible bugs), don't alter or remove this .\" * notice. May be sold if buildable source is provided to buyer. No .\" * warrantee of any kind, express or implied, is included with this .\" * software; use at your own risk, responsibility for damages (if any) to .\" * anyone resulting from the use of this software rests entirely with the .\" * user. .\" * .\" * Send bug reports, bug fixes, enhancements, requests, flames, etc., and .\" * I'll try to keep a version up to date. I can be reached as follows: .\" * Paul Vixie uunet!decwrl!vixie!paul .\" */ .\" .\" %Id: crontab.1,v 1.5 1998/03/23 08:21:29 charnier Exp % .\" jpman %Id: crontab.1,v 1.2 1997/04/18 06:38:25 yugawa Stab % .\" .Dd December 29, 1993 .Dt CRONTAB 1 .Os .Sh 名称 .Nm crontab .Nd 個人用の crontab の編集を行う (V3) .Sh 書式 .Nm crontab .Op Fl u Ar user .Ar file .Nm crontab .Op Fl u Ar user { .Fl l | .Fl r | .Fl e } .Sh 解説 .Nm crontab は、 Vixie Cron の .Xr cron 8 デーモンが扱うテーブル内のエントリの -追加、削除、およびリスト表示を行います。各ユーザは、自分用の contab +追加、削除、およびリスト表示を行います。各ユーザは、自分用の crontab ファイルを持つことができます。このファイルは .Pa /var 内にありますが、 これはエディタで直接変更するためのものではありません。 .Pp もし .Pa allow ファイル .Pq Pa /var/cron/allow が存在した場合、このコマンドを 使うためには、あなたの名前がこの .Pa allow ファイルになければなりません。また、 .Pa allow ファイルは存在しないが .Pa deny ファイル .Pq Pa /var/cron/deny が存在した場合に、 このコマンドを使うためには、あなたの名前がこの .Pa deny ファイルにあっては .Em いけません 。 どちらのファイルも存在しない場合、サイト依存の設定パラメータにより スーパーユーザだけがこのコマンドを使うことができるか、 すべてのユーザがこのコマンドを使うことができるかが決定されます。 .Pp このコマンドの最初の書式は file から新しい crontab をインストールする 場合に使います。ファイル名として ``-'' が指定された時は、標準入力から 読み込みます。 .Pp 以下のオプションを使用可能です: .Bl -tag -width indent .It Fl u 指定した -.I user +ユーザ の crontab ファイルに対して操作を行います。 このオプションがない場合には、コマンドを実行した人 の crontab ファイルに対しての操作になります。 .Xr su 8 をしている場合は混乱する可能性がありますから、正確を期するため、この場合には .Fl u をつねにつけるようにすべきです。 .It Fl l 現在の crontab ファイルを標準出力に表示します。 .It Fl r 現在の crontab ファイルを削除します。 .It Fl e 現在の crontab を編集します。環境変数 .Ev VISUAL もしくは .Ev EDITOR があれば、この環境変数で指定したエディタを利用します。 エディタを終了すれば、crontab ファイルが自動的にインストールされます。 .El .Sh 関連項目 .Xr crontab 5 , .Xr cron 8 .Sh 関連ファイル .Bl -tag -width /var/cron/allow -compact .It Pa /var/cron/allow .It Pa /var/cron/deny .El .Sh 規格 .Nm コマンドは .St -p1003.2 準拠です。 この新しい文法は以前の Vixie Cron のものとも 古典的な SVR3 のものとも異なっています。 .Sh 診断 誤ったコマンドラインを与えて実行した場合、 使用法についてのかなり有益なメッセージが出力されます。 .Sh 作者 .An Paul Vixie Aq paul@vix.com diff --git a/ja_JP.eucJP/man/man1/dialog.1 b/ja_JP.eucJP/man/man1/dialog.1 index 89cc58f456..9072026ecc 100644 --- a/ja_JP.eucJP/man/man1/dialog.1 +++ b/ja_JP.eucJP/man/man1/dialog.1 @@ -1,368 +1,368 @@ .TH DIALOG 1 "2 October 1998" .\" jpman %Id: dialog.1,v 1.3 1997/07/27 11:54:02 horikawa Stab % .SH 名称 dialog \- シェルスクリプトからダイアログボックスを表示する .SH 書式 .B dialog --clear .br .BI "dialog --create-rc " file .br .B dialog [ .BI "\-\-title " title ] [ .B \-\-clear ] [ .BI "\-\-hline " line ] [ .BI "\-\-hfile " file ] .B box-options .SH 解説 .B dialog はシェルスクリプトから、 質問形式、メッセージ表示形式など、 いろいろな種類のダイアログボックスを表示するプログラムです。 現在サポートされているダイアログボックスは 以下のとおりです。 .LP .BR yes/no " ボックス、" " menu" " ボックス、" " input" " ボックス、" .BR message " ボックス、" " text" " ボックス、" " info" " ボックス、" .BR checklist " ボックス、" " program" " ボックス、" .BR ftree " および " tree " ボックスです。" .SH オプション .TP .B \-\-clear 終了時に画面をクリアします。 .TP .BI \-\-create-rc " file" .B dialog -はランタイムコンフィグレーションをサポートしています。 +はランタイムコンフィギュレーションをサポートしています。 .I file にサンプルの設定ファイルを書き出します。 .TP .BI \-\-title " title" ダイアログボックスの最上行に表示する文字列 .I title を指定します。 .TP .BI \-\-hline " line" ダイアログボックスの最下行に表示する文字列 .I line を指定します。 .TP .BI \-\-hfile " file" ? キーか F1 キーをタイプしたときに 表示する .I file を指定します。 .TP .B ボックスオプション .TP .BI \-\-yesno " text height width" 縦 .I height 横 .I width のサイズの .BR yes/no ダイアログボックスを表示します。 .I text で指定された文字列はダイアログボックスの内部に 表示されます。 この文字列が長すぎて、1行で表示できない場合は、 自動的に複数行に分割されます。 .I text が文字列 .I "\en" もしくは改行文字 .I `\en\' を含んでいる場合、その場所で 改行します。 このダイアログボックスは ユーザに yes あるいは no という返答を求める 際に役に立ちます。 ダイアログボックスは .B Yes と .B No のボタンを持っており、 .IR TAB キーで選択することができます。 .TP .BI \-\-msgbox " text height width" .B message ボックスは .B yes/no ボックスと似ていますが、 .B message ボックスの場合、 .B OK ボタンしか表示されません。 このダイアログボックスを使って、メッセージを表示 することができます。 ユーザはこのメッセージを読んだ後、 .I ENTER キーを押して、 .B dialog を終了し、シェルスクリプトの実行を続けることになります。 .TP .BI \-\-infobox " text height width" .B info ボックスは基本的に .B message ボックスと同じですが、メッセージを表示すると すぐに終了します。 .B dialog の終了時に画面はクリアされません。 メッセージはシェルが後で画面をクリアするまで残ります。 これは終了までに時間のかかる処理を行うことを、 ユーザに知らせるときに便利です。 .TP .BI \-\-inputbox " text height width" .B input ボックスはユーザに文字列を入力させる ときに役に立ちます。入力時に .I バックスペース キーを 押すことで、タイプミスを訂正することができます。 入力文字列がダイアログボックスより長くなった 場合は、入力フィールドがスクロールします。 終了時には入力された文字列を .IR stderr に出力します。 .TP .BI \-\-textbox " file height width" .B text ボックスは、テキストファイルの内容をダイアログボックスの中に 表示するためのものです。これは簡単なテキストファイルビュアーの ようなものです。 表示中は、 .IR UP/DOWN "、" PGUP/PGDN "、" HOME/END キーを使ってファイル中を移動できます。 1 行がダイアログボックスより長い場合は、 .I LEFT/RIGHT で左右にスクロールできます。 より便利に使うために、 前方検索、後方検索の機能も実装されています。 .IP "\fB\-\-menu \fItext height width menu-height \fR[ \fItag item \fR] \fI..." .B menu ボックスは、その名のとおりダイアログボックスにリストを表示して ユーザに選ばせるものです。 各メニューは .I tag と .I item で構成されます。 .I tag は他の項目と区別するためのものです。 .I item はその項目が表す内容を短く記述したものです。 ユーザは .I UP/DOWN キー、または .I tag の先頭文字、 .I 1-9 を押すことで項目を選べます。 .I menu-height は一度に表示できるメニューの数を設定します。 .I menu-height より多くの項目がある場合、メニューがスクロールします。 .B dialog を終了するとき、 選択されたメニューの .I tag が .I stderr に出力されます。 .TP .BI \-\-prgbox " command height width" .B program ボックスは .B command の出力をダイアログボックスに表示します。 .IP "\fB\-\-checklist \fItext height width list-height \fR[ \fItag item status \fR] \fI..." .B checklist ボックスは、 メニューから項目を選ぶという点で .B menu ボックスと似ていまが、 項目のなかから 1 つを選ぶのではなく、 ユーザが各項目をオン・オフに設定することができます。 各項目のオン・オフの初期設定は .I status で設定できます。 終了時には、 ステータスがオンになっている項目の .I tag が .I stderr に出力されます。 .IP "\fB\-\-ftree \fIfile FS text height width menu-height" .B ftree ボックスは、 ファイル .I file に記述されたデータをもとにツリーを表示するダイアログボックスです。 ファイル内のデータは、find(1) の出力形式のように見えます。 find の出力の場合、フィールドセパレータ .I FS は .IR \'/\' になります。 .I height および .I width が正の値の場合、 .B ftree ボックス全体の絶対的な大きさを設定します。 .I height および .I width が負の値の場合、 .B ftree ボックスの大きさは、自動的に選択されます。 .I menu-height は、 .B ftree ボックス内部のツリーサブウィンドウの高さを設定しますので、 指定する必要があります。 .I text は、 .B ftree ボックス内部のツリーサブウィンドウ上部に表示され、 行を分割するために改行文字 .I '\en\' を含めることが可能です。 .IR UP/DOWN " または " \'+\'/\'-\' "、" PG_UP/PG_DOWN " または " \'b\'/SPACE .RI "、そして" HOME/END " または " \'g\'/\'G\' を押すことにより、ツリー内部を移動することが可能です。 リーフの選択は、 .IR TAB " または " LEFT/RIGHT で .B OK ボタンに移動してから .I ENTER を押します。 選択したリーフ (より正確には、ツリーのルートからリーフまでの完全なパス) が .I stderr に表示されます。 .B Cancel の後に .I ENTER を押すと、 .I stderr には何も表示されません。 .I file には find(1) 形式の出力を含めることが可能ですが、 find(1) を .I -d オプション付きで起動した出力のような形式も使用可能です。 ツリーのリーフへの中間のパスは、無くてもかまいません。 そのようなデータは、ファイルからの読み込み時に修正されます。 .IP "\fB\-\-tree \fIFS text height width menu-height \fR[ \fIitem \fR] \fI..." .B tree ボックスは、 .B ftree に似ていますが、例外があります。 第 1 に、データはファイルから入力されるのではなく、コマンドラインから .I item item ... の形式で読み込まれます。 第 2 に、データの修正はいかなる場合にも行われません。 よって、find(1) を .I -d オプション付きで起動した形式のデータは不正に見えます。 .SH ランタイムコンフィギュレーション .TP 4 1. 以下のように、サンプルの設定ファイルを作成します。 .LP .in +1i "dialog --create-rc " .TP 4 2. .B dialog は以下のように読み込む設定ファイル決定します。 .RS .TP 4 a) 環境変数 .B DIALOGRC が設定されている場合、その値は設定ファイル名として扱われます。 .TP 4 b) (a) で指定されたファイルが存在しなかった場合、 .I $HOME/.dialogrc が設定ファイルとして扱われます。 .TP 4 c) (b) のファイルが存在しなかった場合、 デフォルトの設定で起動します。 .RE .TP 4 3. サンプルの設定ファイルを編集して、 2 を参考に .B dialog が見付けることができる場所にコピーします。 .SH 環境変数 .TP 15 .B DIALOGRC 独自に設定をする場合は、設定ファイル名を指定します。 .SH 関連ファイル .TP 20 .I $HOME/.dialogrc デフォルトの設定ファイル .SH 診断 .BR dialog が .BR Yes か .BR OK を押されて終了した場合は 0 を、 .BR No か .BR Cancel を押されて終了した場合は 1 を返します。 また、 .B dialog の内部でエラーが起こるか、 .B dialog を .I ESC キーを押して終了させた場合、-1 を返します。 .SH 関連項目 dialog(3) .SH バグ .I タブ キャラクタを含むテキストファイルを .B text ボックス で表示すると、うまく表示されません。 テキストファイルの中の .I タブ キャラクタは 事前にスペースに変換しておかなくてはなりません。 .sp 1 画面の書き換えには時間がかかります。 .sp 1 .B ftree および .B tree のボックスでは、ツリーを左右に動かすことができません。 よって、多階層のデータの場合、見えなくなる階層が生じます。 80 文字の標準的な画面では、17 個の階層を見せることができます。 より深い階層は見えません。 それでも、ツリー内の移動と、リーフの選択は動作します。 .SH 作者 Savio Lam (lam836@cs.cuhk.hk) .sp 1 Anatoly A. Orehovsky (tolik@mpeks.tomsk.su) が更新しました (ftree と tree ボックス)。 diff --git a/ja_JP.eucJP/man/man1/gcc.1 b/ja_JP.eucJP/man/man1/gcc.1 index a8ea408dbc..6015f1d30b 100644 --- a/ja_JP.eucJP/man/man1/gcc.1 +++ b/ja_JP.eucJP/man/man1/gcc.1 @@ -1,4019 +1,4019 @@ .\" Copyright (c) 1991, 1992, 1993, 1994 Free Software Foundation -*-Text-*- .\" See section COPYING for conditions for redistribution .\" .\" jpman %Id: gcc.1,v 1.4 1997/10/11 07:52:34 horikawa Stab % .\" Set up \*(lq, \*(rq if -man hasn't already set it up. .if @@\*(lq@ \{\ . ds lq " . if t .ds lq `` . if !@@\(lq@ .ds lq "\(lq .\} .if @@\*(rq@ \{\ . ds rq " . if t .ds rq '' . if !@@\(rq@ .ds rq "\(rq .\} .de Id .ds Rv \\$3 .ds Dt \\$4 .. .de Sp .if n .sp .if t .sp 0.4 .. .Id %Id: gcc.1,v 1.4 1993/10/13 23:19:12 pesch Exp % .TH GCC 1 "\*(Dt" "GNU Tools" "GNU Tools" .SH 名称 gcc, g++ \- GNU プロジェクト C コンパイラ および C++ コンパイラ (v2.7) .SH 書式 .B gcc .RI "[ " option " | " filename " ].\|.\|." .br .SH 注意 このマニュアルに書かれた情報は GNU C コンパイラの完全な ドキュメンテーションからの抜粋であり、オプションの意味の記述にとどめます。 .PP このマニュアルはボランティアのメンテナンスが行なわれた時にのみ更新され るもので、常に最新の情報を示しているわけではありません。 もしこのマニュアルと実際のソフトウェアの間に矛盾点があれば、 正式なドキュメントである Info ファイルのほうを参照して下さい。 .PP このマニュアル中の古い記述が重大な混乱や不具合をきたすことになれば、 このマニュアルページの配布は中止します。 GNU CCのメンテナンス作業の都合上、 Info ファイルを更新した時にマニュアルページも併せて更新することは できません。マニュアルページは時代遅れであり、 これに時間をかけるべきではないと GNU プロジェクトでは考えています。 .PP 完全な最新のドキュメンテーションが必要な場合は、Info ファイルの`\|\c .B gcc\c \&\|' またはマニュアルの .I Using and Porting GNU CC (for version 2.0)\c \& を参照して下さい。この双方は Texinfo のソースファイル .B gcc.texinfo から生成されます。 .SH 解説 C と C++ のコンパイラは統合されています。どちらの場合も、入力ファイル は、プリプロセス、コンパイル、アセンブル、リンクの 4 つの処理ステージの うちの 1 つ以上のステージを踏んで処理されます。 ソースファイル名の拡張子によってソースの言語を識別しますが、 デフォルトの動作は、どちらの名前でコンパイラを使うかに依存しています: .TP .B gcc プリプロセス済みの (\c .B .i\c \&) ファイルを C のファイルと仮定し、C スタイルのリンクを行います。 .TP .B g++ プリプロセス済みの(\c .B .i\c \&) ファイルを C++ のファイルと仮定し、C++ スタイルのリンクを行います。 .PP ソースファイル名の拡張子は、その言語が何であるかと、どのような処理が行われる べきかを示します: .Sp .nf .ta \w'\fB.cxx\fP 'u \&\fB.c\fP C言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 \&\fB.C\fP C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 \&\fB.cc\fP C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 \&\fB.cxx\fP C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 \&\fB.m\fP Objective-C 言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 \&\fB.i\fP プリプロセッサにかけられたC言語ソースです。コンパイラ、アセンブラにかけられます。 \&\fB.ii\fP プリプロセッサにかけられたC++言語ソースです。コンパイラ、アセンブラにかけられます。 \&\fB.s\fP アセンブリ言語ソースです。アセンブラにかけられます。 \&\fB.S\fP アセンブリ言語ソースです。プリプロセッサ、アセンブラにかけられます。 \&\fB.h\fP プリプロセッサファイルです。通常はコマンドラインには現れません。 .Sp .fi その他の拡張子を持つファイルはリンカに渡されます。以下のものがあります。 .Sp .nf \&\fB.o\fP オブジェクトファイルです。 \&\fB.a\fP アーカイブファイルです。 .br .fi .Sp リンクは、オプション .BR \-c , .BR \-S , .B \-E を指定して抑制しないかぎり(もしくはコンパイルエラーによってすべての処理が中断 しないかぎり)、常に最終ステージで実行されます。 リンクのステージにおいては、ソースファイルに対応した全ての .B .o ファイルと、 .B \-l で指定したライブラリと、認識されなかったファイル名 (名前に .B .o のついたオブジェクトファイルや .B .a のついたアーカイブを含む) は、 コマンドラインに並べられた順番でリンカに渡されます。 .SH オプション オプションは分割されていなければなりません。すなわち `\|\c .B \-dr\c \&\|' は `\|\c .B \-d \-r \&\|'とは異なった扱いを受けます。 .PP ほとんどの `\|\c .B \-f\c \&\|' と `\|\c .B \-W\c \&\|' 形式のオプションには、 .BI \-f name と .BI \-fno\- name\c \& (または .BI \-W name と .BI \-Wno\- name\c \&) の形式の、対照的な表現があります。ここではデフォルトでない形式の みを示します。 .PP すべてのオプションを種類別に分けてまとめました。詳しい解説は 以下の節で行ないます。 .hy 0 .SH FreeBSD 固有のオプション .TP .BI "\-pthread" スレッド化ユーザプロセスに libc の代りに libc_r をリンクします。 スレッド化ユーザプロセスにリンクされるオブジェクトは -D_THREADSAFE 付きで コンパイルする必要があります。 .TP .BI "\-kthread" スレッド化カーネルプロセスに libc に加えて libpthread をリンクします。 スレッド化カーネルプロセスにリンクされるオブジェクトは -D_THREADSAFE 付きで コンパイルする必要があります。 .na .TP .B 全体的なオプション .br \-c \-S \-E .RI "\-o " file \-pipe \-v .RI "\-x " language .TP .B 言語オプション \-ansi \-fall\-virtual \-fcond\-mismatch \-fdollars\-in\-identifiers \-fenum\-int\-equiv \-fexternal\-templates \-fno\-asm \-fno\-builtin \-fno\-strict\-prototype \-fsigned\-bitfields \-fsigned\-char \-fthis\-is\-variable \-funsigned\-bitfields \-funsigned\-char \-fwritable\-strings \-traditional \-traditional\-cpp \-trigraphs .TP .B 警告オプション \-fsyntax\-only \-pedantic \-pedantic\-errors \-w \-W \-Wall \-Waggregate\-return \-Wcast\-align \-Wcast\-qual \-Wchar\-subscript \-Wcomment \-Wconversion \-Wenum\-clash \-Werror \-Wformat .RI \-Wid\-clash\- len \-Wimplicit \-Winline \-Wmissing\-prototypes \-Wmissing\-declarations \-Wnested\-externs \-Wno\-import \-Wparentheses \-Wpointer\-arith \-Wredundant\-decls \-Wreturn\-type \-Wshadow \-Wstrict\-prototypes \-Wswitch \-Wtemplate\-debugging \-Wtraditional \-Wtrigraphs \-Wuninitialized \-Wunused \-Wwrite\-strings .TP .B デバッグオプション \-a .RI \-d letters \-fpretend\-float \-g .RI \-g level \-gcoff \-gxcoff \-gxcoff+ \-gdwarf \-gdwarf+ \-gstabs \-gstabs+ \-ggdb \-p \-pg \-save\-temps .RI \-print\-file\-name= library \-print\-libgcc\-file\-name .TP .B 最適化オプション \-fcaller\-saves \-fcse\-follow\-jumps \-fcse\-skip\-blocks \-fdelayed\-branch \-felide\-constructors \-fexpensive\-optimizations \-ffast\-math \-ffloat\-store \-fforce\-addr \-fforce\-mem \-finline\-functions \-fkeep\-inline\-functions \-fmemoize\-lookups \-fno\-default\-inline \-fno\-defer\-pop \-fno\-function\-cse \-fno\-inline \-fno\-peephole \-fomit\-frame\-pointer \-frerun\-cse\-after\-loop \-fschedule\-insns \-fschedule\-insns2 \-fstrength\-reduce \-fthread\-jumps \-funroll\-all\-loops \-funroll\-loops \-O \-O2 .TP .B プリプロセッサオプション .RI \-A assertion \-C \-dD \-dM \-dN .RI \-D macro [\|= defn \|] \-E \-H .RI "\-idirafter " dir .RI "\-include " file .RI "\-imacros " file .RI "\-iprefix " file .RI "\-iwithprefix " dir \-M \-MD \-MM \-MMD \-nostdinc \-P .RI \-U macro \-undef .TP .B アセンブラオプション .RI \-Wa, option .TP .B リンカオプション .RI \-l library \-nostartfiles \-nostdlib \-static \-shared \-symbolic .RI "\-Xlinker\ " option .RI \-Wl, option .RI "\-u " symbol .TP .B ディレクトリオプション .RI \-B prefix .RI \-I dir \-I\- .RI \-L dir .TP .B ターゲットオプション .RI "\-b " machine .RI "\-V " version .TP .B コンフィギュレーション依存オプション .I M680x0\ オプション .br \-m68000 \-m68020 \-m68020\-40 \-m68030 \-m68040 \-m68881 \-mbitfield \-mc68000 \-mc68020 \-mfpa \-mnobitfield \-mrtd \-mshort \-msoft\-float .Sp .I VAX オプション .br \-mg \-mgnu \-munix .Sp .I SPARC オプション .br \-mepilogue \-mfpu \-mhard\-float \-mno\-fpu \-mno\-epilogue \-msoft\-float \-msparclite \-mv8 \-msupersparc \-mcypress .Sp .I Convex オプション .br \-margcount \-mc1 \-mc2 \-mnoargcount .Sp .I AMD29K オプション .br \-m29000 \-m29050 \-mbw \-mdw \-mkernel\-registers \-mlarge \-mnbw \-mnodw \-msmall \-mstack\-check \-muser\-registers .Sp .I M88K オプション .br \-m88000 \-m88100 \-m88110 \-mbig\-pic \-mcheck\-zero\-division \-mhandle\-large\-shift \-midentify\-revision \-mno\-check\-zero\-division \-mno\-ocs\-debug\-info \-mno\-ocs\-frame\-position \-mno\-optimize\-arg\-area \-mno\-serialize\-volatile \-mno\-underscores \-mocs\-debug\-info \-mocs\-frame\-position \-moptimize\-arg\-area \-mserialize\-volatile .RI \-mshort\-data\- num \-msvr3 \-msvr4 \-mtrap\-large\-shift \-muse\-div\-instruction \-mversion\-03.00 \-mwarn\-passed\-structs .Sp .I RS6000 オプション .br \-mfp\-in\-toc \-mno\-fop\-in\-toc .Sp .I RT オプション .br \-mcall\-lib\-mul \-mfp\-arg\-in\-fpregs \-mfp\-arg\-in\-gregs \-mfull\-fp\-blocks \-mhc\-struct\-return \-min\-line\-mul \-mminimum\-fp\-blocks \-mnohc\-struct\-return .Sp .I MIPS オプション .br \-mcpu=\fIcpu type\fP \-mips2 \-mips3 \-mint64 \-mlong64 \-mlonglong128 \-mmips\-as \-mgas \-mrnames \-mno\-rnames \-mgpopt \-mno\-gpopt \-mstats \-mno\-stats \-mmemcpy \-mno\-memcpy \-mno\-mips\-tfile \-mmips\-tfile \-msoft\-float \-mhard\-float \-mabicalls \-mno\-abicalls \-mhalf\-pic \-mno\-half\-pic \-G \fInum\fP \-nocpp .Sp .I i386 オプション .br \-m486 \-mno\-486 \-msoft\-float \-mrtd \-mregparm \-msvr3\-shlib \-mno\-ieee\-fp \-mno\-fp\-ret\-in\-387 \-mfancy\-math\-387 \-mno\-wide\-multiply \-mdebug\-addr \-mno\-move \-mprofiler\-epilogue \-reg\-alloc=LIST .Sp .I HPPA オプション .br \-mpa\-risc\-1\-0 \-mpa\-risc\-1\-1 \-mkernel \-mshared\-libs \-mno\-shared\-libs \-mlong\-calls \-mdisable\-fpregs \-mdisable\-indexing \-mtrailing\-colon .Sp .I i960 オプション .br \-m\fIcpu-type\fP \-mnumerics \-msoft\-float \-mleaf\-procedures \-mno\-leaf\-procedures \-mtail\-call \-mno\-tail\-call \-mcomplex\-addr \-mno\-complex\-addr \-mcode\-align \-mno\-code\-align \-mic\-compat \-mic2.0\-compat \-mic3.0\-compat \-masm\-compat \-mintel\-asm \-mstrict\-align \-mno\-strict\-align \-mold\-align \-mno\-old\-align .Sp .I DEC Alpha オプション .br \-mfp\-regs \-mno\-fp\-regs \-mno\-soft\-float \-msoft\-float .Sp .I System V オプション .br \-G \-Qy \-Qn .RI \-YP, paths .RI \-Ym, dir .TP .B コード生成オプション .RI \-fcall\-saved\- reg .RI \-fcall\-used\- reg .RI \-ffixed\- reg \-finhibit\-size\-directive \-fnonnull\-objects \-fno\-common \-fno\-ident \-fno\-gnu\-linker \-fpcc\-struct\-return \-fpic \-fPIC \-freg\-struct\-return \-fshared\-data \-fshort\-enums \-fshort\-double \-fvolatile \-fvolatile\-global \-fverbose\-asm .ad b .hy 1 .SH 全体的なオプション .TP .BI "\-x " "language" このオプションに続く入力ファイルの言語を .I language\c \& であると明示的に指定します (拡張子に基づくデフォルトの選択よりも優先されます)。このオプションは、 次の `\|\c .B \-x\c \&\|' オプションが出てくるまで、後続する全ての入力ファイルに対して 適用されます。\c .I language\c \& としては、 `\|\c .B c\c \&\|', `\|\c .B objective\-c\c \&\|', `\|\c .B c\-header\c \&\|', `\|\c .B c++\c \&\|', `\|\c .B cpp\-output\c \&\|', `\|\c .B assembler\c \&\|', `\|\c .B assembler\-with\-cpp\c \&\|' を指定することが可能です。 .TP .B \-x none 言語の指定を解除します。このオプションのあとに続くファイルは、それらの拡張子に 基づいて (あたかも何の `\|\c .B \-x\c \&\|' オプションも使用されたことがないように) 処理されます。 .PP もし、4 つのステージ (プリプロセス、コンパイル、アセンブル、リンク) の うちの一部のみが必要な場合は、 `\|\c .B \-x\c \&\|' オプション (またはファイル名の拡張子) を使用して \c .B gcc\c \& に対してどのステージから開始するかを伝え、さらに `\|\c .B \-c\c \&\|', `\|\c .B \-S\c \&\|', `\|\c .B \-E\c \&\|' のオプションのうちのどれかを使用して .B gcc\c \& に対してどこで処理を停止させるかを指定します。ここで、 いくつかの組み合わせ (例えば `\|\c .B \-x cpp\-output \-E\c \&\|') は \c .B gcc\c \& に対して何の動作も行なわないように指定することになることに注意してください。 .TP .B \-c ソースファイルを、コンパイルまたはアセンブルまではしますが、リンクはしません。 コンパイラの出力は、それぞれのソースファイルに対応したオブジェクトファイル となります。 .Sp デフォルトでは、GCC はオブジェクトファイルのファイル名として、 ソースファイルの拡張子 `\|\c .B .c\c \&\|', `\|\c .B .i\c \&\|', `\|\c .B .s\c \&\|' 等を `\|\c .B .o\c \&\|' で置き換えたものを使用します。 .B \-o\c \& オプションを使用することによって、他の名前を指定することも可能です。 .Sp GCC は .B \-c オプションを使用した場合は、理解できない入力ファイル (コンパイルやアセンブル を必要としないファイル) を無視します。 .TP .B \-S コンパイルが終った所で処理を停止し、アセンブルは行いません。 アセンブラコードではない入力ファイルが指 定された場合は、出力はアセンブラコードのファイルになります。 .Sp デフォルトでは、GCC はアセンブラファイルのファイル名として、 ソースファイルの拡張子 `\|\c .B .c\c \&\|', `\|\c .B .i\c \&\|' 等を `\|\c .B .s\c \&\|' で置き換えたものを使用します。 .B \-o\c \& オプションを使用することによって、他の名前を指定することも可能です。 .Sp GCC はコンパイルを必要としない入力ファイルを全て無視します。 .TP .B \-E プリプロセス処理が終了したところで停止します。コンパイルはしません。 出力はプリプロセス済みのソースコードであり、標準出力へと送られます。 .Sp GCC はプリプロセスを必要としない入力ファイルを全て無視します。 .TP .BI "\-o " file 出力先を \c .I file\c \& に指定します。このオプションは GCC が実行可能ファイル、 オブジェクトファイル、アセンブラファイル、プリプロセス済み C コードなどの、 いかなる種類の出力を行なう場合にも適用可能です。 .Sp 出力ファイルは 1 つしか指定できないため、 `\|\c .B \-o\c \&\|' を複数の入力ファイルをコンパイルする際に使用することは、実行ファ イルを出力する時以外は無意味です。 .Sp `\|\c .B \-o\c \&\|'オプションを指定しなかった場合のデフォルトは、実行ファイルを作る場 合は `\|\c .B a.out\c \&\|' という名前であり、`\|\c .I source\c .B \&.\c .I suffix\c \&\c \&\|' の形式のファイル名を持ったソースファイルのオブジェクトファイルは `\|\c .I source\c .B \&.o\c \&\|' であり、アセンブラのファイルは `\|\c .I source\c .B \&.s\c \&\|' です。 プリプロセス済みの C 言語は、全て標準出力に送られます。 .TP .B \-v (標準エラー出力に対して) コンパイルの各ステージで実行されるコマンドを 表示します。コンパイラドライバ、プリプロセッサおよび本来のコンパイラの 各バージョン番号も表示します。 .TP .B -pipe コンパイル時のステージの間のデータの受け渡しに、テンポラリファイルではなく パイプを使用します。いくつかのシステムではアセンブラがパイプからの入力を受け 付けることができないために、このオプションを指定すると失敗します。 GNU アセンブラでは問題なく使用できます。 .PP .SH 言語オプション .TP 以下のオプションは、コンパイラが受け付ける C の方言に関する制御を行ないます: .TP .B \-ansi 全ての ANSI 標準の C プログラムをサポートします。 .Sp このオプションは、GNU C が持つ ANSI C との非互換な機能を全て排除します。 例えば、\c .B asm\c \&, \c .B inline\c \&, \c .B typeof などのキーワードや、\c .B unix\c \& や \c .B vax などの現在使用しているシステムを規定する定義済みマクロなどが抑制されます。 さらに、好ましくなくかつほとんど使用されない ANSI のトライグラフの機能を使 用可能とし、さらに `\|\c .B $\c \&\|' を識別子の一部として使用できないようにします。 .Sp 代替キーワードである\c .B _\|_asm_\|_\c \&, \c .B _\|_extension_\|_\c \&, .B _\|_inline_\|_\c \&, \c .B _\|_typeof_\|_\c \& は、 `\|\c .B \-ansi\c \&\|' が指定された場合でも使用することが可能です。もちろん、 これらを ANSI C プログラムで使用することが望ましくないのは当然ですが、`\|\c .B \-ansi\c \&\|' をつけてコンパイルされる場合でも、インクルードされるヘッダファイル中に これらが記述できるということは有用です。 \c .B _\|_unix_\|_\c \& や \c .B _\|_vax_\|_\c \& などの代替定義済みマクロは、 `\|\c .B \-ansi\c \&\|' を指定する場合でも指定しない場合でも、利用可能となっています。 .Sp `\|\c .B \-ansi\c \&\|' オプションは、ANSI 準拠でないプログラムを不必要に拒否することは ありません。もしこのような動作を行なわせたい場合には`\|\c .B \-ansi\c \&\|'に加えて\c .B \-pedantic\c \&\|' オプションを指定する必要があります。 .Sp プリプロセッサ定義済みマクロ \c .B _\|_STRICT_ANSI_\|_\c \& が `\|\c .B \-ansi\c \&\|' オプションを使用した際には定義されます。いくつかのヘッダファイルは、この マクロを識別して、ANSI 標準が望まない関数やマクロの定義を抑制します。 これは、 それらの関数やマクロと同じ名前を別の目的で使用するプログラム を混乱させないようにするためです。 .TP .B \-fno\-asm \c .B asm\c \&, \c .B inline\c \&, \c .B typeof\c \& をキーワードとして解釈しません。 これらの単語は識別子として解釈されるようになります。これらの代用として \c .B _\|_asm_\|_\c \&, \c .B _\|_inline_\|_\c \&, \c .B _\|_typeof_\|_\c \& が使用できます。 `\|\c .B \-ansi\c \&\|' を指定すると、暗黙のうちに `\|\c .B \-fno\-asm\c \&\|' を指定したものとみなされます。 .TP .B \-fno\-builtin ビルトイン関数のうち、2 つのアンダースコアで始まるもの以外を認識しなくなり ます。現在、この指定は\c .B _exit\c \&, .B abort\c \&, \c .B abs\c \&, \c .B alloca\c \&, \c .B cos\c \&, \c .B exit\c \&, .B fabs\c \&, \c .B labs\c \&, \c .B memcmp\c \&, \c .B memcpy\c \&, \c .B sin\c \&, .B sqrt\c \&, \c .B strcmp\c \&, \c .B strcpy\c \&, \c .B strlen\c \& の関数に影響を及ぼします。 .Sp `\|\c .B \-ansi\c \&\|' オプションを指定すると、\c .B alloca\c \& と \c .B _exit\c \& はビルトイン関数として扱われなくなります。 .TP .B \-fno\-strict\-prototype `\|\c .B int foo ();\c \&\|' のような、引数を指定しない関数宣言を、C 言語のように引数の数や 型について何の仮定もしないという扱いにします (C++ のみ)。通常はこのよう な宣言は、C++ では \c .B foo\c \& という関数が 1 つも引数をとらないことを意味します。 .TP .B \-trigraphs ANSI C のトライグラフを使用可能とします。`\|\c .B \-ansi\c \&\|' オプションを指定すると、暗黙のうちに `\|\c .B \-trigraphs\c \&\|' を指定したものとみなされます。 .TP .B \-traditional 伝統的な C コンパイラのいくつかの特徴をサポートします。詳しくは GNU C の マニュアルを参照してください。以前はここにそのリストの複製を載せていましたが、 それらが完全に時代遅れになった時に我々に文句が来ないように削除してしまいま した。 .Sp しかし、C++ のプログラムだけについて (C ではありません) 特記しておくこと が 1 つあります。 `\|\c .B \-traditional\c \&\|' オプションは C++ に対して 1 つだけ特別な効果を持ちます。それは、 .B this への代入を許可するというものです。これは `\|\c .B \-fthis\-is\-variable\c \&\|'オプションの指定が及ぼす効果と同一のものです。 .TP .B \-traditional\-cpp 伝統的な C プリプロセッサのいくつかの特徴をサポートします。これは上に挙 げた中で特にプリプロセッサに関係したものを含みますが、 `\|\c .B \-traditional\c \&\|' の指定によって引き起こされる以外の効果を及ぼすことはありません。 .TP .B \-fdollars\-in\-identifiers 識別子中の `\|\c .B $\c \&\|' の使用を許可します (C++ のみ)。 `\|\c .B \-fno\-dollars\-in\-identifiers\c \&\|' を使用することによって、明示的に `\|\c .B $\c \&\|'の使用を禁止することも可能です。(GNU C++ では、デフォルトで `\|\c .B $\c \&\|' を許可しているシステムと禁止しているシステムがあります)。 .TP .B \-fenum\-int\-equiv \c .B int\c \& から列挙型への暗黙の変換を許可します (C++ のみ)。通常は GNU C++ は \c .B enum\c \& から \c .B int\c \& への変換は許可していますが、 逆は許していません。 .TP .B \-fexternal\-templates テンプレート関数について、その関数が定義された場所にのみ単一のコピー を生成することによって、テンプレート宣言に対してより小さなコードを生成 します (C++ のみ)。このオプションを使用して正しいコードを得るためには、 テンプレートを使用する全てのファイルにおいて、`\|\c .B #pragma implementation\c \&\|' (定義) または `\|\c .B #pragma interface\c \&\|' (宣言) を記述しておく必要があります。 `\|\c .B \-fexternal\-templates\c \&\|' を指定してコンパイルを行なう場合には、全てのテンプレートの 実体は external となります。全ての使用される実体はインプリメンテーション ファイル中にまとめて記述しておかなければなりません。これはその必要とされ る実体に対応した \c .B typedef\c \& 宣言を行なうことによって実現できます。 逆に、デフォルトのオプション `\|\c .B \-fno\-external\-templates\c \&\|' でコンパイルした場合には全てのテンプレートの実体は internal と なります。 .TP .B \-fall\-virtual 可能な限り全てのメンバ関数を暗黙のうちに仮想関数として扱います。 全てのメンバ関数 (コンストラクタと .B new , .B delete メンバ演算子を除きます) は、出現した時点でそのクラスの仮想関数とし て扱われます。 .Sp これは、これらのメンバ関数への全ての呼び出しが仮想関数のための内部 テーブルを参照して間接的に決定されるということを意味しません。特定の状況 においては、コンパイラは与えられた仮想関数への呼び出しを直接決定できます。 このような場合にはその関数呼び出しは常に直接呼び出しとなります。 .TP .B \-fcond\-mismatch 条件演算子の第 2, 第 3 引数の型が異なる記述を許します。このような式の型は void となります。 .TP .B \-fthis\-is\-variable \c .B this\c \& への代入を許可します (C++ のみ)。ユーザ定義による記憶管理が可 能となった現在では、 `\|\c .B this\c \&\|' への代入は時代遅れのものとなりました。従ってデフォルトでは、クラスの メンバ関数からの \c .B this\c \& への代入は不当なものとして扱われています。しかし、後方互換性のために、 `\|\c .B \-fthis-is-variable\c \&\|' を指定することによってこの効果を得ることができます。 .TP .B \-funsigned\-char \c .B char\c \& 型を \c .B unsigned char\c \& のように符号無しとして扱います。 .Sp それぞれのマシンには \c .B char\c \& がどちらであるべきかというデフォルトがあります。 デフォルトで \c .B unsigned char\c \& であることもあれば、デフォルトで .B signed char\c \& であることもあります。 .Sp 理想的には、可搬性のあるプログラムは、オブジェクトの符号の有無に依 存する記述を行なう場合には常に \c .B signed char\c \&、もしくは .B unsigned char\c \& を使用すべきです。 しかし実際には多くのプログラムが単なる \c .B char\c \& を用いて記述されており、さらにそのプログラムを記述した 環境に依存して、符号付きである、あるいは符号無しであるという暗黙の仮定が 行なわれています。このオプション、あるいはこの逆のオプションは、デフォル トと逆の動作を行なわせることにより、これらのプログラムを正しく動作させ ることを可能にします。 .Sp \c .B char\c \& 型は常に .B signed char\c \& あるいは \c .B unsigned char\c \& とは区別された型として扱われます。常にそれらの振舞いがそのどち らかと全く同じであるということに関わらず、このような扱いを行います。 .TP .B \-fsigned\-char \c .B char\c \& 型を \c .B signed char\c \& 型のように符号付きとして扱います。 .Sp ただし、このオプションは `\|\c .B \-fno\-unsigned\-char\c \&\|' と等価です。これは `\|\c .B \-funsigned\-char\c \&\|'の否定形です。同様に `\|\c .B \-fno\-signed\-char\c \&\|' は `\|\c .B \-funsigned\-char\c \&\|' と等価です。 .TP .B \-fsigned\-bitfields .TP .B \-funsigned\-bitfields .TP .B \-fno\-signed\-bitfields .TP .B \-fno\-unsigned\-bitfields これらのオプションは、明示的に `\|\c .B signed\c \&\|' または `\|\c .B unsigned\c \&\|' の指定が行なわれていないビットフィールドに対して、符号つきであるかある いは符号なしであるかを制御します。デフォルトではこのようなビットフィール ドは符号つきとなっています。なぜなら、 .B int\c \& のような基本的な型は符号つきであるという点で、整合性がとれるからです。 .Sp ただし、`\|\c .B \-traditional\c \&\|' を指定した場合は、ビットフィールドは常に全て符号無しであるとされます。 .TP .B \-fwritable\-strings 文字列定数を書き込み可能なデータセグメントに配置し、同内容の文字列を 1 つの共有オブジェクトにする処理を行いません。これは、文字定数に書き込む ことができることを仮定した昔のプログラムとの互換性をとるために提供され ています。`\|\c .B \-traditional\c \&\|' オプションも同様の効果を含みます。 .Sp 文字定数に書き込むという考えは非常によくない考えです。\*(lq定数\*(rq はまさに定数であり、変化すべきではありません。 .PP .SH プリプロセッサオプション これらのオプションは C プリプロセッサを制御します。 各 C ソースファイルは、実際にコンパイルする前に、C プリプロセッサに かけられます。 .PP `\|\c .B \-E\c \&\|' オプションを使用すると、GCC はプリプロセス以外の処理を行いません。 以下に示すオプションのうちのいくつかは、`\|\c .B \-E\c \&\|' と同時に使用された時のみ意味をもちます。なぜならば、これらのオプション によって、実際のコンパイルには不適当なプリプロセッサ出力が生成されるためです。 .TP .BI "\-include " "file" \c .I file\c \& を、通常の入力ファイルが処理される前に処理します。結果的に \c .I file\c \& に含まれる内容は、一番最初にコンパイルされることになります。コマンドラ インに指定されたすべての `\|\c .B \-D\c \&\|' や `\|\c .B \-U\c \&\|' オプションは、その記述された順番に関わらず常に `\|\c .B \-include \c .I file\c \&\c \&\|' が処理される前に処理されます。全ての `\|\c .B \-include\c \&\|' や `\|\c .B \-imacros\c \&\|' オプションは、それらが記述された順番通りに処理されます。 .TP .BI "\-imacros " file 通常の入力ファイルを処理する前に\c .I file\c \& を入力として処理しますが、その結果の出力を捨てます。 .I file\c \& によって生成された出力は捨てられるため、`\|\c .B \-imacros \c .I file\c \&\c \&\|' の処理結果の影響は、\c .I file\c \& 中に記述されたマクロがメインの入力ファイル中で使用可能になることだけです。 プリプロセッサは、`\|\c .B \-imacros \c .I file\c \&\|' が記述された順番に関わらず、これを処理する前に、 コマンドラインから与えられた全ての `\|\c .B \-D\c \&\|' や `\|\c .B \-U\c \&\|' オプションを評価します。全ての `\|\c .B \-include\c \&\|' および `\|\c .B \-imacros\c \&\|' オプションは、それらが記述された順番通りに処理されます。 .TP .BI "\-idirafter " "dir" ディレクトリ \c .I dir\c \& を第 2 インクルードパスに加えます。第 2 インクルードパス中のディレクトリは、 メインインクルードパス (オプション `\|\c .B \-I\c \&\|' によって追加されます) 中にヘッダファイルを探した結果発見できな かった場合に検索されます。 .TP .BI "\-iprefix " "prefix" \c .I prefix\c \& を、その後に続く `\|\c .B \-iwithprefix\c \&\|' オプション用のプレフィックスとして使用します。 .TP .BI "\-iwithprefix " "dir" ディレクトリを第 2 インクルードパスに追加します。ディレクトリ名は \c .I prefix\c \& と \c .I dir\c \& を連結することによって得られます。ここで \c .I prefix は、`\|\c .B \-iprefix\c \&\|' オプションによって指定されたものです。 .TP .B \-nostdinc ヘッダファイルのための標準のシステムディレクトリを検索しません。`\|\c .B \-I\c \&\|' オプションによって指定したディレクトリ (またはカレントディレクト リ) のみを検索します。 .Sp `\|\c .B \-nostdinc\c \&\|' と `\|\c .B \-I\-\c \&\|'を使用することにより、インクルードファイルの検索パスを明示的に指 定したディレクトリのみに限定することが可能となります。 .TP .B \-nostdinc++ ヘッダファイルの検索に、C++\-固有の標準ディレクトリを用いません。ただ しそれ以外の標準ディレクトリは検索されます。 (このオプションは `\|\c .B libg++\c \&\|' の構築に使用されます。) .TP .B \-undef 標準でない定義済みマクロ(アーキテクチャフラグも含めて)を定義しません。 .TP .B \-E C プリプロセッサの処理のみを行います。指定された全ての C のソースファイル に対してプリプロセスを行ない、標準出力、または指定された出力ファイルに 対して出力を行います。 .TP .B \-C プリプロセッサに対してコメントの削除を行なわないように指示します。 `\|\c .B \-E\c \&\|' オプションとともに使用されます。 .TP .B \-P プリプロセッサに対して `\|\c .B #line\c \&\|' コマンドを生成しないように指示します。 `\|\c .B \-E\c \&\|' オプションとともに使用されます。 .TP .B \-M\ [ \-MG ] プリプロセッサに対して\c .B make で使用可能な、オブジェクト間の依存関係を記述した出力を生成するように指示 します。それぞれのソースファイルに対して、プリプロセッサは\c .B make\c \& のための規則を 1 つ出力します。この出力は、ターゲットとして そのソースファイルから生成されるオブジェクトファイルのファイル名をとり、 依存するファイルのリストとしては `\|\c .B #include\c \&\|' によってソースファイルに 読み込まれる全てのファイルの名前が並びます。この 規則は 1 行、あるいは長い場合には`\|\c .B \e\c \&\|' と改行を入れて複数行で出力されます。この規則のリストは、プリプロセス済 みの C プログラムのかわりに、標準出力へと出力されます。 .Sp `\|\c .B \-M\c \&\|' は暗黙のうちに `\|\c .B \-E\c \&\|' を含みます。 .Sp `\|\c .B \-MG\c \&\|' を指定すると、見つからないヘッダファイルは生成されたファイルであり、 それらはソースファイルと同じディレクトリに存在するとみなします。 これは `\|\c .B \-M\c \&\|' と同時に指定しなければなりません。 .TP .B \-MM\ [ \-MG ] `\|\c .B \-M\c \&\|' と似ていますが、`\|\c .B #include "\c .I file\c .B \&"\c \&\|'によってインクルードされるユーザ定義のヘッダファイルのみを対象に した出力ファイルを生成します。`\|\c .B #include <\c .I file\c .B \&>\c \&\|' によってインクルードされるシステムヘッダファイルは省略されます。 .TP .B \-MD `\|\c .B \-M\c \&\|' と似ていますが、依存情報は出力ファイル名の最後の `\|\c .B .o\c \&\|' を `\|\c .B .d\c \&\|' に置き換えたファイル名のファイルに対して出力されます。 \&`\|\c .B \-MD\c \&\|' を指定したファイルのコンパイルもこれに加えて行なわれ、 `\|\c .B \-M\c \&\|' のように通常のコンパイルを抑制することはありません。 .Sp Mach のユーティリティである`\|\c .B md\c \&\|' は、これらの複数の `\|\c .B .d\c \&\|' ファイルを `\|\c .B make\c \&\|' コマンドによって使用できる単一の依存記述ファイルへとマージするのに使用 することができます。 .TP .B \-MMD `\|\c .B \-MD\c \&\|' と似ていますが、ユーザヘッダファイルのみを対象とし、システムヘッダ ファイルを無視します。 .TP .B \-H 通常の動作に加えて、使用されたヘッダファイルの名前を表示します。 .TP .BI "\-A" "question" ( answer ) .I question\c に対するアサーション .I answer \& を定義します。これは `\|\c .BI "#if #" question ( answer )\c \&\|' のようなプリプロセッサ条件節によってテストされます。`\|\c .B \-A\-\c \&\|' は標準のアサーション(通常はターゲットマシンに関 する情報を表している)を禁止します。 .TP .BI \-D macro マクロ \c .I macro\c \& に対して文字列 `\|\c .B 1\c \&\|' を定義として与えます。 .TP .BI \-D macro = defn マクロ \c .I macro\c \& を \c .I defn\c \& として定義します。コマンドライン上の全ての `\|\c .B \-D\c \&\|' オプションは `\|\c .B \-U\c \&\|' オプションの処理を行なう前に処理されます。 .TP .BI \-U macro マクロ \c .I macro\c \& の定義を無効にします。`\|\c .B \-U\c \&\|' オプションは全ての `\|\c .B \-D\c \&\|' オプションの処理が終了した後、`\|\c .B \-include\c \&\|' と `\|\c .B \-imacros\c \&\|' オプションの処理の前に処理されます。 .TP .B \-dM プリプロセッサに対して、プリプロセス終了時に有効であったマクロの定義の みを出力するように指示します。`\|\c .B \-E\c \&\|' オプションとともに使用します。 .TP .B \-dD プリプロセッサに対して、全てのマクロ定義を適切な順番で出力中にそのまま 出力するように指示します。 .TP .B \-dN `\|\c .B \-dD\c \&\|' と似ていますが、マクロの引数と内容を削除します。 出力には`\|\c .B #define \c .I name\c \&\c \&\|' のみが含まれます。 .PP .SH アセンブラオプション .TP .BI "\-Wa," "option" \c .I option\c \& をアセンブラに対するオプションとして渡します。\c .I option がコンマを含む場合は、そのコンマで区切られた複数のオプションとして与え られます。 .PP .SH リンカオプション これらのオプションは、コンパイラがオブジェクトファイル群をリンクして 1 つ の実行可能ファイルを出力する際に使用されるものです。これらはコンパイラが リンクステップを行なわない場合には意味を持ちません。 .TP .I object-file-name 特別に認識される拡張子で終っていないファイル名は、オブジェクトファイル、 またはライブラリであると認識されます。(オブジェクトファイルとライブラリ はリンカがその内容を参照することで区別されます。) GCC がリンクステップを 行なう場合は、これらのファイルはリンカへの入力として使用されます。 .TP .BI \-l library 名前が .I library\c \& であるライブラリをリンク時に使用します。 .Sp リンカは、標準のライブラリ用ディレクトリのリスト中から、 実際のファイル名が `\|\c .B lib\c .I library\c \&.a\c \&\|' であるファイルを検索します。リンカはこのファイルを、ファイル 名で直接指定した場合と同様に使用します。 .Sp 検索するディレクトリには、いくつかの標準システムディレクトリと、`\|\c .B \-L\c \&\|' によって指定したディレクトリが含まれます。 .Sp 通常、この方法で発見されるファイルはライブラリファイル、つまりいくつかの オブジェクトファイルをメンバとして含むアーカイブファイルです。 リンカは、アーカイブファイルの中を検索して、 参照されているが定義されていないシンボルを定義しているメンバを 探し出します。 しかし、もしリンカがライブラリでなく通常のオブジェクトファイルを発見した 場合は、そのオブジェクトファイルを通常の方法でリンクします。`\|\c .B \-l\c \&\|' オプションを使用する場合とファイル名を直接指定する場合の違いは、`\|\c .B \-l\c \&\|' の場合が .I library を `\|\c .B lib\c \&\|' と `\|\c .B .a\c \&\|' で囲み、いくつものディレクトリを検索することだけです。 .TP .B \-lobjc Objective C のプログラムをリンクする場合は、この特別な .B \-l オプションを指定する必要があります。 .TP .B \-nostartfiles リンク時に、標準のシステムスタートアップファイルを使用しません。 標準ライブラリは通常通りに使用されます。 .TP .B \-nostdlib リンク時に、標準のシステムライブラリとスタートアップファイルを使用しません。 指定したファイルのみがリンカに渡されます。 .TP .B \-static ダイナミックリンクをサポートするシステムにおいて、このオプションは共有 ライブラリとのリンクを抑制します。それ以外のシステムではこのオプションは 意味を持ちません。 .TP .B \-shared 他のオブジェクトとリンクして実行可能プログラムを形成し得る共有オブジェクトを 生成します。ごく少数のシステムでのみ、このオプションはサポートされ ています。 .TP .B \-symbolic 共有オブジェクトを構築する際に、グローバルなシンボルへの参照をバインド します。全ての解決できなかった参照に対して警告を与えます (ただしリンクエディタオプション `\|\c .B \-Xlinker \-z \-Xlinker defs\c \&\|' によってこれを無効化した場合を除きます)。ごく少数のシステムでのみ、 このオプションはサポートされています。 .TP .BI "\-Xlinker " "option" オプション \c .I option をリンカに対して渡します。リンカに渡すシステム固有のオプションが、 GNU CC が理解できないものである場合に利用できます。 .Sp 引数を持ったオプションを渡したい場合は、 `\|\c .B \-Xlinker\c \&\|' を 2 度使用すれば可能です。1 度目でオプションを渡し、2 度目で引数を 渡します。例えば `\|\c .B \-assert definitions\c \&\|' を渡すには、 `\|\c .B \-Xlinker \-assert \-Xlinker definitions\c \&\|' のように記述すれば可能です。 `\|\c .B \-Xlinker "\-assert definitions"\c \&\|' のように指定した場合は正常に動作しません。なぜならこれは、文字列全 体を 1 つの引数として渡してしまい、リンカの期待する形式と異なってしま うからです。 .TP .BI "\-Wl," "option" オプション \c .I option\c \& をリンカに渡します。\c .I option\c \& がコンマを含む場合は、それらのコンマで複数のオプションとして分割されます。 .TP .BI "\-u " "symbol" シンボル .I symbol が未定義であるかのように振舞います。これは強制的にこのシンボルを定義してい るライブラリモジュールをリンクするために使用します。`\|\c .B \-u\c \&\|' は異なったシンボルに対して複数回使用することができます。これによっ て、さらに多くのライブラリモジュールを読み込ませることができます。 .SH ディレクトリオプション これらのオプションは、ヘッダファイル、ライブラリ、コンパイラの一部を検 索するディレクトリを指定するために使用されます。 .TP .BI "\-I" "dir" ディレクトリ \c .I dir\c \& を、インクルードファイルの検索するディレクトリのリスト中に追加します。 .TP .B \-I\- `\|\c .B \-I\-\c \&\|' オプション指定前に `\|\c .B \-I\c \&\|' オプションによって指定された全てのディレクトリは、`\|\c .B #include "\c .I file\c .B \&"\c \&\|' の形式によってのみ検索されます。 これらのディレクトリは `\|\c .B #include <\c .I file\c .B \&>\c \&\|' によっては検索されません。 .Sp \&\|` .B \-I\-\c \&\|' オプション指定後に `\|\c .B \-I\c \&\|' で指定したディレクトリは、全ての `\|\c .B #include\c \&\|' 命令によって検索されます。(通常は \c .I 全ての\c \& `\|\c .B \-I\c \&\|' で指定されたディレクトリは この方法で検索されます。) .Sp これに加えて `\|\c .B \-I\-\c \&\|' オプションは、カレントディレクトリ (現在の入力ファイルが存在する ディレクトリ) が `\|\c .B #include "\c .I file\c .B \&"\c \&\|' に対する最初の検索対象となることを抑制します。`\|\c .B \-I\-\c \&\|' によるこの効果を上書きする方法はありません。`\|\c .B \-I.\c \&\|' を指定することによって、コンパイラが起動されたディレクトリが検索 されることを指定することは可能です。これはプリプロセッサが行なう デフォルトの動作とは異なりますが、たいていはこれで十分です。 .Sp `\|\c .B \-I\-\c \&\|' は、ヘッダファイルの検索に標準のシステムディレクトリを使うことを抑制 するわけではありません。 従って、`\|\c .B \-I\-\c \&\|' と `\|\c .B \-nostdinc\c \&\|' は 独立です。 .TP .BI "\-L" "dir" ディレクトリ\c .I dir\c \& を `\|\c .B \-l\c \&\|' による検索が行なわれるディレクトリのリストに加えます。 .TP .BI "\-B" "prefix" このオプションはコンパイラ自身の実行形式、ライブラリ、データファイルの 検索場所を指定します。 .Sp コンパイラドライバはサブプログラム `\|\c .B cpp\c \&\|', `\|\c .B cc1\c \&\|' (または C++ においては `\|\c .B cc1plus\c \&\|'), `\|\c .B as\c \&\|', そして `\|\c .B ld\c \&\|' を 1 つ、あるいはそれ以上起動します。コンパイラドライバは、 起動するプログラムのプレフィックスとして .I prefix\c \& に `\|\c .I machine\c .B /\c .I version\c .B /\c \&\|' をつけたものとつけないものの双方を 使用します。 .Sp コンパイラドライバは各サブプログラムの起動時に、 `\|\c .B \-B\c \&\|' プレフィックスの指定がある場合は、それを最初に利用します。もしその 名前が見つからなければ、または `\|\c .B \-B\c \&\|' が指定されていなければ、ドライバは 2 つの標準プレフィックス `\|\c .B /usr/lib/gcc/\c \&\|' と `\|\c .B /usr/local/lib/gcc-lib/\c \&\|' を試します。このどちらにも見つからなければ、コンパイラドライバは、 環境変数 `\|\c .B PATH\c \&\|' のディレクトリリストを利用して、そのプログラム名を検索します。 .Sp ランタイムサポートファイル `\|\c .B libgcc.a\c \&\|' も、必要ならば `\|\c .B \-B\c \&\|' プレフィックスを用いて検索されます。もしそこに見つからなければ、 前記 2 つの標準プレフィックスが試みられますが、それで終りです。この場合は リンクの対象から外されます。ほとんどの場合、またほとんどのマシンでは、`\|\c .B libgcc.a\c \&\|' は実際には必要ではありません。 .Sp これと同じ効果を、環境変数 .B GCC_EXEC_PREFIX\c \& によっても得ることができます。もしこの環境変数が定義されていれば、こ の値がプレフィックスとして同様に使用されます。もし `\|\c .B \-B\c \&\|' オプションと .B GCC_EXEC_PREFIX\c \& 環境変数の双方が存在した場合は、`\|\c .B \-B\c \&\|' オプションが最初に使用され、環境変数は次に使用されます。 .SH 警告オプション 警告は、本質的に間違いであるわけではありませんが、危険な構造を報告したり、 エラーがあるかもしれないような部分を示唆する診断メッセージです。 .Sp 以下のオプションは、GNU CC が生成する警告の量と種類を制御します。 .TP .B \-fsyntax\-only コードの文法エラーをチェックしますが、一切出力は行いません。 .TP .B \-w 全ての警告メッセージを抑制します。 .TP .B \-Wno\-import .BR #import の利用による警告メッセージを抑制します。 .TP .B \-pedantic 厳密な ANSI 標準 C 言語で規定している全ての警告を表示し、許されていない拡張を 使用したプログラムを全て拒否します。 .Sp 正当な ANSI 標準 C プログラムは、このオプションの有無に関わらず コンパイルできるべきです (もっとも、ほんのわずかではありますが `\|\c .B \-ansi\c \&\|' を必要とするものはあります)。しかし、このオプションを使用しない場合、 GNU 拡張や伝統的な C の特徴も、これに加えてサポートされます。このオプション を使用すれば、それらは拒絶されます。このオプションを\c .I 使う\c \&理由はありませんが、こだわりのある人々を満足させるためにのみ 存在しています。 .Sp `\|\c .B \-pedantic\c \&\|' は、始まりと終りとが `\|\c .B _\|_\c \&\|' である代替キーワードの使用については、警告しません。 同様に .B _\|_extension_\|_\c \& に続く表現についても警告しません。しかし、システムヘッダファイルのみ がこの抜け道を使用すべきであり、アプリケーションプログラムはこれを避け るべきです。 .TP .B \-pedantic\-errors `\|\c .B \-pedantic\c \&\|' と似ていますが、警告のかわりにエラーを出します。 .TP .B \-W 以下のイベントに対して、特別な警告メッセージを表示します。 .TP \ \ \ \(bu volatile でない自動変数が .B longjmp\c \& の呼び出しによって変更され得る場合です。これらの警告は、最適化コンパイル の時のみ問題になり得ます。 .Sp コンパイラは .B setjmp\c \& の呼び出しのみを見ています。コンパイラは、どこで \c .B longjmp\c \& が呼び出されるかを知ることはできません。実際には、シグナルハンドラは コード中の任意の場所で .B longjmp\c \& を呼び出すことができます。従って、実際には \c .B longjmp\c \& への呼び出しが危険な部分からはおこなわれていないために問題のないプ ログラムであっても、警告が発せられることになります。 .TP \ \ \ \(bu 関数が、値を伴ってリターンする場合と、値を伴わずにリターンする場合の両方 が起こりうる場合です。 (関数の最後を抜けていくことは、値を伴わずに関数をリターンするとみなされます。) 例えば、次の関数がこの種類の警告を引き起こします。 .Sp .nf foo (a) { if (a > 0) return a; } .Sp .fi ある関数 (\c .B abort\c \& や\c .B longjmp\c \& を含む) が決してリターンしないということを GNU CC が理解できないために、にせの警告 が発生するかもしれません。 .TP \ \ \ \(bu 式文 (expression-statement) またはコンマ式の左部分が 一切の副作用を含まない場合です。 警告を抑制するには、使用しない式を void にキャストして下さい。 例えば `\|\c .B x[i,j]\c \&\|' といった式は警告されますが、`\|\c .B x[(void)i,j]\c \&\|' は警告されません。 .TP \ \ \ \(bu 符号無しの値が 0 と `\|\c .B >\c \&\|' または `\|\c .B <=\c \&\|' で比較される場合です。 .PP .TP .B \-Wimplicit 関数やパラメータに対する暗黙の宣言に対して常に警告します。 .TP .B \-Wreturn\-type 関数の戻り値の型が、デフォルトである \c .B int\c \& に定義された時に常に警告します。また、戻り値の型が \c .B void\c でない関数内に、戻り値のない \c .B return\c \& 文がある場合にも常に警告します。 .TP .B \-Wunused ローカル変数が宣言されたにも関わらず使用されていない場合、静的に宣言さ れた関数の実体が定義されていない場合、計算結果が明らかに 利用されていない場合に常に警告します。 .TP .B \-Wswitch .B switch\c \& 文がインデックスとして列挙型をとっている時、その列挙型中のいくつ かの値に対する \c .B case\c \& が欠けている場合に常に警告します。(\c .B default\c \& ラベルが存在する場合、この警告は出ません。) このオプションを使用した場合 には、列挙型の範囲を越えた \c .B case\c \& ラベルも、常に警告されます。 .TP .B \-Wcomment コメントの開始文字列 `\|\c .B /\(**\c \&\|' がコメント中に現れた時に常に警告します。 .TP .B \-Wtrigraphs トライグラフの出現を常に警告します (トライグラフが使用可能であると仮定します)。 .TP .B \-Wformat .B printf\c \&, \c .B scanf\c \& などへの呼び出しに対して、与えられた引数が、フォーマット文字列の指 定を満足する型を持っているかを検査します。 .TP .B \-Wchar\-subscripts 配列の添字の型が .BR char であった場合に警告します。これはよくある間違いのもとです。 いくつかのマシンにおいてはこの型が符号付きであることを、 プログラマはしばしば忘れてしまいます。 .TP .B \-Wuninitialized 初期化されていない自動変数が使用されています。 .Sp これらの警告は、最適化コンパイルを行なう時のみ発生します。なぜなら、 コンパイラは最適化を行なう時にのみデータフロー情報を必要とするからです。 もし `\|\c .B \-O\c \&\|' を指定しなかった場合は、この警告を得ることはできません。 .Sp これらの警告は、レジスタ割り当ての対象となった変数についてのみ発生します。 従って、\c .B volatile\c \& であると宣言された変数や、アドレス上に割り当てられた変数、サイズが 1, 2, 4, 8 バイト以外の変数に関してはこれらの警告は発生しません。 さらに、構造体、共用体、配列については、たとえそれらがレジスタに 割り当てられたとしても、これらの警告は発生しません。 .Sp ある変数によって計算された値が結局使用されないような変数については、一切の 警告が生じないことに注意して下さい。このような計算は、警告が表示される前に データフロー解析によって削除されます。 .Sp これらの警告をオプションにした理由の一つは、GNU CC がまだあまり賢くなくて、 あるコードが一見間違いを含むかのように見えても それは実は正しいものかもしれない、 ということを GNU CC が理解できない、というものです。 ここにその 1 つの例を挙げます。 .Sp .nf { int x; switch (y) { case 1: x = 1; break; case 2: x = 4; break; case 3: x = 5; } foo (x); } .Sp .fi もし \c .B y\c \& の値が常に 1, 2 あるいは 3 である限りは \c .B x\c \& は常に 初期化されます。しかし GNU CC はこれを知ることはできません。もう 1 つの一般 的な例を挙げます。 .Sp .nf { int save_y; if (change_y) save_y = y, y = new_y; .\|.\|. if (change_y) y = save_y; } .Sp .fi これはバグを含みません。なぜなら \c .B save_y\c \& は、その値が設定された時のみ使用されるからです。 .Sp いくつかのにせの警告は、使用している決してリターンしない関数全てに対して .B volatile\c \& と宣言することによって防ぐことが可能です。 .TP .B \-Wparentheses ある特定の文脈中で括弧が省略されていた場合に警告します。 .TP .B \-Wtemplate\-debugging C++ プログラムにおいてテンプレートを使用している際に、デバッグが完全に 可能でない場合を警告します (C++ のみ)。 .TP .B \-Wall 全ての上に挙げた `\|\c .B \-W\c \&\|' オプションを結合したものです。これらのオプションは全て、 たとえマクロとの組み合わせ であっても、避けたほうがいいと我々が推奨する用法や、 簡単に避けることができると我々が信じている用法に関するものです。 .PP 残りの `\|\c .B \-W.\|.\|.\c \&\|' オプションは `\|\c .B \-Wall\c \&\|' によっては暗黙のうちに指定されません。なぜならこれらは、クリーンなプ ログラムにおいても、ある状況においては使用することが妥当であると我々が 考える構造についての警告を行なうオプションだからです。 .TP .B \-Wtraditional 伝統的な C と ANSI C において異なった振舞いをする特定の構造について警 告します。 .TP \ \ \ \(bu マクロ引数がマクロ本体内の文字列定数に現れるものです。これは、伝統的な C に おいてはその引数で置換しましたが、ANSI C においては定数の一部として扱わ れます。 .TP \ \ \ \(bu ブロック内で外部宣言であると宣言され、かつそのブロックの終端の後で 使用されている関数です。 .TP \ \ \ \(bu オペランドとして \c .B long\c \& 型をとる \c .B switch\c \& 文です。 .PP .TP .B \-Wshadow ローカル変数が他のローカル変数を隠している時に常に警告します。 .TP .BI "\-Wid\-clash\-" "len" 2 つの全く別の識別子の最初の \c .I len 文字が一致した時に警告します。これはある種の旧式な おばかさんコンパイラでコンパイルされ得るプログラムを作る場合に役に立ちます。 .TP .B \-Wpointer\-arith 関数型や \c .B void\c \& の \*(lqサイズ\*(rq に依存するものを全て警告します。GNU C はこれらに対して、 サイズ 1 を割り当てています。これは \c .B void \(**\c \& ポインタと関数へのポインタにおける計算を簡便にするためです。 .TP .B \-Wcast\-qual ポインタが、型修飾子が削除されるようにキャストされる全ての場合に警告します。 例えば \c .B const char \(**\c \& を 普通の \c .B char \(**\c \& にキャストした場合に警告がなされます。 .TP .B \-Wcast\-align ポインタのキャストにおいて、そのターゲットに要求される境界条件が 大きくなるようなキャストを全て警告します。例えば \c .B char \(**\c \& が \c .B int \(**\c \& へとキャストされると、整数が 2、あるいは 4 バイト境界でしかアクセスで きないマシンにおいては警告が発せられます。 .TP .B \-Wwrite\-strings 文字定数に対して、型 \c .B const char[\c .I length\c .B ]\c \& を与え、非-\c .B const\c \& の \c .B char \(** ポインタへのアドレスのコピーに対して警告するようにします。この警告は、 宣言とプロトタイプにおいて \c .B const\c \& の使用を非常に注意深くおこなっていさえすれば、 文字列定数に書き込みをしそうなコードをコンパイル時に発見することを助けますが、 そうでない場合は有害無益な指定です。これが、我々がこの警告を `\|\c .B \-Wall\c \&\|' のリクエストに含めなかった理由です。 .TP .B \-Wconversion 同じ引数が与えられた時に、プロトタイプが存在する場合とプロトタイプが 存在しない場合とで、異なった型変換を引き起こす場合について警告します。 これは固定小数点から浮動小数点への変換やその逆、デフォルトの動作と異なる固定 小数点引数の幅や符号の有無の変換が含まれます。 .TP .B \-Waggregate\-return 構造体や共用体を返す関数を定義した場合や、 それらを呼び出す全ての場合に警告します。 (配列を返すことができる言語においても、これは警告を引き起こします。) .TP .B \-Wstrict\-prototypes 引数の型を指定せずに関数を宣言、あるいは定義した場合に警告します。 (以前に引数の型を指定した宣言が存在する場合には、旧式の関数宣言に対しては 警告をしません。) .TP .B \-Wmissing\-declarations グローバルな関数を、その前にプロトタイプ宣言をせずに定義した場合に 警告します。 この警告は、たとえその定義自身がプロトタイプを含んでいたとしても発生します。 この警告の目的は、ヘッダファイル中にグローバル関数の定義を忘れるこ とを防ぐことにあります。 .TP .B \-Wredundant-decls 同一スコープ中で複数回、同一対象を宣言した場合に、たとえそれが正当で何も 変化させない場合であっても警告します。 .TP .B \-Wnested-externs 関数内で \c .B extern\c \& 宣言を行なった場合に警告します。 .TP .B \-Wenum\-clash 異なる列挙型の間で変換を行なった際に警告します (C++ のみ)。 .TP .B \-Woverloaded\-virtual (C++ のみ。) 導出クラスにおいて、仮想関数の定義は基底クラスで定義された仮想関数の型 の記述と一致していなければなりません。このオプションを使用することによっ て、基底クラスにおける仮想関数と同一の名前を持ち、基底クラスのいかなる 仮想関数とも異なった型の記述を持つ関数に対して警告が行われます。これに よって、導出クラスが仮想関数を定義しようとして失敗する場合を警告するこ とができます。 .TP .B \-Winline 関数がインライン宣言されている、あるいは .B \-finline\-functions オプションが与えられている場合に、関数をインライン展開できなかった場合 に警告します。 .TP .B \-Werror 警告をエラーとして扱います。警告の後にコンパイルを中断します。 .SH デバッグオプション GNU CC は、ユーザのプログラムや GCC の双方をデバッグするために、 多くのオプションを備えています。 .TP .B \-g オペレーティングシステムのネイティブのフォーマット (stabs, COFF, XCOFF, DWARF) でデバッグ情報を生成します。GDB はこのデバッグ情報に基づい て動作することができます。 .Sp stabs フォーマットを使用するほとんどのシステムにおいては、`\|\c .B \-g\c \&\|' を指定すると、GDB だけが使用できる余分なデバッグ情報が使用可能に なります。 この特別の情報は GDB に対してはよりよいデバッグを行なうことを可能 としますが、おそらく他のデバッガに対してはクラッシュ、あるいはそのプログラムを 読めなくしてしまいます。この特別な情報の生成を制御するためには `\|\c .B \-gstabs+\c \&\|', `\|\c .B \-gstabs\c \&\|', `\|\c .B \-gxcoff+\c \&\|', `\|\c .B \-gxcoff\c \&\|', `\|\c .B \-gdwarf+\c \&\|', `\|\c .B \-gdwarf\c \&\|' を使用してください (下記参照)。 .Sp 他の多くの C コンパイラと異なり、GNU CC は `\|\c .B \-g\c \&\|' を `\|\c .B \-O\c \&\|' とともに使用することを許しています。最適化されたコードが通る近道は、 時には驚くべき結果を生み出すかもしれません。 定義したはずの変数が存在しなかったり、 制御の流れが予想もしなかった場所に移動したり、結果が定数とわかる計算や、 結果がすでに手元にある文は実行されなくなり、ある文がループの外に追い出されて 別の場所で実行されたりします。 .Sp それにも関わらず、このオプションは最適化された出力のデバッグを可能とし ています。これによって、バグを含むかもしれないプログラムに対して オプティマイザを使用することができるようになります。 .PP 以下のオプションは、GNU CC を 1 つ以上のデバッグフォーマットを扱 えるように作成してある場合に有益です。 .TP .B \-ggdb (もしサポートされていれば)ネイティブのフォーマットでデバッグ情報を生成 します。これは可能な限りの全ての GDB 拡張を含みます。 .TP .B \-gstabs (もしサポートされていれば) stabs フォーマットでデバッグ情報を生成します。 ただし GDB 拡張は含みません。このフォーマットはほとんどの BSD システム上 の DBX で利用できるフォーマットです。 .TP .B \-gstabs+ (もしサポートされていれば) stabs フォーマットでデバッグ情報を生成します。 ただし GNU デバッガ (GDB) でしか理解できない GNU 拡張を使用します。 この拡張を使用すると、他のデバッガでは、クラッシュや プログラムが読めなくなるなどの影響がおそらく出ます。 .TP .B \-gcoff (サポートされていれば) COFF フォーマットでデバッグ情報を生成します。 これは、System V Release 4 より前の ほとんどの System V 上の SDB で利用できるフォーマットです。 .TP .B \-gxcoff (サポートされていれば) XCOFF フォーマットでデバッグ情報を生成します。こ れは IBM RS/6000 システムにおいて DBX デバッガによって使用される フォーマットです。 .TP .B \-gxcoff+ (もしサポートされていれば) XCOFF フォーマットでデバッグ情報の生成を行 います。ただし、GNU デバッガ (GDB) によってのみ理解され得る GNU 拡張を使 用します。これらの拡張を使用すると、他のデバッガに対してはクラッシュやプ ログラムを読みとり不能にするなどの影響を及ぼし得ます。 .TP .B \-gdwarf (もしサポートされていれば) DWARF フォーマットでデバッグ情報の生成を行 います。これはほとんどの System V Release 4 システムにおいて SDB によっ て使用される形式です。 .TP .B \-gdwarf+ (もしサポートされていれば) DAWRF フォーマットでデバッグ情報の生成を行 います。ただし、GNU デバッガ (GDB) によってのみ理解され得る GNU 拡張を使 用します。これらの拡張を使用すると、他のデバッガに対してはクラッシュや プログラムを読みとり不能にするなどの影響を及ぼし得ます。 .PP .BI "\-g" "level" .br .BI "\-ggdb" "level" .br .BI "\-gstabs" "level" .br .BI "\-gcoff" "level" .BI "\-gxcoff" "level" .TP .BI "\-gdwarf" "level" デバッグ情報を要求しますが、同時に \c .I level\c \& によってどの程度の情報が必要かを指定します。デフォルトのレベルは 2 です。 .Sp レベル 1 は、デバッグを予定しないプログラムの部分に対してバックトレース を生成するに十分な最低限の情報を生成します。これは関数と外部変数の記述 を含みますが、ローカル変数や行番号に関する情報は含みません。 .Sp レベル 3 はプログラムに含まれる全てのマクロ定義などの特別な情報を含みます。 いくつかのデバッガは `\|\c .B \-g3\c \&\|' の使用によってマクロの展開をサポートします。 .TP .B \-p プログラム \c .B prof\c \& によって使用されるプロファイル情報を書き込む特別なコードを生成します。 .TP .B \-pg プログラム \c .B gprof\c \& によって使用されるプロファイル情報を書き込む特別なコードを生成します。 .TP .B \-a 基本ブロックのプロファイル情報を書き込む特別なコードを生成します。これは それぞれのブロックが何回実行されたかを記録します。このデータは \c .B tcov\c \& のようなプログラムによって解析されます。ただし、このデータフォーマットは \c .B tcov\c \& が期待するものとは異なっています。最終的には、GNU \c .B gprof\c \& が処理できるように拡張されるべきです。 .TP .BI "\-d" "letters" コンパイル中の .I letters\c \& で指定されるタイミングに、デバッグ用のダンプを生成するように指示します。 これはコンパイラをデバッグするために使用されます。ほとんどのダンプのファイル 名はソースファイル名に 1 単語をつなげたものになります。(例えば、`\|\c .B foo.c.rtl\c \&\|' や `\|\c .B foo.c.jump\c \&\|' などです)。 .TP .B \-dM 全てのマクロ定義をダンプし、プリプロセス終了時に出力に書き出します。 その他には何も書き出しません。 .TP .B \-dN 全てのマクロ名をダンプし、プリプロセス終了時に出力に書き出します。 .TP .B \-dD 全てのマクロ定義をプリプロセス終了時に通常の出力に加えてダンプします。 .TP .B \-dy パース中にデバッグ情報を標準エラー出力にダンプします。 .TP .B \-dr RTL 生成後に `\|\c .I file\c .B \&.rtl\c \&\|' に対してダンプします。 .TP .B \-dx 関数をコンパイルするかわりに、RTL を生成するのみの処理を行います。通常は `\|\c .B r\c \&\|' とともに使用されます。 .TP .B \-dj 最初のジャンプ最適化の後に、`\|\c .I file\c .B \&.jump\c \&\|' に対してダンプします。 .TP .B \-ds 共通部分式削除 (しばしば共通部分式削除に続くジャンプ最適化も含みます) の終了 時に `\|\c .I file\c .B \&.cse\c \&\|' に対してダンプします。 .TP .B \-dL ループ最適化終了時に `\|\c .I file\c .B \&.loop\c \&\|' に対してダンプします。 .TP .B \-dt 第 2 共通部分式削除段階 (しばしば共通部分式削除に続くジャンプ最適化も 含みます) の終了時に、`\|\c .I file\c .B \&.cse2\c \&\|' に対してダンプします。 .TP .B \-df フロー解析終了後に、`\|\c .I file\c .B \&.flow\c \&\|' に対してダンプします。 .TP .B \-dc 命令コンビネーション終了時に `\|\c .I file\c .B \&.combine\c \&\|' に対してダンプします。 .TP .B \-dS 第 1 命令スケジューリング段階終了時に `\|\c .I file\c .B \&.sched\c \&\|' に対してダンプします。 .TP .B \-dl ローカルレジスタ割り当て終了時に `\|\c .I file\c .B \&.lreg\c \&\|' に対してダンプします。 .TP .B \-dg グローバルレジスタ割り当て終了時に `\|\c .I file\c .B \&.greg\c \&\|' に対してダンプします。 .TP .B \-dR 第 2 命令スケジューリング段階終了時に `\|\c .I file\c .B \&.sched2\c \&\|' に対してダンプします。 .TP .B \-dJ 最終ジャンプ最適化終了時に `\|\c .I file\c .B \&.jump2\c \&\|' に対してダンプします。 .TP .B \-dd 遅延分岐スケジューリング終了時に `\|\c .I file\c .B \&.dbr\c \&\|' に対してダンプします。 .TP .B \-dk レジスタからスタックへの転換終了時に `\|\c .I file\c .B \&.stack\c \&\|' に対してダンプします。 .TP .B \-da 以上の全てのダンプを生成します。 .TP .B \-dm 処理の終了時に、メモリ使用に関する統計情報を標準エラー出力に出力します。 .TP .B \-dp どのようなパターンや選択肢が使用されたかを示すコメントをアセンブラ出力 中のコメントで解説します。 .TP .B \-fpretend\-float クロスコンパイラで処理を行なう際に、ホストマシンと同じ浮動小数点フォーマット をターゲットマシンが持つかのように振舞わせます。これは浮動小数点定 数の誤った出力を引き起こしますが、実際の命令列はおそらく GNU CC を ターゲットマシンで起動した場合と同じものとなるでしょう。 .TP .B \-save\-temps 通常の \*(lq一時\*(rq 中間ファイルを消去せずに保存します。これらは カレントディレクトリに置かれ、ソースファイルに基づいた名前が付けられます。 従って、`\|\c .B foo.c\c \&\|' を `\|\c .B \-c \-save\-temps\c \&\|' を使用してコンパイルした場合は、 `\|\c .B foo.cpp\c \&\|', `\|\c .B foo.s\c \&\|' が、`\|\c .B foo.o\c \&\|' と同様に生成されます。 .TP .BI "\-print\-libgcc\-file\-name=" "library" ライブラリファイル `\|\c .nh .I library .hy \&\|' の完全な絶対名を表示します。このファイルはリンクの際のみに使用され、 それ以外の働きはありません。このオプションが指定された場合は、GNU CC は コンパイルやリンクを何も行なわず、ただファイル名を表示するのみです。 .TP .B \-print\-libgcc\-file\-name `\|\c .B \-print\-file\-name=libgcc.a\c \&\|' と同じです。 .TP .BI "\-print\-prog\-name=" "program" `\|\c .B \-print\-file\-name\c \&\|' と似ていますが、`\|\c cpp\c \&\|' のような program を検索します。 .SH 最適化オプション これらのオプションは様々な種類の最適化処理を制御します。 .TP .B \-O .TP .B \-O1 最適化を行います。最適化コンパイルは幾分長めの処理時間と、大きな関数に対 する非常に多くのメモリを必要とします。 .Sp `\|\c .B \-O\c \&\|' が指定されなかった場合は、コンパイラの目標はコンパイルのコストを 低減することや、目的の結果を得るためのデバッグを可能とすることに置かれ ます。それぞれの文は独立しています。つまり、ブレークポイントでプログラムを 停止させることによって、任意の変数に新し い値を代入したり、プログラムカウンタを他の文へと変更することを可能とし、 そのソースコードにプログラマが望む正しい結果を得ることを可能にします。 .Sp `\|\c .B \-O\c \&\|' を指定しなかった場合は、\c .B register\c \& と宣言した変数のみがレジスタへと割り当てられます。コンパイルの結果と して得られるコードは、PCC を `\|\c .B \-O\c \&\|' なしで使用した場合と比較して若干良くないものとなります。 .Sp `\|\c .B \-O\c \&\|' が指定されると、コンパイラはコードのサイズと実行時間を減少させる ことを試みます。 .Sp `\|\c .B \-O\c \&\|' を指定することによって、 `\|\c .B \-fthread\-jumps\c \&\|' と `\|\c .B \-fdefer\-pop\c \&\|' のフラグが指定されます。遅延スロットをもつマシンでは `\|\c .B \-fdelayed\-branch\c \&\|' が指定されます。フレームポインタを使わないデバッグをサポートしている マシンでは、`\|\c .B \-fomit\-frame\-pointer\c \&\|' も指定されます。マシンによってはさらにその他のフラグが 指定されることもあります。 .TP .B \-O2 さらに最適化を行います。サポートされている最適化手段のうち、 空間と速度のトレードオフを含まないものはほとんどの全て使用されます。 例えばループのアンローリングや関数のインライン化は行われません。 .B \-O\c \& と比較して、このオプションはコンパイル時間と生成コードの性能の双方を増加 させます。 .TP .B \-O3 さらなる最適化を行います。これは .B \-O2 が行う全ての最適化手段に加えて .B \-finline\-functions も有効にします。 .TP .B \-O0 最適化を行いません。 .Sp 複数の .B \-O オプションを指定した場合は、レベル番号の有無に関わらず、最後に指定した ものが有効になります。 .PP `\|\c .B \-f\c .I flag\c \&\c \&\|' の形式を持ったオプションは、マシン独立のフラグです。ほとんどの フラグは有効形式と無効形式の双方を持っています。`\|\c .B \-ffoo\c \&\|' の無効形式は `\|\c .B \-fno\-foo\c \&\|' です。以下のリストでは、デフォルトではない方の形式のみを示します。 これに対して `\|\c .B no\-\c \&\|' を削除する、あるいは追加することによって双方の形式を生成すること が可能です。 .TP .B \-ffloat\-store 浮動小数点変数をレジスタに格納しません。このオプションは 68000 のように (68881 の) 浮動小数点レジスタが \c .B double\c \& よりも高い精度を持っていると思われるマシンにおいて、望まない超過精度を 抑制することを可能にします。 .Sp ほとんどのプログラムにおいては、超過精度は単に良い結果を生むだけですが、 いくつかのプログラムは正確な IEEE の浮動小数点フォーマット定義に依 存しています。 このようなプログラムに対して `\|\c .B \-ffloat\-store\c \&\|' を使用します。 .TP .B \-fmemoize\-lookups .TP .B \-fsave\-memoized コンパイルを高速に行なうために、ヒューリスティックスを使用します (C++ のみ)。これらのヒューリスティックスはデフォルトでは有効になってい ません。なぜなら、これはある種の入力ファイルにしか効果がなく、その他の ファイルではかえってコンパイルが低速になるからです。 .Sp 最初に、コンパイラはメンバ関数への呼び出し (あるいはデータメンバへの参 照) を構築します。これは (1) どのクラスでその名前のメンバ関数が実装さ れているかを決定し、(2) どのメンバ関数への呼び出しであるかという問題 (これはどの種類の型変換が必要となるかという決定も含みます) を解決し、(3) 呼び出し側に対するその関数の可視性を検査するという作業を行なう必要があります。 これらは全て、コンパイルをより低速にしてしまいます。通常は、そのメンバ 関数への 2 度目の呼び出しが起こった場合も、この長い処理がまた行なわれ ることになります。これは次のようなコード .Sp \& cout << "This " << p << " has " << n << " legs.\en"; .Sp は、これらの 3 つの手順を 6 回繰り返すということを意味します。これに対し て、ソフトウェアキャッシュを使用すると、そのキャッシュへの\*(lqヒット \*(rqは、コストを劇的に低減することが期待できます。不幸なことに、キャッシュ の導入によって異なったレイヤの機構を実装することが必要となり、それ 自身のオーバヘッドが生じてしまいます。`\|\c .B \-fmemoize\-lookups\c \&\|' はこのソフトウェアキャッシュを有効にします。 .Sp メンバとメンバ関数へのアクセス特権 (可視性) はある関数におけるコンテキスト と別の関数におけるものとでは異なるので、 .B g++ はキャッシュをフラッシュしなければなりません。`\|\c .B \-fmemoize\-lookups\c \&\|' フラグを使用すると、全ての関数をコンパイルするたびに毎回キャッシュを フラッシュします。`\|\c .B \-fsave\-memoized\c \&\|' フラグは同一のソフトウェアキャッシュについて、コンパイラが前回 コンパイルした関数のコンテキストが、次にコンパイルするコンテキストと同 一のアクセス特権を有しているとみなせる時には、キャッシュを保持します。 これは同一クラス中に多くのメンバ関数を定義している時に特に有効です。 他のクラスのフレンドになっているメンバ関数を除き、同一のクラスに属して いる全てのメンバ関数のアクセス特権は、全て同一です。このような場合は キャッシュをフラッシュする必要はありません。 .TP .B \-fno\-default\-inline クラススコープ中に定義されたメンバ関数をデフォルトでインライン関数とす る処理を行ないません (C++ のみ)。 .TP .B \-fno\-defer\-pop それぞれの関数呼び出しに対して、関数のリターン直後に常に引数をポップします。 関数呼出後に引数をポップしなければならないマシンにおいては、 コンパイラは通常、いくつかの関数の引数をスタックに積んで、 それらを同時にポップします。 .TP .B \-fforce\-mem メモリオペランドに対して、それらに対する演算が行なわれる前に、 レジスタにコピーします。これは全てのメモリ参照を、潜在的な共通部分式であると 定めることによって、より良いコードを生成します。もしそれが共通部分式でな かった場合は、命令コンビネーションによってレジスタへの読み込みは削 除されます。私はこれがどのような違いを生み出すかということに興味があります。 .TP .B \-fforce\-addr メモリアドレス定数について、それらに対する演算が行なわれる前にレジスタ にコピーします。これは `\|\c .B \-fforce\-mem\c \&\|' と同じ手法でより良いコードを生成します。私はこれがどのような違いを 生み出すかということに興味があります。 .TP .B \-fomit\-frame\-pointer フレームポインタをレジスタに格納する必要のない関数において、この処理を 行いません。これはフレームポインタの保存、設定、復帰にかかる命令を省略 し、さらに、多くの関数でレジスタ変数として使用できる余分なレジスタを 得ることを可能にします。\c .I ただし、このオプションはほとんどのマシンにおいてデバッグを不可能にします。 .Sp Vax などのいくつかのマシンでは、このフラグは効果を持ちません。なぜならこ れらのマシンでは標準の呼び出し手順が自動的にフレームポインタの設定を 行なってしまい、これが存在しないとしたところで何も節約ができないからです。 マシン記述マクロ \c .B FRAME_POINTER_REQUIRED\c \& が、ターゲットマシンがこのフラグをサポートするかどうかを制御しています。 .TP .B \-finline\-functions 全ての単純な関数を呼び出し側に組み込んでしまいます。コンパイラは ヒューリスティックスを用いて、 どの関数がこの方法で組み込むに足りるほど単純かを決定します。 .Sp もし、ある関数に対する全ての呼び出しを組み込むことができ、かつその関数が \c .B static\c \& と宣言されていた場合は、GCC はその関数を独立したアセンブラコードと しては出力をしません。 .TP .B \-fcaller\-saves 関数呼び出しにおいて破壊されるであろう値を、レジスタに保持することを可 能とします。これはこのような呼び出しの周囲にレジスタに対する保存、復帰の 特別なコードを出力することによって実現されます。このような割り当ては、そ れが通常よりも良いコードを出力するとみなされる場合にのみ行われます。 .Sp このオプションは特定のマシンではデフォルトで有効となっています。これらは 通常、このオプションの処理の代わりに使うことができる呼び出し時保存 レジスタが存在しないマシンです。 .TP .B \-fkeep\-inline\-functions ある関数への呼び出しが全て呼び出し側に組み込むことができて、かつその関数が \c .B static\c \& と宣言されていたとしても、実行時に呼び出し可能な関数も生成します。 .TP .B \-fno\-function\-cse 関数のアドレスをレジスタに置きません。つまり、定まった関数を呼び出すコードは、 それぞれ明示的な関数のアドレスを含むコードとなります。 .Sp このオプションは効率の低いコードを生成しますが、アセンブラ出力を書き換え るようなハックを行なう場合には、このオプションを使用しなければ 混乱させられることでしょう。 .TP .B \-fno\-peephole マシン固有のピープホール最適化を禁止します。 .TP .B \-ffast-math このオプションは生成コードのスピードのために、GCC に対して、いくつかの ANSI または IEEE の規則/規格を侵させます。例えば、このオプションは \c .B sqrt\c \& 関数の引数は非負の数であることを仮定します。 .Sp このオプションはどの `\|\c .B \-O\c \&\|' オプションによっても有効とされません。なぜなら、このオプションは数 学関数に関する IEEE または ANSI の規則/規格の厳密な実装に依存して書かれた プログラムに対して誤った出力を与えるからです。 .PP 以下のオプションは特殊な最適化に関する制御を行います。`\|\c .B \-O2\c \&\|' オプションは`\|\c .B \-funroll\-loops\c \&\|' と `\|\c .B \-funroll\-all\-loops\c \&\|' を除くこれらの全てのオプションを有効にします。 .PP `\|\c .B \-O\c \&\|' オプションは通常 `\|\c .B \-fthread\-jumps\c \&\|' と `\|\c .B \-fdelayed\-branch\c \&\|' を有効とします。ただし、特殊なマシンではデフォルトの最適化に対して 変更が加えられているかもしれません。 .PP 最適化に関する \*(lqきめ細かいチューニング\*(rq が必要な場合に、以下の フラグを使用することが可能です。 .TP .B \-fstrength\-reduce ループのストレングスリダクションと繰り返し変数の除去を行います。 .TP .B \-fthread\-jumps 分岐ジャンプによってある場所にジャンプした時に、最初の分岐に包括される 比較が存在した時に、最初の分岐のジャンプ先を後者の分岐先に変更します。 この変更先は、2 番目の分岐条件の真偽によって、2 番目の分岐のジャンプ先か、 あるいは2 番目の分岐の直後に定められます。 .TP .B \-funroll\-loops ループ展開の最適化を行います。これはループの繰り返し数がコンパイル時、 あるいはランタイムに決定できる時においてのみ、実行されます。 .TP .B \-funroll\-all\-loops ループ展開の最適化を行います。これは全てのループに対して行われます。この オプションは大抵、より遅く動作するプログラムを生成します。 .TP .B \-fcse\-follow\-jumps 共通部分式削除の処理において、ジャンプ命令の行先が 他の経路から到達できない場合は、そのジャンプ命令を越えてスキャンを行 ないます。例えば、共通部分式削除処理中に \c .B else \c \& 節を伴った .B if \c \& 文に出会った場合、条件が偽ならば分岐先に対しても共通部分式削除を続けます。 .TP .B \-fcse\-skip\-blocks これは `\|\c .B \-fcse\-follow\-jumps\c \&\|' に似ていますが、ブロックを跨ぐジャンプに対しても共通部分式削除を継 続します。共通部分式削除処理中に、else 節を持たない単純な \c .B if\c \& 文にであった時、 `\|\c .B \-fcse\-skip\-blocks\c \&\|' は \c .B if\c \& のボディを跨いだジャンプに対する共通部分式削除処理を継続します。 .TP .B \-frerun\-cse\-after\-loop ループ最適化が行なわれた後に、再度共通部分式削除の処理を行います。 .TP .B \-felide\-constructors コンストラクタへの呼び出しが省略できるように思われる場合に、その呼び出 しを省略します (C++ のみ)。このフラグを指 定した場合は、GNU C++ は以下のコードに対して、一時オブジェクトを経由せずに \c .B y\c \& を \c .B foo への呼び出しの結果から直接初期化します。 .Sp A foo (); A y = foo (); .Sp このオプションを使用しない場合は、GNU C++ は最初に \c .B y\c \& を\c .B A\c \& 型の適切なコンストラクタを呼び出すことによって初期化します。そして、 .B foo\c \& の結果を一時オブジェクトに格納し、最終的には `\|\c .B y\c \&\|' の値を一時オブジェクトの値に入れ換えます。 .Sp デフォルトの振舞い (`\|\c .B \-fno\-elide\-constructors\c \&\|') が、ANSI C++ 標準のドラフトには規定されています。コンストラクタ が副作用を含むプログラムに対して、`\|\c .B \-felide-constructors\c \&\|' を指定すると、そのプログラムは異なった動作をする可能性があります。な ぜなら、いくつかのコンストラクタの呼び出しが省略されるからです。 .TP .B \-fexpensive\-optimizations 比較的コストの高いいくつかの些細な最適化を行います。 .TP .B \-fdelayed\-branch ターゲットマシンにおいてこのフラグがサポートされている場合は、遅延分岐 命令後の命令スロットを命令の順番変更によって利用するように設定します。 .TP .B \-fschedule\-insns ターゲットマシンにおいてこのフラグがサポートされている場合は、必要な データを利用可能になるまで待つことによる実行の遅滞を防ぐために、命令 の順番の変更を行います。これは遅い浮動小数点命令やメモリ読み込み命令の実 行において、それらの結果を必要とする命令の前に他の命令を詰め込みます。 .TP .B \-fschedule\-insns2 `\|\c .B \-fschedule\-insns\c \&\|' と似ていますが、レジスタ割当て処理の後にもう一度命令スケジューリングの 段階を置きます。これは、比較的レジスタ数が少なく、メモリロード命令 が 1 サイクルよりも多くを要するマシンにおいて、特に効果的です。 .SH ターゲットオプション デフォルトでは、GNU CC コンパイラは、現在使用しているマシンと同じタイプの コードをコンパイルします。しかし、GNU CC はクロスコンパイラ としてもインストールすることが可能です。実際には、異なったターゲット マシンのための様々なコンフィギュレーションの GNU CC は、同時にいくつ もインストールすることが可能です。そこで、どの GNU CC を使用するかを 指定するために、`\|\c .B \-b\c \&\|' オプションを使用することができます。 .PP これに加えて、古い、あるいはより新しいバージョンの GNU CC も同時にいく つもインストールしていくことができます。これらのうち 1 つ (おそらくもっ とも新しいもの) がデフォルトとなります。しかし、ひょっとしたら別のものを使 いたくなるかもしれません。 .TP .BI "\-b " "machine" 引数 \c .I machine\c \& は、コンパイルのターゲットマシンを規定します。これは GNU CC をクロス コンパイラとしてインストールした時に有用です。 .Sp .I machine\c \& に指定する値は、GNU CC をクロスコンパイラとしてコンフィギュレーション した時に与えたマシンタイプと同じです。例えば、80386 上の System V で実行されるプログラムのために `\|\c .B configure i386v\c \&\|' というコンフィギュレーションを行なったクロスコンパイラを起動した い場合は、`\|\c .B \-b i386v\c \&\|' と指定します。 .Sp `\|\c .B \-b\c \&\|' の設定を省略した場合は、通常は使用しているマシンと同タイプのマシン のためのコンパイルが行われます。 .TP .BI "\-V " "version" 引数 \c .I version\c \& は、起動される GNU CC のバージョンを規定します。これは複数のバージョンが インストールされている場合に有用です。例えば、 .I version\c \& が `\|\c .B 2.0\c \&\|' ならば、GNU CC バージョン 2.0 を起動することを意味します。 .Sp `\|\c .B \-V\c \&\|' を指定しなかった場合のデフォルトのバージョンは、GNU CC をインストール する時に調整可能です。通常は、もっとも一般的な使用に勧めることができる バージョンがここに指定されます。 .SH マシン依存オプション それぞれのターゲットマシンタイプは、それぞれの特別なオプションを持つ ことが可能です。`\|\c .B \-m\c \&\|' で始まるオプション群は、様々なハードウェアモデルや コンフィギュレーション\(em\&例えば 68010 と 68020、 浮動小数点コプロセッサの有無\(em\& などを選択できます。このオプションを指定することによって、コンパイラは どれか 1 つのモデル、 あるいはコンフィギュレーションに対するコンパイルが可能です。 .PP -いくつかのコンフィギュレーションは、通常はそのプラットホーム上の +いくつかのコンフィギュレーションは、通常はそのプラットフォーム上の 他のコンパイラとのコマンドラインに関するの互換性をとるため の特別なオプションを用意しています。 .PP 以下は 68000 シリーズのために定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-m68000 .TP .B \-mc68000 68000 のためのコードを生成します。これは 68000 ベースのシステムに対して コンフィギュレーションを行なったコンパイラのデフォルトです。 .TP .B \-m68020 .TP .B \-mc68020 (68000 ではなく) 68020 のためのコードを生成します。これは 68020 ベースの システムに対してコンフィギュレーションを行なったコンパイラのデフォルト です。 .TP .B \-m68881 浮動小数点演算のために 68881 命令を含んだ出力を行います。これはほとんどの 68020 ベースのシステムにおいて、コンパイラのコンフィギュレーション時に .B \-nfp を指定されなかった場合のデフォルトです。 .TP .B \-m68030 68030 のためのコードを生成します。これは 68030 ベースのシステムに対して コンフィギュレーションを行なったコンパイラのデフォルトです。 .TP .B \-m68040 68040 のためのコードを生成します。これは 68040 ベースのシステムに対して コンフィギュレーションを行なったコンパイラのデフォルトです。 .TP .B \-m68020\-40 68040 のためのコードを生成しますが、新しい命令を使用しません。この結果とし て得られるコードは、68020/68881, 68030, 68040 のいずれのシステムにおいても、 比較的高い性能を持ちます。 .TP .B \-mfpa 浮動小数点演算のために Sun FPA 命令を含んだ出力を行います。 .TP .B \-msoft\-float 浮動小数点演算のためにライブラリを呼び出す出力を行います。 .I 警告: この必須のライブラリは GNU CC の一部としては含まれません。通常はそのマシン の一般的な C コンパイラの提供するものを使用しますが、これは通常の方法 ではクロスコンパイルで直接使用することはできません。クロスコンパイルを行 ないたい場合は、自分自身で必要なライブラリ関数を用意する必要があります。 .TP .B \-mshort .B int\c \& 型を \c .B short int\c \& 型のように 16 ビット幅とみなします。 .TP .B \-mnobitfield ビットフィールド命令を使用しません。`\|\c .B \-m68000\c \&\|' は暗黙のうちに `\|\c .B \-mnobitfield\c \&\|' を含みます。 .TP .B \-mbitfield ビットフィールド命令を使用します。`\|\c .B \-m68020\c \&\|' は暗黙のうちに `\|\c .B \-mbitfield\c \&\|' を含みます。これは変更されていないソースの場合のデフォルトです。 .TP .B \-mrtd 固定個数の引数をとる関数に対して、異なった関数呼び出し規約を使用します。 これは、リターン時に引数をポップする \c .B rtd 命令を利用するものです。これは呼び出し側で引数をポップさせる必要がな いために、1 命令を省略することが可能となります。 .Sp この呼び出し規約は通常の Unix で使用されている方式とは互換性がありません。そ のため、Unix コンパイラでコンパイルされたライブラリを呼び出す必要があ る限りは、使用することはできません。 .Sp さらに、全ての可変引数をとり得る関数 ( .B printf\c を含みます) に対して、関数プロトタイプを用意する必要があります。さもないと、 これらの関数に対して誤ったコードが生成されます。 .Sp さらに、関数に対して多過ぎる引数をつけて呼び出すコードを書いた場合、こ れは深刻な誤ったコードを生成します。(通常は多過ぎる変数は害を及ぼすこと なく無視されます。) .Sp .B rtd\c \& 命令は 68010 と 68020 によってサポートされますが、 68000 では使用でき ません。 .PP 以下は Vax のために定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-munix 特定のいくつかのジャンプ命令 (\c .B aobleq\c \& 等) を出力しません。これらの命令で長いレンジを使用した場合、 Vax 用の Unix アセンブラはこれを処理できません。 .TP .B \-mgnu これらのジャンプ命令を出力します。アセンブルには GNU アセンブラの使用 を仮定します。 .TP .B \-mg 浮動小数点数について、d-フォーマットではなく、g-フォーマットのための コードを出力します。 .PP 以下は SPARC でサポートされている `\|\c .B \-m\c \&\|' スイッチです。 .PP .B \-mfpu .TP .B \-mhard\-float 浮動小数点命令を含む出力を行います。これはデフォルトです。 .PP .B \-mno\-fpu .TP .B \-msoft\-float 浮動小数点の処理のためにライブラリを呼び出す出力を行います。 .I 警告: SPARC 用の GNU 浮動小数点ライブラリは存在しません。 通常はそのマシンの一般的な C コンパイラの提供するものを使用しますが、 これは通常の方法ではクロスコンパイルで直接使用することはできません。 クロスコンパイルを行ないたい場合は、 自分自身で必要なライブラリ関数を用意する必要があります。 .Sp .B \-msoft\-float は呼び出し規約を変更します。したがって、 .I 全て のプログラムをこのオプションでコンパイルしない限り、 このオプションは意味をなしません。 .PP .B \-mno\-epilogue .TP .B \-mepilogue .B \-mepilogue を指定することによって (デフォルト)、コンパイラは関数を抜けるため のコードを常に関数の最後に出力します。関数の途中で関数を抜けるコードは全て、 関数の最後の終了コードへのジャンプとして生成されます。 .Sp .BR \-mno\-epilogue を設定することによって、コンパイラは関数から抜けるコードをインライン化 することを試みます。 .PP .B \-mno\-v8 .TP .B \-mv8 .TP .B \-msparclite これらの 3 つのオプションは SPARC アーキテクチャのバリエーションを選択 するために使用されます。 .Sp デフォルトでは、(Fujitsu SPARClite 用にコンフィギュレーションしない限 りは) GCC は SPARC アーキテクチャ v7 用のコードを生成します。 .Sp .B \-mv8 は、SPARC v8 用コードを生成します。v7 コードとの違いは、整数の乗算と整数 の除算が v7 では存在しないが v8 には存在するという点のみです。 .Sp .B \-msparclite は、SPARClite 用のコードを生成します。これは v7 には存在せず SPARClite に存在する、整数乗算、整数除算とスキャン (ffs) 命令を追加します。 .PP .B \-mcypress .TP .B \-msupersparc これら 2 つのオプションはコード最適化対象のプロセッサを選択するための ものです。 .Sp .B \-mcypress を用いると(これがデフォルト)、 コンパイラは Cypress CY7C602 チップ用にコードを最適化します。 このチップは SparcStation/SparcServer 3xx シリーズに用いられています。 このオプションは古い SparcStation 1, 2, IPX などにも適用できます。 .Sp .B \-msupersparc を用いると、コンパイラは SuperSparc CPU 用にコードを最適化します。 このチップは SparcStation 10, 1000, 2000 シリーズに用いられています。 このオプションを用いると、SPARC v8 の全命令セットを用いるようになります。 .PP 以下は Convex のために定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-mc1 C1 用の出力を行います。これはコンパイラが C1 用にコンフィギュレーション を行なわれた時のデフォルトです。 .TP .B \-mc2 C2 用の出力を行います。これはコンパイラが C2 用にコンフィギュレーション を行なわれた時のデフォルトです。 .TP .B \-margcount 引数列の前に、引数の数をワードに置くコードを生成します。いくつかの可搬性 のない Convex や Vax のプログラムはこのワードを必要とします。(デバッガは 不定長引数リストを持つ関数を除いて、このワードを必要としません。これらの 情報はシンボルテーブルに書かれます。) .TP .B \-mnoargcount 引数の数を示すワードを省略します。これは変更されていないソースを使用した 場合のデフォルトです。 .PP 以下は、AMD Am29000 のために定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-mdw DW ビットが立っていることを仮定したコードを出力します。これは、ハードウェア によってバイト操作やハーフワード操作がサポートされているということを 意味します。これはデフォルトです。 .TP .B \-mnodw DW ビットが立っていないことを仮定したコードを出力します。 .TP .B \-mbw システムがバイト操作やハーフワード書き込み操作をサポートしていることを仮定した コードを生成します。これはデフォルトです。 .TP .B \-mnbw システムがバイト操作やハーフワード書き込み操作をサポートしていないことを仮定し たコードを生成します。これは暗黙のうちに `\|\c .B \-mnodw\c \&\|' を含みます。 .TP .B \-msmall スモールメモリモデルを使用します。これは全ての関数のアドレスが単一の 256KB のセグメント内に入ることと、関数の絶対アドレスが 256K 以下にある ことを仮定します。このオプションは \c .B call\c \& 命令を \c .B const\c \&, \c .B consth\c \&, \c .B calli\c \& シーケンスの代わりに使用することを可能にします。 .TP .B \-mlarge .B call\c \& 命令が使用できることを仮定しません。これはデフォルトです。 .TP .B \-m29050 Am29050 用のコードを生成します。 .TP .B \-m29000 Am29000 用のコードを生成します。これはデフォルトです。 .TP .B \-mkernel\-registers .B gr96-gr127\c \& レジスタへの参照の代わりに .B gr64-gr95\c \& を参照するコードを生成します。このオプションは、ユーザのコードか ら使用できるグローバルレジスタから区別されたグローバルレジスタの集合 を利用するカーネルのコードをコンパイルする時に使用できます。 .Sp ただし、このオプションが使用されている時にも `\|\c .B \-f\c \&\|' フラグ中のレジスタ名は通常のユーザモードでの名前を使用します。 .TP .B \-muser\-registers 通常のグローバルレジスタの集合 \c .B gr96-gr127\c \& を使用します。これはデフォルトです。 .TP .B \-mstack\-check .B _\|_msp_check\c \& への呼び出しをそれぞれのスタック調整の後に挿入します。これはしばしば カーネルのコードにおいて用いられます。 .PP 以下は、Motorola 88K アーキテクチャのために定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-m88000 m88100 と m88110 の双方で比較的高性能で動作するコードを生成します。 .TP .B \-m88100 m88100 に最適なコードを生成します。ただし m88110 においても動作します。 .TP .B \-m88110 m88110 に最適なコードを生成します。 ただし m88100 においては動作しないかも知れません .TP .B \-midentify\-revision アセンブラ出力中に、ソースファイル名、コンパイラ名とバージョン、 タイムスタンプ、使用されたコンパイルフラグを記した \c .B ident\c \& ディレクティブを挿入します。 .TP .B \-mno\-underscores シンボル名の最初にアンダースコアキャラクタをつけないアセンブラ出力を生 成します。デフォルトでは個々の名前に対して、アンダースコアをプレフィック スとして使用します。 .TP .B \-mno\-check\-zero\-division .TP .B \-mcheck\-zero\-division 初期の 88K のモデルはゼロによる除算の処理に問題を持っていました。特に、そ れらの多くにおいてトラップが生じなかったことは問題でした。これ らのオプションを使用することによって、ゼロ除算を発見し、例外を知らせる コードを埋め込むことを禁止 (あるいは明示的に許可) することができます。全 ての 88K 用の GCC のコンフィギュレーションは `\|\c .B \-mcheck\-zero\-division\c \&\|' をデフォルトとして使用しています。 .TP .B \-mocs\-debug\-info .TP .B \-mno\-ocs\-debug\-info 88Open Object Compatibility Standard \*(lqOCS\*(rq で定義された (それぞれのスタックフレーム中で使用されるレジスタに関する) 付加的なデバッグ 情報を取り込みます (または省略します)。これらの付加的な情報は GDB によっ ては必要とされません。DG/UX, SVr4, Delta 88 SVr3.2 ではデフォルトでこの情 報を含めます。その他の 88K コンフィギュレーションではデフォルトで省略します。 .TP .B \-mocs\-frame\-position .TP .B \-mno\-ocs\-frame\-position OCS で規定されているように、レジスタの値に対して、スタックフレーム中の 特定の場所に保存されるという動作を強制します (あるいは要求しません)。 DG/UX, Delta88 SVr3.2, BCS のコンフィギュレーションでは `\|\c .B \-mocs\-frame\-position\c \&\|' をデフォルトとして、それ以外の 88k コンフィギュレーションでは `\|\c .B \-mno\-ocs\-frame\-position\c \&\|' をデフォルトとして使用しています。 .TP .B \-moptimize\-arg\-area .TP .B \-mno\-optimize\-arg\-area 関数の引数がどのような方法でスタックフレームに格納されるかを指定します。 `\|\c .B \-moptimize\-arg\-area\c \&\|' はスペースを節約しますが、いくつかのデバッガ (GDB は含まれない) を クラッシュさせます。`\|\c .B \-mno\-optimize\-arg\-area\c \&\|' はより標準に従っています。デフォルトでは GCC は引数エリアの最適化 を行いません。 .TP .BI "\-mshort\-data\-" "num" データ参照時に、それらの処理を \c .B r0\c \& からの相対参照で行なうことによって小さなコードにすることを可能とします。 これは値のロードを (その他の場合は 2 命令かかるところを) 1 命令で行な うことを可能にします。\c .I num\c \& をこのオプションとともに指定することによって、どのデータ参照が影響 を受けるかを指定することができます。例えば `\|\c .B \-mshort\-data\-512\c \&\|' を指定すると、512 バイト以内のディスプレースメントのデータ参照が 影響を受けることになります。 `\|\c .B \-mshort\-data\-\c .I num\c \&\c \&\|' は \c .I num\c \& が 64K よりも大きな時は効果を持ちません。 .PP .B \-mserialize-volatile .TP .B \-mno-serialize-volatile volatile なメモリへの参照について、シーケンシャルな整合性を持った コードを生成する、あるいは生成しません。 .Sp GNU CC はデフォルトではどのプロセッササブモデルを選んだ場合においても、 整合性を常に保証します。これがどのように実現されているかは、サブモデルに 依存しています。 .Sp m88100 プロセッサはメモリ参照の順番を入れ換えないので、常にシーケンシャルな 整合性は保たれます。もし `\|\c .B \-m88100\c \&\|' を使用した場合は、GNU CC はシーケンシャルな整合性を保つための特 別な命令を生成しません。 .Sp m88110 プロセッサにおけるメモリ参照の順番は、必ずしもそれらの要求を行 なった命令の順番とは一致しません。特に、読み込み命令は、先行する書き込み 命令よりも先に実行され得ます。このような順番の入れ換えは、マルチプロセッサ時に volatile なメモリの参照におけるシーケンシャルな整合性を崩してしまいます。 `\|\c .B \-m88000\c \&\|' または `\|\c .B \-m88110\c \&\|' を指定した場合には、GNU CC は、必要な場合は特別な命令を生成し、 命令の実行が正しい順番で行なわれることを強制します。 .Sp ここで生成される整合性を保証するための特別な命令はアプリケーションの性 能に対して影響を及ぼします。もしこの保証無しで問題がないということがわかっ ている場合は、`\|\c .B \-mno-serialize-volatile\c \&\|' を使用することができます。 .Sp `\|\c .B \-m88100\c \&\|' オプションを使用しているが、m88110 における実行時にシーケンシャルな 整合性が必要とされる場合は、`\|\c .B \-mserialize-volatile\c \&\|' を使用するべきです。 .PP .B \-msvr4 .TP .B \-msvr3 System V release 4 (SVr4) に関連したコンパイラの拡張を有効 (`\|\c .B \-msvr4\c \&\|') あるいは無効 (`\|\c .B \-msvr3\c \&\|') にします。これは以下の内容を制御します。 .TP \ \ \ \(bu 生成するアセンブラの文法の種類 (これは `\|\c .B \-mversion\-03.00\c \&\|' を使用することによって独立に制御できます)。 .TP \ \ \ \(bu `\|\c .B \-msvr4\c \&\|' は C プリプロセッサに対して `\|\c .B #pragma weak\c \&\|' を理解させます。 .TP \ \ \ \(bu `\|\c .B \-msvr4\c \&\|' は、GCC に SVr4 によって使用されている付加的な宣言ディレクティブ を生成させます。 .PP `\|\c .B \-msvr3\c \&\|' は、SVr4 を除く全ての m88K コンフィギュレーションにおけるデフォ ルトです。 .TP .B \-mtrap\-large\-shift .TP .B \-mhandle\-large\-shift 31 ビットより大きいビットシフトを検出するコードを埋め込みます。これらの オプションを指定することによって、それぞれトラップ、あるいは適切に処理す るコードが埋め込まれます。デフォルトでは GCC は大きなビットシフトには 特別な対策を行いません。 .TP .B \-muse\-div\-instruction 非常に初期の 88K アーキテクチャのモデルは除算命令を持っていません。従っ て、GCC はデフォルトでは除算命令を生成しません。このオプションは除算命令 が安全に使用できるということを指定します。 .TP .B \-mversion\-03.00 DG/UX コンフィギュレーションには、2 つの SVr4 の種類があります。このオプション は .B \-msvr4 オプションによって hybrid-COFF と real-ELF のどちらが使用されるかを選択します。 他のコンフィギュレーションはこのオプションを無視します。 .TP .B \-mwarn\-passed\-structs 関数に対して構造体を渡した場合と、関数が構造体を返した場合に警告します。 構造体を渡す規約は C 言語の発展の中で変化しており、移植性の問題をしば しば生じることになります。デフォルトでは GCC はこの警告を行いません。 .PP 以下のオプションは IBM RS6000 のために定義されたものです。 .PP .B \-mfp\-in\-toc .TP .B \-mno\-fp\-in\-toc 浮動小数点定数を Table of Contents (TOC) に入れるかどうかを指定します。 このテーブルは全てのグローバル変数と関数のアドレスを格納します。デフォルト では GCC は浮動小数点定数をここに格納します。もし TOC が算術あふれをおこす 場合は、`\|\c .B \-mno\-fp\-in\-toc\c \&\|' を使用することによって TOC のサイズを小さくすることが可能であり、 算術あふれを防ぐことができるでしょう。 .PP 以下は IBM RT PC 用に定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-min\-line\-mul 整数の乗算に対してインラインのコード列を生成します。これはデフォルトです。 .TP .B \-mcall\-lib\-mul 整数の乗算に対して \c .B lmul$$\c \& を呼び出します。 .TP .B \-mfull\-fp\-blocks フルサイズの浮動小数点データブロックを生成します。これは IBM によって推 奨されている最低限のスクラッチスペースの量を包含します。これはデフォルトです。 .TP .B \-mminimum\-fp\-blocks 浮動小数点データブロック内に特別なスクラッチスペースを含めません。これに よって、より小さなコードが生成されますが、実行は遅くなります。 なぜならスクラッチスペースが動的に確保されるからです。 .TP .B \-mfp\-arg\-in\-fpregs IBM の関数呼び出し規約とは互換性のない呼び出し手順を使用します。 この規約では浮動小数点引数を浮動小数点レジスタに入れて渡します。 このオプションを指定すると、\c .B varargs.h\c \& や \c .B stdarg.h\c \& で浮動小数点オペランドが使用できなくなることに注意して下さい。 .TP .B \-mfp\-arg\-in\-gregs 浮動小数点に対して通常の関数呼び出し規約を使用します。これはデフォルトです。 .TP .B \-mhc\-struct\-return 1 ワードより大きな構造体を返す時に、レジスタではなくメモリを使用して返します。 これは MetaWare HighC (hc) コンパイラとの互換性を提供します。`\|\c .B \-fpcc\-struct\-return\c \&\|' を使用することによって Portable C Compiler (pcc) との互換性を得 ることができます。 .TP .B \-mnohc\-struct\-return 1 ワードより大きな構造体を返す時に、レジスタによって返される場合があります。 これはその方が便利であると考えられる時に使用されます。これはデフォルトです。 IBM が提供するコンパイラとの互換性を得るためには、`\|\c .B \-fpcc\-struct\-return\c \&\|' と `\|\c .B \-mhc\-struct\-return\c \&\|' の双方を使用します。 .PP 以下は MIPS ファミリのために定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .BI "\-mcpu=" "cpu-type" 命令スケジューリング時に、デフォルトのマシンタイプを .I cpu-type に仮定します。デフォルトの .I cpu-type は .BR default です。この選択はすべてのマシンに対する最長のサイクル数を元にコードを 生成します。これは、生成されるコードがどの MIPS cpu においても適当な速度 で処理されるようにするためです。これ以外の .I cpu-type の選択としては、 .BR r2000 , .BR r3000 , .BR r4000 , .BR r6000 があります。特定の .I cpu-type を選択した場合は、その特定のチップに適したスケジュールが行われます。 コンパイラは、 .B \-mips2 または .B \-mips3 スイッチが使用されていない場合は、MIPS ISA (instruction set architecture) のレベル 1 に合致しないコードを生成することはありません。 .TP .B \-mips2 MIPS ISA のレベル 2 (branch likely 命令, 平方根命令) による命令群 を出力します。 .B \-mcpu=r4000 と .B \-mcpu=r6000 スイッチは、 .BR \-mips2 と共に使用される必要があります。 .TP .B \-mips3 MIPS ISA のレベル 3 (64 ビット命令) を含む命令群を出力します。 .B \-mcpu=r4000 スイッチは、 .BR \-mips2 と同時に使用する必要があります。 .TP .B \-mint64 .TP .B \-mlong64 .TP .B \-mlonglong128 これらのオプションは現在動作しません。 .TP .B \-mmips\-as MIPS アセンブラのためのコードを生成し、 .B mips\-tfile を起動して通常のデバッグ情報を追加します。 これは OSF/1 リファレンスプラットフォーム 以外の全てのプラットフォームにおけるデフォルトです。 OSF/1 リファレンスプラットフォームは OSF/rose オブジェクトフォーマットを 使用します。スイッチ .BR \-ggdb , .BR \-gstabs , .B \-gstabs+ のうちのどれかが使用されている場合は、 .B mips\-tfile プログラムは、stabs を MIPS ECOFF 中にカプセル化します。 .TP .B \-mgas GNU アセンブラ用のコードを生成します。これは OSF/1 リファレンスプラットフォーム におけるデフォルトです。OSF/1 リファレンスプラットフォームは OSF/rose オブジェクトフォーマットを使用します。 .TP .B \-mrnames .TP .B \-mno\-rnames .B \-mrnames スイッチは出力コードにおいて、レジスタの名前として、ハードウェア名の代 わりに MIPS ソフトウェア名を使用することを指定します。(つまり、 .B a0 を .BR $4 の代わりに使用します)。 GNU アセンブラは .B \-mrnames スイッチをサポートしません。MIPS アセンブラはソースファイルに対して MIPS C プリプロセッサを起動するでしょう。 .B \-mno\-rnames スイッチがデフォルトです。 .TP .B \-mgpopt .TP .B \-mno\-gpopt .B \-mgpopt スイッチは、全てのデータ宣言をテキストセクション中の全命令の前に書き出 すことを指定します。これによって、全ての MIPS アセンブラは、 ショートグローバル、あるいは静的なデータアイテムに対して、2 ワードではなく、1 ワードのメモリ参照命令を生成します。 これは最適化が指定された場合のデフォルトです。 .TP .B \-mstats .TP .B \-mno\-stats .B \-mstats が指定された場合は、コンパイラによってインラインでない関数が処理される ごとに、標準エラー出力ファイルに対して、そのプログラムに対する統計情報 を示す 1 行のメッセージを出力します。このメッセージは、保存したレジスタ の数、スタックのサイズなどを示します。 .TP .B \-mmemcpy .TP .B \-mno\-memcpy .B \-mmemcpy スイッチは、全てのブロック転送に対して、インラインコードを生成する代わ りに、適切なストリング関数 .RB ( memcpy または .BR bcopy ) を呼び出すコードを生成します。 .TP .B \-mmips\-tfile .TP .B \-mno\-mips\-tfile .B \-mno\-mips\-tfile スイッチを指定すると、 MIPS アセンブラがデバッグサポートのために生成したオブジェクトファイルに対し、 .B mips\-tfile を使用した後処理を行いません。 .B mips\-tfile が実行されないと、デバッガからはローカル変数を扱うことができません。 さらに、 .B stage2 と .B stage3 のオブジェクトはアセンブラに渡される一時的なファイル名をオブジェクトファイル 中に埋め込まれて持っており、このためそれらを比較した場合に同一のも のとはみなされません。 .TP .B \-msoft\-float 浮動小数点演算のためにライブラリを呼び出す出力を行います。 .I 警告: この必須のライブラリは GNU CC の一部としては含まれません。通常はそのマシンの 一般的な C コンパイラの提供するものを使用しますが、これは通常の方法 ではクロスコンパイルで直接使用することはできません。クロスコンパイルを行 ないたい場合は、自分自身で必要なライブラリ関数を用意する必要があります。 .TP .B \-mhard\-float 浮動小数点命令を含んだ出力を生成します。これは変更されないソースを使用し た場合のデフォルトです。 .TP .B \-mfp64 ステータスワード中の .B FR ビットが立っていることを仮定します。これは 32 個の 32 ビット浮動小数点 レジスタの代わりに、32 個の 64 ビットの浮動小数点レジスタが存在するとい うことを示します。この場合は、同時に .B \-mcpu=r4000 と .B \-mips3 スイッチを指定する必要があります。 .TP .B \-mfp32 32 個の 32 ビット浮動小数点レジスタが存在するということを仮定します。こ れはデフォルトです。 .PP .B \-mabicalls .TP .B \-mno\-abicalls いくつかの System V.4 の移植が位置独立コードのために使用する疑似命令 .BR \&.abicalls , .BR \&.cpload , .B \&.cprestore を出力する、あるいは出力しません。 .TP .B \-mhalf\-pic .TP .B \-mno\-half\-pic .B \-mhalf\-pic スイッチは、テキストセクション中に参照を配置する代わりに、外部参照を行 なうポインタをデータセクションに配置し、それをロードする動作を指定します。 このオプションは現在まだ動作しません。 .B .BI \-G num は .I num バイト以下のグローバル、あるいは静的なアイテムを、通常のデータや bss セクションではなく、小さなデータ、または bss セクションに配置することを 指定します。 これによりアセンブラは、通常では 2 ワードの参照を行うところを、 グローバルポインタ .RB ( gp または .BR $28 ) を基準とした 1 ワードのメモリ参照命令を生成可能となります。 デフォルトでは MIPS アセンブラが使用される場合、 .I num は 8 です。また、GNU アセンブラが使用される場合のデフォルトは 0 です。 .BI \-G num スイッチはアセンブラ、リンカにも同様に渡されます。全てのモジュールは同一の .BI \-G num の値でコンパイルされなければなりません。 .TP .B \-nocpp MIPS アセンブラに、ユーザアセンブラファイル (`\|\c .B .s\c \&\|' 拡張子を持ちます) に対するアセンブル時のプリプロセッサの起動を抑制さ せます。 .PP 以下は、Intel 80386 ファミリ用に定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-m486 .TP .B \-mno\-486 386 ではなく 486 に最適化されたコードを出力する、あるいはその逆を行な う指定を行います。486 用に生成されたコードは 386 で実行可能であり、逆も また可能です。 .TP .B \-msoft\-float 浮動小数点演算のためにライブラリを呼び出す出力を行います。 .I 警告: この必須のライブラリは GNU CC の一部としては含まれません。通常はそのマシンの 一般的な C コンパイラの提供するものを使用しますが、これは通常の方法 ではクロスコンパイルで直接使用することはできません。クロスコンパイルを行 ないたい場合は、自分自身で必要なライブラリ関数を用意する必要があります。 .Sp 関数が浮動小数点数を返す時に 80387 レジスタスタックを使用するマシンに おいては、`\|\c .B \-msoft-float\c \&\|' を使用した場合でも、いくつかの浮動小数点命令が生成されます。 .TP .B \-mno-fp-ret-in-387 関数からの返り値に FPU のレジスタを使用しません。 .Sp 通常の関数呼び出し規約は、たとえ FPU が存在しなくても .B float\c \& と \c .B double\c \& の結果を FPU レジスタに入れて返します。したがってこの場合、 オペレーティングシステムは FPU をエミュレートしなければなりません。 .Sp `\|\c .B \-mno-fp-ret-in-387\c \&\|' オプションを指定すると、浮動小数点数も通常の CPU レジスタに入れ て返されます。 .TP .B \-mprofiler-epilogue .TP .B \-mno-profiler-epilogue 関数から抜けるコードにてプロファイル情報を書き出す追加コードを生成します。 .PP 以下は HPPA ファミリ用に定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-mpa-risc-1-0 PA 1.0 プロセッサ用のコードを出力します。 .TP .B \-mpa-risc-1-1 PA 1.1 プロセッサ用のコードを出力します。 .TP .B \-mkernel カーネルに適したコードを生成します。特に、引数の 1 つとして DP レジスタを とる .B add\c \& 命令の使用を抑制し、その代わりに、\c .B addil\c \& 命令を生成します。これは HP-UX リンカの深刻なバグを避けるための措置です。 .TP .B \-mshared-libs HP-UX 共有ライブラリとリンクさせるコードを生成します。このオプションはま だ完全に動作しているわけではなく、どの PA ターゲットにおいてもデフォルト になっていません。このオプションを指定すると、コンパイラは誤ったコード を出力し得ます。 .TP .B \-mno-shared-libs 共有ライブラリとリンクしないコードを生成します。これは全ての PA ターゲット においてデフォルトのオプションです。 .TP .B \-mlong-calls 関数の呼び出し先と呼び出し元が同一ファイルに含まれた場合、呼び出し時の 距離が 256K を越える場合でも動作するようなコードを出力します。 このオプションは、リンカから \*(lqbranch out of range errors\*(rq で リンクを拒否された時以外には使用しないようにしてください。 .TP .B \-mdisable-fpregs いかなる形においても、浮動小数点レジスタの使用を禁止します。 これは浮動小数点レジスタに配慮しないコンテキストスイッチを行なう カーネルに対して有効です。 このオプションを使用して、浮動小数点処理を行なおうとすると、 コンパイラはアボートします。 .TP .B \-mdisable-indexing コンパイラに対して、indexing addressing mode を使用しないように指定します。 これによって MACH において MIG によって生成されたコードをコンパイルす る際の、あまり重要でないいくつかの問題を防ぐことができます。 .TP .B \-mtrailing-colon ラベル定義の後にコロンを加えます (ELF アセンブラ用)。 .PP 以下は、Intel 80960 ファミリ用に定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .BI "\-m" "cpu-type" デフォルトのマシンタイプを .I cpu-type に仮定します。これは生成する命令とアドレッシングモード、そして境界条件に 関係します。 デフォルトの .I cpu-type は .BR kb です。その他の選択としては .BR ka , .BR mc , .BR ca , .BR cf , .BR sa , .BR sb があります。 .TP .B \-mnumerics .TP .B \-msoft\-float .B \-mnumerics オプションはプロセッサが浮動小数点命令をサポートすることを示します。 .B \-msoft\-float オプションは浮動小数点サポートを仮定しないことを示します。 .TP .B \-mleaf\-procedures .TP .B \-mno\-leaf\-procedures 葉に位置する手続きについて、 .IR call 命令と同様に .I bal 命令でも呼び出すことを可能とします (あるいは、しません)。これは .I bal 命令がアセンブラ、またはリンカによって置き換えられ得る場合には、直接呼 び出しに対して効率の良いコードを得ることができます。ただし、それ以外の場 合は効率の良くないコードを生成します。例えば、関数へのポインタ経由の呼び 出しや、この最適化をサポートしないリンカを使用した場合などがこれ に該当します。 .TP .B \-mtail\-call .TP .B \-mno\-tail\-call (マシン非依存の部分を越えて) 末尾再帰を分岐に変換する処理に関するさ らなる最適化を行います(または行いません)。 この手法の適用が正当でないということに関する判断 が完全ではないので、まだこのオプションを使用することは適当でないかも しれません。デフォルトは .BR \-mno\-tail\-call です。 .TP .B \-mcomplex\-addr .TP .B \-mno\-complex\-addr この i960 の実装では複雑なアドレッシングモードの使用が優位であると仮定 します (あるいは仮定しません)。複雑なアドレッシングモードは K-シリーズでは 使用する価値は無いかも知れませんが、 C-シリーズでは確かに使用する価値があります。 現在は .B \-mcomplex\-addr が、CB と CC を除く全てのプロセッサにおけるデフォルトです。 .TP .B \-mcode\-align .TP .B \-mno\-code\-align より高速なフェッチのためにコードを 8 バイトにアラインします (または何も しません)。現在では C シリーズの実装においてのみデフォルトで有効にしています。 .TP .B \-mic\-compat .TP .B \-mic2.0\-compat .TP .B \-mic3.0\-compat iC960 v2.0 または v3.0 との互換性を持たせます。 .TP .B \-masm\-compat .TP .B \-mintel\-asm iC960 アセンブラとの互換性を持たせます。 .TP .B \-mstrict\-align .TP .B \-mno\-strict\-align アラインされないアクセスを許可しません (あるいは許可します)。 .TP .B \-mold\-align Intel による gcc リリースバージョン 1.3 (gcc 1.37 ベース) との構造体の 境界条件に関する互換性を持たせます。現在は、 .B #pragma align 1 が同時に仮定されてしまい、無効化できないというバグを持っています。 .PP 以下は、DEC Alpha 用に定義された `\|\c .B \-m\c \&\|' オプションです。 .TP .B \-mno-soft-float .TP .B \-msoft-float 浮動小数点操作に対して、ハードウェアによる浮動小数点命令を使用します (し ません)。もし、\c .B \-msoft-float\c \& が指定された場合は、`\|\c .B libgcc1.c\c \&\|' 内の関数が浮動小数点演算に使用されます。ただし、これらのルーチンが 浮動小数点演算をエミュレートするルーチンによって置き換えられているか、 そのようなエミュレーションルーチンを呼び出すようにコンパイルされている のでない限り、これらのルーチンは浮動小数点演算を行なってしまいます。浮動小 数点演算のない Alpha のためのコンパイルを行なうためには、ライブラリも これらを呼び出さないようにコンパイルされていなければなりません。 .Sp 浮動小数点演算のない Alpha の実装は、浮動小数点レジスタを必要とすると いうことに注意して下さい。 .TP .B \-mfp-reg .TP .B \-mno-fp-regs 浮動小数点レジスタセットを使用する (使用しない)コードを生成します。 .B \-mno-fp-regs\c \& は暗黙のうちに \c .B \-msoft-float\c \& を含みます。浮動小数点レジスタセットが使用されない場合は、浮動小数点 オペランドは整数レジスタに入れられて渡され、浮動小数点数の結果は $f0 では なく $0 に入れて返されます。これは非標準の関数呼び出し手順であり、 浮動小数点数の引数や返り値を持つ関数で、\c .B \-mno-fp-regs\c \& をつけてコンパイルされたコードから呼び出される関数はすべてこのオプションを つけてコンパイルされている必要があります。 .Sp このオプションの典型的な用法は、浮動小数点レジスタを使用せず、したがっ て浮動小数点レジスタへのセーブもリストアも必要のないカーネルを構築する 時などがあるでしょう。 .PP ここに追加するオプションは System V Release 4 において、これらのシステム上の 他のコンパイラとの互換性のために提供されるものです。 .TP .B \-G SVr4 システムにおいて、\c .B gcc\c \& は `\|\c .B \-G\c \&\|' オプションを受け付けます (そして これをシステムリンカに渡します)。これは他のコンパイラとの互換性のためです。 しかし、リンカオプションを \c .B gcc のコマンドラインから渡すよりも、我々は `\|\c .B \-symbolic\c \&\|' または `\|\c .B \-shared\c \&\|' の使用が適当であると考えています。 .TP .B \-Qy コンパイラが使用したそれぞれのツールのバージョンを .B .ident\c \& アセンブラディレクティブを使用して、出力で明示します。 .TP .B \-Qn .B .ident\c \& ディレクティブを出力に加えることを抑制します (これは デフォルトです)。 .TP .BI "\-YP," "dirs" `\|\c .B \-l\c \&\|' で指定されたライブラリに対して、 .I dirs\c で規定されたディレクトリのみを検索し、他は検索しません。 .I dirs\c \& 中は、1 つのコロンで区切ることにより、 複数のディレクトリエントリを記述します。 .TP .BI "\-Ym," "dir" M4 プリプロセッサを \c .I dir\c \& に検索します。アセンブラがこのオプションを使用します。 .SH コード生成オプション これらのマシン独立オプションは、 コード生成にて使用されるインタフェース規約を制御します。 .PP これらのほとんどは `\|\c \-f\c \&\|' で始まります。これらのオプションは有効形式と無効形式の 2 つの形式を持っ ています。`\|\c .B \-ffoo\c \&\|' の無効形式は `\|\c .B \-fno\-foo\c \&\|' です。以下に挙げる表においては、このうち、デフォルトではない片 方のみが挙げられています。`\|\c .B no\-\c \&\|' を追加するか、削除するかによって双方の形式を得ることができます。 .TP .B \-fnonnull\-objects 参照型によって参照されるオブジェクトはヌルでないと仮定します (C++ のみ)。 .Sp 通常は GNU C++ は参照型によって参照されるオブジェクトに関しては保守的 な仮定を行います。例えば、コンパイラは \c .B a が以下のコードにおいてヌルでないことをチェックする必要があります。 .Sp obj &a = g (); a.f (2); .Sp この種の参照がヌルでないことのチェックは、特別なコードを必要とします。 しかし、これは多くのプログラムにとって無用なものです。 このヌルに対するチェックを必要のない場合 `\|\c .B \-fnonnull-objects\c \&\|' を使用することにより、省略することができます。 .TP .B \-fpcc\-struct\-return .B struct\c \& と \c .B union の値を返す場合に、普通の C コンパイラが行なうのと同じ規約を使用します。 この規約は小規模な構造体に対して非効率なものとなり、また多くのマシンでその 関数を再入不可能としてしまいます。しかしこれは、GCC でコンパイルされたコード と PCC でコンパイルされたコードを相互に呼び出すことを可能とするとい う利点を持ちます。 .TP .B \-freg\-struct\-return .B struct と .B union の値を返す場合に、可能な場合はレジスタを使用する規約を使用します。これは .BR \-fpcc\-struct\-return を使用した場合と比較して、小さな構造体を返す場合に高い性能を発揮します。 .Sp .B \-fpcc\-struct\-return と .BR \-freg\-struct\-return のどちらも使用しなかった場合には、GNU CC は各ターゲットに対して標準で あると考えられる規約をデフォルトとして使用します。 もし標準規約がなかった場合は、 .BR \-fpcc\-struct\-return をデフォルトとして使用します。 .TP .B \-fshort\-enums .B enum\c \& 型に対して、ちょうど取り得る値の範囲に応じたバイト数の型を与えます。 具体的には、\c .B enum\c \& 型は、その値域を格納するに十分な最小の整数型と等価になります。 .TP .B \-fshort\-double .B double を .B float \& と同サイズにします。 .TP .B \-fshared\-data データと非 \c .B const\c \& 変数を、プライベートなデータではなく、共有データとしてコンパイルします。 このオプションは、走行中の同じプログラム間は共有データが共有され、 プライベートデータがそれぞれのプロセスに 1 つずつ与えられるような一部 のオペレーティングシステムで意味を持ちます。 .TP .B \-fno\-common bss セクション中の初期化されていないグローバル変数に対してでも、共通ブロック に生成するのではなく、領域を割り当てます。このオプションは、(\c .B extern\c \& をつけずに) 同一の変数を宣言した 2 つのコンパイルに対して、リンク時 にエラーを発生するという効果があります。このオプションは、常にこのような動 作を行なうシステムにおいても、プログラムが正常に動作するかどうかを検査 する場合にのみ有用です。 .TP .B \-fno\-ident `\|\c .B #ident\c \&\|' ディレクティブを無視します。 .TP .B \-fno\-gnu\-linker (C++ のコンストラクタとデストラクタのような) グローバルな初期化のコードを (GNU リンカがこれらを扱う標準のシステムであるようなシステムにおいて) GNU リンカで使用される形式で出力しません。これは GNU リンカではない リンカを使用する場合に指定します。この場合、 .B collect2\c \& を使用して、確実にシステムリンカにコンストラクタとデストラクタを含 んだコードを出力させる必要があります。(\c .B collect2\c \& は GNU CC のディストリビューションに含まれます。) \c .B collect2 \c を\c .I 必ず使用しなければならない\c \& システムにおいては、 コンパイラドライバ \c .B gcc\c \& は自動的にそのようにコンフィギュレーションされます。 .TP .B \-finhibit-size-directive .B .size\c アセンブラディレクティブなど、関数が途中で分割され、メモリ上の異なった 位置にそれぞれの部分が配置されるような場合に不都合が生じるような要素を 出力しません。このオプションは `\|\c .B crtstuff.c\c \&\|' をコンパイルする時に使用されます。それ以外の場所ではこれを使用する 必要はありません。 .TP .B \-fverbose-asm 出力のアセンブラ中に特別なコメント情報を追加し、可読性を高めます。この オプションは一般的には、出力のアセンブラコードを本当に読みたい場合 (例え ばコンパイラ自身をデバッグしているような場合) にのみ効果があります。 .TP .B \-fvolatile ポインタによるメモリの参照を全て volatile として扱います。 .TP .B \-fvolatile\-global 外部変数やグローバルデータアイテムへのメモリ参照を全て volatile として 扱います。 .TP .B \-fpic このオプションがターゲットマシンでサポートされていれば、位置独立なコードを 出力します。このオプションは共有ライブラリでの使用に適します。 .TP .B \-fPIC このオプションがターゲットマシンでサポートされていれば、位置独立なコードを 出力します。このオプションはダイナミックリンクに適しており、分岐にお いて大きなディスプレースメントを要求する場合にも適応します。 .TP .BI "\-ffixed\-" "reg" 名前が \c .I reg\c \& のレジスタを固定レジスタとして扱います。生成されたコードはこのレジスタ を参照しません (ただし、スタックポインタ、フレームポインタ、その他固定用 途の場合を除きます)。 .Sp .I reg\c \& はレジスタ名でなければなりません。受け付けられるレジスタ名はマシン固 有であり、マシン記述マクロファイル内の \c .B REGISTER_NAMES マクロに記述されたものです。 .Sp このフラグは無効形式を持ちません。なぜなら、これは 3 通りの指定が可能で あるからです。 .TP .BI "\-fcall\-used\-" "reg" 名前が \c .I reg\c \& のレジスタを、関数呼び出しによって破壊される割り当て可能のレジスタ として取り扱います。これは、関数呼び出しを跨いで存在しない一時領域や変数 として割り当ることができます。この指定でコンパイルされた関数は、レジスタ \c .I reg\c \& の保存や復帰を行いません。 .Sp このフラグをマシンの実行モデルにおいて、ある固定的で特殊な役割を持って いるレジスタ、例えばスタックポインタやフレームポインタに対して適用する ことは、破滅的な結果を生みます。 .Sp このフラグは無効形式を持ちません。なぜなら、これは 3 通りの指定が可能で あるからです。 .TP .BI "\-fcall\-saved\-" "reg" 名前が \c .I reg\c \& のレジスタを、関数によって保存される割り当て可能なレジスタとして取 り扱います。これは、関数呼び出しを跨いで存在する一時領域や変数としても割り 当てることができます。この指定でコンパイルされた関数は、レジスタ \c .I reg\c \& を使用する場合、その保存と復帰を行います。 .Sp このフラグをマシンの実行モデルにおいて、ある固定的で特殊な役割を持って いるレジスタ、例えばスタックポインタやフレームポインタに対して適用する ことは、破滅的な結果を生みます。 .Sp また、このフラグを関数の返り値が格納されるレジスタに使用すると、これも 破滅的な結果を生みます。 .Sp このフラグは無効形式を持ちません。なぜなら、これは 3 通りの指定が可能で あるからです。 .SH プラグマ 2 つの `\|\c .B #pragma\c \&\|' ディレクティブ(指令)が GNU C++ によってサポートされています。これは、1 つのヘッダファイルを 2 つの目的、つまりあるオブジェクトクラスのための インタフェースの定義としての目的と、オブジェクトクラスに含まれる内容 の完全な定義としての目的の、両方の目的で使用するためのものです。 .TP .B #pragma interface (C++ のみ) このディレクティブを、オブジェクトクラスを定義しているヘッダファイル中 に使用することによって、それらのクラスを使用するほとんどのオブジェクト ファイルの大きさを減少させることができます。通常は、 特定の情報 (インラインメンバ関数のバックアップコピー、デバッグ情報、 仮想関数実現のための内部テーブル) の複製がそのクラス定義をインクルードした それぞれのオブジェクトファイル中に置かれます。 このプラグマを使用することによって、このような複製を防ぐことが 可能となります。`\|\c .B #pragma interface\c \&\|' を含んだヘッダファイルをインクルードした場合は、これらの追加情報 は生成されません (ただし、メインの入力ソースファイル自身が `\|\c .B #pragma implementation\c \&\|' を含んでいる場合を除きます)。そのかわり、オブジェクトファイルは リンク時に解決される参照を含むことになります。 .TP .B #pragma implementation .TP \fB#pragma implementation "\fP\fIobjects\fP\fB.h"\fP (C++ のみ) インクルードされたヘッダファイルによる完全な出力を生成させたい (またそ れをグローバルに可視化したい) 場合には、メインの入力ファイル中でこの プラグマを使用します。この場合、インクルードされるヘッダファイルは、`\|\c .B #pragma interface\c \&\|' を使用していなければなりません。インライン関数のバックアップ情報、 デバッグ情報、仮想関数実現用の内部テーブルは、全てインプリメンテーション ファイル中に生成されます。 .Sp `\|\c .B #pragma implementation\c \&\|' を、引数をつけずに使用した場合は、これはそのソースファイルと同じ ベースネーム(basename)を持つファイルに対して適用されます。例えば、`\|\c .B allclass.cc\c \&\|' 中の `\|\c .B #pragma implementation\c \&\|' は、`\|\c .B #pragma implementation \*(lqallclass.h\*(rq \c \&\|' と等価です。もし複数のヘッダファイルに対して、 1 つのインプリメンテーションファイルを対応させたい場合は、 文字列の引数を使用する必要があります。 .Sp 1 つのヘッダファイルに対して、複数のインプリメンテーションファイルを対 応させる方法はありません。 .SH 関連ファイル .nf .ta \w'LIBDIR/g++\-include 'u file.c C 言語ソースファイル file.h C 言語ヘッダ (プリプロセッサ) ファイル file.i プリプロセス済みの C 言語ソースファイル file.C C++ ソースファイル file.cc C++ ソースファイル file.cxx C++ ソースファイル file.m Objective-C ソースファイル file.s アセンブリ言語ファイル file.o オブジェクトファイル a.out リンクエディット済みの出力 \fITMPDIR\fR/cc\(** 一時ファイル群 \fILIBDIR\fR/cpp プリプロセッサ \fILIBDIR\fR/cc1 C 言語コンパイラ \fILIBDIR\fR/cc1plus C++ コンパイラ \fILIBDIR\fR/collect いくつかのマシンで必要となるリンカのフロントエンド \fILIBDIR\fR/libgcc.a GCC サブルーチンライブラリ /lib/crt[01n].o スタートアップルーチン \fILIBDIR\fR/ccrt0 C++ 用の付加的なスタートアップルーチン /lib/libc.a 標準ライブラリ、\c .IR intro (3) \c を参照 /usr/include \fB#include\fP ファイルのための標準ディレクトリ \fILIBDIR\fR/include \fB#include\fP ファイルのための GCC 標準ディレクトリ \fILIBDIR\fR/g++\-include \fB#include\fP ファイルのための付加的な g++ ディレクトリ .Sp .fi .I LIBDIR は通常 .B /usr/local/lib/\c .IR machine / version の形式を持ちます .br .I TMPDIR は環境変数 .B TMPDIR (もし使用可能ならば .B /usr/tmp を、そうでなければ .B /tmp\c \& を使用します) からとられます。 .SH "関連項目" cpp(1), as(1), ld(1), gdb(1). .br .B info \c 中の .RB "`\|" gcc "\|', `\|" cpp \|', .RB "`\|" as "\|', `\|" ld \|', .RB `\| gdb \|' \& エントリ .br .I Using and Porting GNU CC (for version 2.0)\c , Richard M. Stallman; .I The C Preprocessor\c , Richard M. Stallman; .I Debugging with GDB: the GNU Source-Level Debugger\c , Richard M. Stallman and Roland H. Pesch; .I Using as: the GNU Assembler\c , Dean Elsner, Jay Fenlason & friends; .I ld: the GNU linker\c , Steve Chamberlain and Roland Pesch. .SH バグ バグを報告する方法については、GCC マニュアルを参照してください。 .SH COPYING Copyright .if t \(co 1991, 1992, 1993 Free Software Foundation, Inc. .PP Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. .PP Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. .PP Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English. .SH 作者 GNU CC に対して貢献した人々に関しては、GNU CC マニュアルを参照してください。 .SH 日本語訳 細川 達己(hosokawa@mt.cs.keio.ac.jp): NetBSD 用に翻訳 .br sakai@csl.cl.nec.co.jp, h-nokubi@nmit.mt.nec.co.jp, .br kumano@strl.nhk.or.jp, horikawa@isrd.hitachi.co.jp: FreeBSD 向けに修正, 査閲 diff --git a/ja_JP.eucJP/man/man1/lex.1 b/ja_JP.eucJP/man/man1/lex.1 index e72307fe79..750dcd3412 100644 --- a/ja_JP.eucJP/man/man1/lex.1 +++ b/ja_JP.eucJP/man/man1/lex.1 @@ -1,4071 +1,4072 @@ .\" jpman %Id: lex.1,v 1.3 1997/05/19 16:38:22 horikawa Stab % .TH FLEX 1 "April 1995" "Version 2.5" .SH 名称 flex \- 高速な字句解析処理系の生成ツール .SH 書式 .B flex -.B [\-bcdfhilnpstvwBFILTV78+? \-C[aefFmr] \-Pprefix \-Sskeleton] +.B [\-bcdfhilnpstvwBFILTV78+? \-C[aefFmr] \-ooutput \-Pprefix \-Sskeleton] +.B [\-\-help \-\-version] .I [filename ...] .SH 概説 本マニュアルは、 テキストのパターンマッチングを行うプログラムを生成するツール .I flex を扱います。 本マニュアルはチュートリアルとリファレンス節とを含みます: .nf 解説 ツールの短い概説 簡単な例 入力ファイルのフォーマット パターン flex が使用する拡張した正規表現 入力のマッチ方法 何がマッチするかを決定する規則 アクション パターンがマッチした時に何を行うかを指定する方法 生成されたスキャナ flex が生成するスキャナに関する詳細; 入力元の制御方法 開始条件 スキャナへの文脈の導入と、 "ミニスキャナ" の制御方法 複数の入力バッファ 複数の入力元を扱う方法; ファイルではなく文字列からスキャンする方法 ファイルの終りのルール ファイルの終りにマッチする特別なルール 雑多なマクロ アクションで使用可能なマクロのまとめ ユーザが使用可能な値 アクションで使用可能な値のまとめ Yacc とのインタフェース lex スキャナと yacc パーサとの結合 オプション flex のコマンドラインオプションと、 "%option" ディレクティブ 性能関連 スキャナを可能な限り高速にする方法 C++ スキャナの生成 C++ スキャナクラス生成のための (実験的な) 機能 Lex および POSIX との非互換性 AT&T lex および POSIX lex 標準と flex との違い 診断 flex (もしくは生成したスキャナ) が出力する エラーメッセージで意味が明確でないもの 関連ファイル flex が使用するファイル 欠陥 / バグ flex の既知の問題 関連項目 ツールに関係する他のドキュメント 作者 連絡方法を含みます .fi .SH 解説 .I flex は .I スキャナ を生成するためのツールです。 ここで、スキャナとは、 テキスト内の字句パターンを解析するプログラムです。 .I flex は指定したファイル、もしくはファイル名が与えられなかった場合は 標準入力から、生成するスキャナの記述を読み込みます。 この記述は、 正規表現と C コードのペアの形をとっています。 これは .I ルール と呼ばれます。 .I flex は、出力として C ソースファイルの .B lex.yy.c を生成しますが、その中に .B yylex() ルーチンが定義されます。 このファイルはコンパイルされ、 .B \-ll ライブラリとともにリンクされて、 実行形式となります。 実行形式が走り始めると、 正規表現をマッチさせるために 入力が解析されます。 マッチするものを見つけると、対応する C コードが実行されます。 .SH 簡単な例 .PP まず簡単な例から、 .I flex の使い方を見て行きましょう。 次の .I flex の入力は、"username" という文字列に出会うとユーザのログイン名に置き換える スキャナを指定しています: .nf %% username printf( "%s", getlogin() ); .fi デフォルトでは、 .I flex スキャナにマッチしなかったテキストは出力にコピーされますので、 "username" を展開しながら入力を出力にコピーすることが このスキャナの最終的な結果となります。 この入力にはただ一つのルールだけがあります。 "username" は .I パターン であり、"printf" は .I アクション です。 "%%" はルールの始まりの印です。 .PP 別の例を見て見ましょう: .nf %{ int num_lines = 0, num_chars = 0; %} %% \\n ++num_lines; ++num_chars; . ++num_chars; %% main() { yylex(); printf( "# of lines = %d, # of chars = %d\\n", num_lines, num_chars ); } .fi このスキャナは入力の文字数および行数を数えます (数えた最終結果を報告するだけです)。 最初の行は 2 つの大域変数 "num_lines" と "num_chars" を宣言します。 これらの変数は、2 番目の "%%" の後に宣言されている .B yylex() と .B main() のルーチンからアクセス可能です。 ここには 2 つのルールがあります。 1 つ目は改行文字 ("\\n") にマッチし、行数と文字数のカウントを増加させます。 もう 1 つは、改行文字以外の全ての文字 ("." という正規表現で表されています)にマッチします。 .PP 次はもうちょっと複雑な例です: .nf /* scanner for a toy Pascal-like language */ %{ /* need this for the call to atof() below */ #include %} DIGIT [0-9] ID [a-z][a-z0-9]* %% {DIGIT}+ { printf( "An integer: %s (%d)\\n", yytext, atoi( yytext ) ); } {DIGIT}+"."{DIGIT}* { printf( "A float: %s (%g)\\n", yytext, atof( yytext ) ); } if|then|begin|end|procedure|function { printf( "A keyword: %s\\n", yytext ); } {ID} printf( "An identifier: %s\\n", yytext ); "+"|"-"|"*"|"/" printf( "An operator: %s\\n", yytext ); "{"[^}\\n]*"}" /* eat up one-line comments */ [ \\t\\n]+ /* eat up whitespace */ . printf( "Unrecognized character: %s\\n", yytext ); %% main( argc, argv ) int argc; char **argv; { ++argv, --argc; /* skip over program name */ if ( argc > 0 ) yyin = fopen( argv[0], "r" ); else yyin = stdin; yylex(); } .fi これは Pascal のような言語の単純なスキャナの原型です。 異なったタイプの .I トークン を定義し、これを見付けると報告します。 .PP この例の詳細は、以降の節で説明します。 .SH 入力ファイルのフォーマット .I flex の入力ファイルは 3 つの部分からなり、 .B %% だけからなる行により分けられます: .nf 定義 %% ルール %% ユーザコード .fi .I 定義 部分は、スキャナの宣言を単純化する単純な .I 名前 の定義の宣言と、後で説明する .I 開始条件 の宣言とからなります。 .PP 名前の定義は次の形式です: .nf 名前\ 定義 .fi "名前" は語であり、 レターかアンダースコア ('_') から始まって 0 個以上のレター・数字・'_'・'-' (ダッシュ)が続きます。 定義は、名前に続く最初の非空白文字から始まり、行末まで続くものとされます。 定義は後で "{名前}" で参照でき、"(定義)" を展開します。 例えば、 .nf DIGIT [0-9] ID [a-z][a-z0-9]* .fi は、 "DIGIT" が単一の数字にマッチする正規表現であると定義し、 "ID" がレターに 0 個以上のレターか数字が続く正規表現であると定義します。 後で出て来る参照 .nf {DIGIT}+"."{DIGIT}* .fi は .nf ([0-9])+"."([0-9])* .fi と同じであり、1 個以上の数字に '.' が続き、 0 個以上の数字が続くものにマッチします。 .PP .I flex の入力の .I ルール は次の形式の一連のルールからなります: .nf パターン\ \ \ アクション .fi ここで、パターンはインデントされていてはならず、 アクションは同じ行から始まる必要があります。 .PP パターンとアクションの詳細は後の解説を見て下さい。 .PP 最後に、ユーザコードの部分は単純にそのままの形で .B lex.yy.c にコピーされます。 スキャナを呼び出すまたは呼び出される付随ルーチンのために使用されます。 この部分はあっても無くても構いません; 無い場合には、入力ファイル中の 2 番目の .B %% も省略できます。 .PP 定義とルールの部分では、 .I インデントされた テキストと .B %{ と .B %} との間のテキストはそのままの形で出力にコピーされます (この際 %{} は削除されます)。 %{} はインデントされていない行に現れる必要があります。 .PP ルールの部分では、 最初のルールの前に現れるインデントされたもしくは %{} 部分のテキストは、 スキャンルーチンにローカルな変数と、 (宣言の後では)スキャンルーチンに入るたびに実行されるコードとを宣言します。 ルール部分の他のインデントされたもしくは %{} 部分のテキストは 出力にコピーされますが、 意味はちゃんと定義されておらずコンパイル時にエラーとなるかも知れません (この仕様は .I POSIX 互換のためにあります; 他のこのような仕様は以降を見て下さい)。 .PP 定義の部分(ルールの部分ではないです)では、 インデントされていないコメント("/*" から始まる行) は次の "*/" まで そのままの形でコピーされます。 .SH パターン 入力ファイルのパターンは拡張した正規表現を使って記述します。 以下に示します: .nf x 文字 'x' にマッチ。 . 改行を除く全ての文字(バイト)。 [xyz] "文字クラス"; この場合、'x', 'y', 'z' のいずれにも マッチします。 [abj-oZ] 範囲指定を含む "文字クラス"; この場合、'a', 'b' と 'j' から 'o' までの任意のレターと 'Z' にマッチします。 [^A-Z] "否定文字クラス"; クラスに含まれない任意の文字に マッチします。 この場合、'A' から 'Z' までの大文字 「以外の」文字にマッチします。 [^A-Z\\n] 大文字と改行を「除く」全ての文字。 r* 0 もしくはそれ以上の r。r は任意の正規表現。 r+ 1 もしくはそれ以上の r。 r? 0 もしくは 1つの r (「おまけ」の r) r{2,5} 2 つから 5つまでの r。 r{2,} 2 つ以上の r。 r{4} ちょうど 4つ の r。 {名前} "名前" の定義の展開。 (上を参照) "[xyz]\\"foo" 文字列 [xyz]"foo \\X X が 'a', 'b', 'f', 'n', 'r', 't', 'v' のいずれかの とき、ANSI-C での \\X の解釈となります。 それ以外の場合、文字 'X' ('*' のようなオペレータの 意味を打ち消し、その文字自体を指定する際に使います)。 \\123 8進数で 123 と表される文字。 \\x2a 16進数で 2a と表される文字。 (r) r にマッチ; ()は 優先順位を変えるために使用。 (以下を参照) rs 正規表現 r に正規表現 s が続く; 「連結(concatenation)」 と呼びます。 r|s r もしくは s。 r/s 後ろに s が続く時の r。 s にマッチするテキストはこのルールの "最長適合" を判定する 時には含まれますが、アクションが実行される前に 入力に戻されます。 アクションは r にマッチするテキストだけを見ます。 このパターンは "右文脈(trailing context)" と呼ばれます。 (flex が正確にマッチ不能な r/s の組合せは複数あります; "危険な右文脈" については、 以降の、欠陥 / バグ の節の記述を見て下さい。) ^r 行頭にある r。(スキャンの始まりもしくは スキャンされた改行の右です)。 r$ 行末にある r。"r/\\n" と等価(改行の前です)。 "r/\\n" と同じです。 flex の "改行" の表現は flex をコンパイルした C コンパイラが解釈する '\\n' と完全に一致することに 注意して下さい; 特定のシステム DOS では \\r を入力から取り除くか "r$" を表すために明示的に r/\\r\\n を使用する必要があります。 r 開始条件 s における r。(開始条件については以下を 参照)。 r 上に同じ。ただし開始条件は s1, s2, s3 のいずれでもよい。 <*>r 任意の開始条件の r。開始条件は排他的なものでもよい。 <> ファイルの終了。 <> 開始条件が s1 もしくは s2 であるときのファイルの終了。 .fi 文字クラス中では、全ての正規表現のオペレータは、 エスケープ ('\\') および 文字クラスオペレータである '-' と ']' とクラスの先頭の '^' を除き 特別な意味を失うことに注意して下さい。 .PP 上に挙げた正規表現は優先順位によってグループに分けられています。 一番上のグループが最も高い優先度で、 一番下のグループの優先順位が最も低くなっています。 グループ内では同じ優先順位です。例えば、 .nf foo|bar* .fi は .nf (foo)|(ba(r*)) .fi と同じです。なぜなら '*' オペレータは連結より優先度が高く、 連結は選言 ('|') より優先度が高いからです。このパターンは 文字列 "foo" .I もしくは 文字列 "ba" に 0 個以上の r がつづくものの .I どちらにも マッチします。 "foo" もしくは 0 個以上の "bar" にマッチさせるためには次の表現を使用して下さい: .nf foo|(bar)* .fi 0 個以上の "foo" または "bar" にマッチするためには次の表現を使用して下さい: .nf (foo|bar)* .fi .PP 文字もしくは文字範囲に加え、文字クラスも文字クラスの .I 表現 を含みます。 これらの表現は .B [: および .B :] のデリミタに囲まれます (文字クラスの '[' と ']' との間に現れる必要があります; 他の要素が文字クラス中に現れても構いません)。 有効な表現は以下の通りです: .nf [:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:] .fi これらの表現は対応する標準 C の .B isXXX 関数に適合する全ての文字集合を指示します。例えば、 .B [:alnum:] は .B isalnum() が真を返す文字を指示します - すなわちすべてのアルファベットと数字です。 .B isblank(), が無いシステムでは、flex は .B [:blank:] を空白とタブと定義します。 .PP 例えば以下の表現は全て同じです: .nf [[:alnum:]] [[:alpha:][:digit:]] [[:alpha:]0-9] [a-zA-Z0-9] .fi スキャナが大文字小文字を意識しない場合( .B \-i フラグ指定時) .B [:upper:] と .B [:lower:] は .B [:alpha:] と同じです。 .PP パターンに関する注意点です: .IP - 否定文字クラス、例えば上の "[^A-Z]" は "\\n" (もしくはこれを表すエスケープシーケンス) が明示的に 否定文字クラスに現れている場合 (例えば "[^A-Z\\n]") を除き .I 改行にマッチします。 これは他の正規表現ツールが否定文字クラスを扱う方法とは異なりますが、 不幸なことにこの矛盾は歴史的に確立しています。 改行にマッチするとは、 入力に別のクオートが存在しない場合に [^"]* のようなパターンが 入力全体にマッチすることを意味します。 .IP - ルールは右文脈('/' オペレータもしくは '$' オペレータ) を高々一つしか持てません。 開始条件 '^' と "<>" パターンは パターンの最初になければならず、 '/', '$' 同様に () 内にいれることは出来ません。 ルールの先頭ではない '^' もしくはルールの終りではない '$' は 特別な意味を失い、通常の文字として扱われます。 .IP 以下は無効です: .nf foo/bar$ foobar .fi 前者は "foo/bar\\n" と書けます。 .IP 以下では '$' と '^' とは通常の文字として扱われます: .nf foo|(bar$) foo|^bar .fi "foo" もしくは "改行が続く bar" を指定したい場合は、 次の表現を使用して下さい (特別な '|' の動作は後で説明します): .nf foo | bar$ /* action goes here */ .fi 同じ方法で、foo もしくは 行頭の bar を指定可能です。 .SH 入力のマッチ方法 生成したスキャナを実行すると、 スキャナは入力を見てパターンにマッチする文字列を探します。 1 より多くのマッチを見付けると、最長テキストのマッチを採用します (右文脈(trailing context rule)の後ろの部分も長さに含みますが、 後ろの部分は入力に戻されます)。 同じ長さのマッチを 2 つ以上見付けた場合、 .I flex 入力ファイルで最初に記述されたルールを採用します。 .PP マッチが決定すると、マッチに対応するテキスト( .I トークン と呼ばれます)がグローバル文字ポインタ .B yytext により使用可能となり、長さがグローバル整数 .B yyleng により使用可能となります。 その後、マッチしたパターンに対応する .I アクション が実行され(アクションの詳細な記述は後で行います)、 残りの入力が残りのマッチのためにスキャンされます。 .PP マッチが見付からないと、 .I デフォルトルール が実行されます: 入力の次の文字がマッチしたと見倣され、 標準出力にコピーされます。最も簡単で正当な .I flex の入力は以下の通りです: .nf %% .fi これは、入力を単純に出力にコピー(1 度に 1 文字ずつ)するスキャナを生成します。 .PP .B yytext は 2 つの異なった方法により定義されうることに注意して下さい: 文字 .I ポインタ もしくは文字 .I 配列 です。 .I flex がどちらの定義を使用するかは特別なディレクティブ .B %pointer もしくは .B %array を flex の入力の最初の(定義)部分に含めることにより制御できます。 デフォルトは .B %pointer であり、 .B -l lex 互換オプションを使用した場合には例外的に .B yytext は配列になります。 .B %pointer を使用する利点はスキャンが高速であること、 非常に大きなトークンにマッチする時にも (動的メモリを使用し尽くさない限り)バッファオーバフローとならないことです。 欠点は、アクションが .B yytext を修正することが制限されること(次節参照)、 .B unput() 呼び出しが .B yytext の現在の内容を破壊することです。 これは異なる .I lex バージョン間での移植性に関する頭痛の種です。 .PP .B %array の利点は .B yytext の内容を思った通りに変更できること、 .B unput() を呼び出しても .B yytext の内容が破壊されないことです(下記参照)。 その上、既存の .I lex プログラムは .B yytext を外部から次の形式の宣言を使用してアクセスしていることがあります: .nf extern char yytext[]; .fi この定義は .B %pointer 使用時には誤りですが、 .B %array 使用時には正しいです。 .PP .B %array は .B yytext を文字数 .B YYLMAX (デフォルトは十分大きな値)の配列であると定義します。 この大きさは、 .I flex の入力の最初の部分で単純に .B YYLMAX を異なった値に #define することにより変更できます。 上記の通り、 .B %pointer 使用時には yytext は大きなトークンを格納するために動的に大きくなります。 このことは .B %pointer を使用したスキャナは非常に大きなトークン (例えばコメントブロック全体)を格納可能であることを意味しますが、 スキャナが .B yytext の大きさを変えるたびにトークン全体を先頭から再スキャンすることが必要となるため このようなトークンに対するマッチングは遅くなりうることを覚えておいて下さい。 現在、 .B yytext は .B unput() が結果として返すテキストが大きい時には動的には大きくなり .I ません; 実行時エラーとなります。 .PP また、 .B %array は C++ スキャナクラスでは使用できないことに注意して下さい( .B c++ オプションに関しては下記参照)。 .SH アクション ルール中のパターンは対応するアクションを持ちます。 アクションは任意の C の文です。 パターンは最初のエスケープされていない空白文字で終ります; 行の残りがアクションです。 アクションが空である場合、 パターンがマッチした時に入力トークンは単純に捨てられます。 例えば入力から全ての "zap me" を削除するプログラムの仕様を示します: .nf %% "zap me" .fi (入力の他の全ての文字を出力にコピーします。 なぜならデフォルトルールにマッチするからです。) .PP 次は、複数の空白や文字を単一の空白に圧縮し行末の空白を捨てるプログラムです: .nf %% [ \\t]+ putchar( ' ' ); [ \\t]+$ /* ignore this token */ .fi .PP アクションが '{' を含む場合、アクションは対応する '}' まで続き、 複数行に渡る場合もあります。 .I flex は C の文字列およびコメントに関して知っており、 それらの中のブレースを誤解することはありませんが、 アクションが .B %{ で始まることを許し、次の .B %} までのテキストがアクションであるとします (アクション内部の任意個のブレースには関係ありません)。 .PP 垂直バー ('|') のみからなるアクションは "次のルールと同じ" を意味します。説明は以下を見て下さい。 .PP アクションは任意の C コードを含むことが出来ます。 これには、 .B yylex() を呼び出したルーチンに対して値を返す .B return 文も含まれます。 .B yylex() が呼ばれるたび、最後に残ったトークンから処理を再開し、 ファイルの終了もしくは return を実行するまで処理を行います。 .PP アクションは自由に .B yytext を変更できますが、例外は長さを増やすことです (文字を末尾に加えることになり、 これは入力ストリームの後続する文字を上書きします)。 これは .B %array 使用時には当てはまりません(上述); この場合 .B yytext を自由に変更できます。 .PP アクションは自由に .B yyleng を変更できますが、アクションが .B yymore() を使用する時には例外的に変更してはいけません(後述)。 .PP 多くの特別なディレクティブがあり、アクション中に含めることが出来ます: .IP - .B ECHO yytext をスキャナの出力にコピーします。 .IP - .B BEGIN 後ろに開始条件の名前を書くと、スキャナを対応する開始条件に設定します(後述)。 .IP - .B REJECT 入力(もしくは入力の頭)に "2 番目によく(second best)" マッチするルール に進むようにスキャナに指示します。 "入力のマッチ方法" で示したようにルールは選択され、 .B yytext と .B yyleng は適切に設定されます。 選択されるルールは、最初に選択されたルールと同じ長さであるが .I flex の入力ファイルにて後で出て来るもの、もしくは少ない文字数にマッチするものです。 例えば次の例では入力中の語を数え、 "frob" が見付かるたびにルーチン special() を呼びます: .nf int word_count = 0; %% frob special(); REJECT; [^ \\t\\n]+ ++word_count; .fi .B REJECT が無い場合、 入力中の "frob" は語として数えられず、 スキャナは通常通りトークン毎に 1 つのアクションだけを行います。 複数の .B REJECT を使用可能であり、それぞれ現在有効なルールの次に良い選択を見付けます。 例えば次のスキャナは、"abcd" というトークンをスキャンし、 出力に "abcdabcaba" を書きます: .nf %% a | ab | abc | abcd ECHO; REJECT; .|\\n /* eat up any unmatched character */ .fi (前の 3 つのルールは 4 番目のルールのアクションを共有します。 なぜなら特別な '|' アクションが使用されているからです。) .B REJECT はスキャナの性能という点で特にコストのかかる機能です; もしスキャナのアクションの .I いずれか にでも REJECT が使われたなら、スキャナの .I 全ての マッチング速度を低下させるということです。 さらに .B REJECT をオプション .I -Cf や .I -CF と共に用いることは出来ません。 .IP また、他の特別アクションと違い .B REJECT は .I 分岐(branch) であることに注意してください; すなわち REJECT 直後のアクションは 実行 .I されません。 .IP - .B yymore() 次にルールとマッチしたときには、対応するトークンは、 現在の .B yytext の内容と入れ換えるのではなく .B yytext に .I 追加 するようスキャナに指示します。 例えば、入力 "mega-kludge" が与えられると、以下は "mega-mega-kludge" を出力に書きます: .nf %% mega- ECHO; yymore(); kludge ECHO; .fi 最初の "mega-" はマッチし出力にエコーされます。 次に "kludge" がマッチしますが、直前の "mega-" がまだ .B yytext の先頭に残っており、"kludge" の .ECHO ルールは実際には "mage-kludge" を書きます。 .PP .B yymore() の使用に関し 2 つの注意点があります。 まず、 .B yymore() は現在のトークンの大きさを反映する .I yyleng の値の正確さに依存することであり、 .B yymore() 使用時には .I yyleng を変更してはなりません。 次に、 スキャナのアクションに .B yymore() があると、スキャナのマッチ速度に若干悪影響があります。 .IP - .B yyless(n) 現在のトークンから最初の .I n 文字を除いたものを入力ストリームに戻します。 戻した文字列はスキャナが次のマッチングをとるときに再度スキャンされます。 .B yytext と .B yyleng は適切に調整されます(例えば .B yyleng は .I n となります)。 例えば、入力 "foobar" が与えられると、以下は "foobarbar" を書きます: .nf %% foobar ECHO; yyless(3); [a-z]+ ECHO; .fi 引数 0 を .B yyless に与えると、現在の入力文字列全体が再度スキャンされます。 (例えば .B BEGIN を使用して)次にスキャナが入力する方法を変更していないと、無限ループとなります。 .PP .B yyless はマクロであり、flex 入力ファイルでのみ使用可能であり、 別のソースファイルからは使用不能であることに注意して下さい。 .IP - .B unput(c) 文字 .I c を入力ストリームへ戻します。戻した文字は次にスキャンされる文字になります。 次のアクションは現在のトークンを取り上げ、 括弧内に入れて再スキャンします。 .nf { int i; /* Copy yytext because unput() trashes yytext */ char *yycopy = strdup( yytext ); unput( ')' ); for ( i = yyleng - 1; i >= 0; --i ) unput( yycopy[i] ); unput( '(' ); free( yycopy ); } .fi .B unput() は文字を入力ストリームの .I 先頭 に戻すので、文字列を戻す場合には後ろから前に向かって戻す必要があります。 .PP .B unput() 使用時の重要な潜在的な問題は、 .B %pointer 使用時(デフォルト)に .B unput() を呼び出すと、 右端の文字から開始し 1 文字ずつ左に向かって消費され、 .I yytext の内容が .I 破壊 されることです。 (上記例のように) .B unput() 呼び出し後も .I yytext の内容を保存するためには、始めに別の場所にコピーするか、 スキャナを .B %array を使うように構築することです(入力のマッチ方法参照)。 .PP 最後に、 .B EOF を戻して入力ストリームにファイルの終りをマークするとは 出来ないことに注意して下さい。 .IP - .B input() 次の文字を入力ストリームから読みます。 次の例は C コメントを食べます: .nf %% "/*" { register int c; for ( ; ; ) { while ( (c = input()) != '*' && c != EOF ) ; /* eat up text of comment */ if ( c == '*' ) { while ( (c = input()) == '*' ) ; if ( c == '/' ) break; /* found the end */ } if ( c == EOF ) { error( "EOF in comment" ); break; } } } .fi (スキャナが .B C++ でコンパイルされたときは、このルーチンは .B yyinput() という名称になり、 .B C++ ストリームの .I input と名前が衝突することを避けます。) .IP - .B YY_FLUSH_BUFFER スキャナの内部バッファをフラッシュし、 次にスキャナがトークンをマッチしようとした時 バッファを .B YY_INPUT にてリフィルします(生成されたスキャナで後述)。 このアクションは、 複数の入力バッファにおいて後述する より一般的な .B yy_flush_buffer() 関数の特別なケースです。 .IP - .B yyterminate() アクションの return 文の代わりに使うことが出来ます。 .B yyterminate() はスキャナを終了し、"全て終了" を意味する 0 を呼び出し元関数に返します。 デフォルトでは .B yyterminate() はファイルの終わりに達したときにも呼ばれます。 .B yyterminate() はマクロであり、定義しなおすことができます。 .SH 生成されたスキャナ .I flex の出力は .B lex.yy.c というファイルであり、スキャンルーチン .B yylex() と、トークンのマッチングに使用する複数のテーブルと、 複数の付属ルーチンとマクロからなります。デフォルトでは、 .B yylex() は次のように宣言されます: .nf int yylex() { ... various definitions and the actions in here ... } .fi (環境が関数プロトタイプをサポートしている場合、 "int yylex( void )" となります。) この定義は "YY_DECL" マクロを定義することにより変更できます。 例えば次のように使用することが出来ます: .nf #define YY_DECL float lexscan( a, b ) float a, b; .fi これはスキャンルーチンの名前を .I lexscan とし、浮動小数点数を返すようにし、2 つの浮動小数点数を引数とします。 K&R の非プロトタイプの関数宣言を使用してスキャンルーチンに対して引数を 与える場合、定義をセミコロン(;)で終了する必要があります。 .PP .B yylex() は呼ばれるたび、グローバル入力ファイル .I yyin (デフォルトでは標準入力)からトークンをスキャンします。 ファイルの終りになる(この場合 0 を返します)か、 アクションが .I return 文を実行するまで、実行を続けます。 .PP スキャナがファイルの終りに到達すると、 .I yyin が新たなファイルを指さないか (新たなファイルを指す場合はこのファイルのスキャンを続けます)、 .B yyrestart() が呼ばれない限り、 後続する呼び出しは未定義です。 .B yyrestart() は .B FILE * ポインタ( .B YY_INPUT を設定して .I yyin 以外のソースをスキャンするようにした場合には nil も可です) である引数を 1 つとり、そのファイルからのスキャンのために .I yyin を初期化します。 本質的に、 .I yyin を新しい入力ファイルに割り当てることと .B yyrestar() を使用することとは同じです; 後者は前のバージョンの .I flex との互換性のために使用可能であり、 またスキャンの途中で入力ファイルを変えることが可能です。 引数を .I yyin として呼び出すことにより、現在の入力バッファを捨てることも出来ます; ただし、 .B YY_FLUSH_BUFFER (上述)を使用する方が良いです。 .B yyrestart() は .B INITIAL の開始条件を変更し .I ない ことに注意して下さい (後述の開始条件参照)。 .PP あるアクション中で .I return 文を実行することにより .B yylex() がスキャンを止めた場合、スキャナは再度呼び出し可能であり、 この場合スキャンの残りの部分から再開します。 .PP デフォルトで(効率のため)、スキャナは単純な .I getc() コールではなくブロックリードを行い、 .I yyin から文字を読みます。 入力取得方法は .B YY_INPUT マクロを定義することにより制御できます。 YY_INPUT 呼び出し手順は "YY_INPUT(buf,result,max_size)" です。 このアクションは、 .I buf 文字配列中に最大 .I max_size 文字を用意し、整数変数 .I result 中に読めた文字数もしくは定数 YY_NULL (Unix システムでは 0)を入れて返します。 デフォルトの YY_INPUT はグローバルファイルポインタ "yyin" から読みます。 .PP YY_INPUT のサンプル定義です(入力ファイルの定義部に格納): .nf %{ #define YY_INPUT(buf,result,max_size) \\ { \\ int c = getchar(); \\ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \\ } %} .fi この定義により、入力処理は 1 度に 1 文字ずつ行うように変更されます。 .PP スキャナが YY_INPUT からファイルの終りを通知された場合、 スキャナは .B yywrap() 関数をチェックします。 .B yywrap() 関数が偽(ゼロ)を返す場合、関数は続行中であるとされ、 .I yyin を別の入力ファイルを指すように設定し、スキャンを続行します。 関数が真(非ゼロ)を返す場合、スキャナは終了し、呼び出し元に 0 を返します。 どちらの場合も開始条件は変化しないことに注意して下さい; つまり .B INITIAL には戻り .I ません。 .PP 独自の .B yywrap() を設定しない場合、 .B %option noyywrap (この場合スキャナは .B yywrap() が 1 を返したかのように動作します)を使用するか、フラグ .B \-ll を指定してデフォルトのルーチン(常に 1 を返します)を使用しなければなりません。 .PP ファイルではなくメモリ中のバッファからスキャンするための 3 つのルーチンを 使用可能です: .B yy_scan_string(), yy_scan_bytes(), yy_scan_buffer() 。 これらに関する議論は複数の入力バッファの節を参照して下さい。 .PP スキャナは、自己の .B ECHO 出力を .I yyout グローバル(デフォルトでは標準出力であり、 別の .B FILE ポインタに割り当てることで再定義できます)に書きます。 .SH 開始条件 .I flex は、条件的に有効となるルールのための機構を提供します。 パターンのプレフィックスが "" となっているルールは、 スキャナが "sc" という名前の開始条件にいる場合のみ有効です。 例えば、 .nf [^"]* { /* eat up the string body ... */ ... } .fi はスキャナが "STRING" 開始条件にいる時のみ有効であり、 .nf \\. { /* handle an escape ... */ ... } .fi は現在の開始条件が、 "INITIAL", "STRING", "QUOTE" のいずれかの場合のみ有効です。 .PP 開始条件は、入力の定義(先頭)部において、インデントされない行で .B %s もしくは .B %x から始まり名前が続く行において宣言されます。 前者は .I 内包的 開始条件を、 後者は .I 排他的 開始条件を、それぞれ宣言します。 開始条件を有効にするのは .B BEGIN アクションです。 次の .B BEGIN アクションが実行されるまで、与えられた開始条件のルールは有効であり、 他の開始条件のルールは無効です。 開始条件が .I 内包的 な場合、開始条件を持たないルールもまた有効です。 開始条件が .I 排他的 な場合、 開始条件を満たすルール .I だけ が有効です。 同じ排他開始条件に依存するルールの組は、 .I flex 入力中の別のルールとは独立なスキャナを記述します。 そのため、排他開始条件を使用すれば、"ミニスキャナ" (別部分とは文法的に異なる部分(例えばコメント)に対するスキャナ) を簡単に指定できます。 .PP 内包的開始条件と排他的開始条件とがまだ少し曖昧であるなら、 両者の関係を表す例を示して説明します。以下のルールの組: .nf %s example %% foo do_something(); bar something_else(); .fi は .nf %x example %% foo do_something(); bar something_else(); .fi と等価です。 .B が無いと、2 番目の例における .I bar パターンは、開始条件が .B example の場合、有効となりません(すなわちマッチしません)。 .B だけを .I bar につけると、 .B example だけにおいて有効となり、 .B INITIAL では有効となりません。一方、最初の例ではどちらの場合でも有効です。 なぜなら最初の例では .B example 開始条件は .I 内包的 .B (%s) 開始条件だからです。 .PP 特殊な開始条件指定子 .B <*> は全ての開始条件にマッチすることに注意して下さい。 このため、上の例は次のようにも書けます; .nf %x example %% foo do_something(); <*>bar something_else(); .fi .PP デフォルトルール(マッチしなかった文字に対しては .B ECHO です)は開始条件中でも有効です。 これは次のものと等価です: .nf <*>.|\\n ECHO; .fi .PP .B BEGIN(0) は、開始条件の無いルールだけが有効である、最初の状態に戻ります。 この状態は開始条件 "INITIAL" として参照できるため、 .B BEGIN(INITIAL) は .B BEGIN(0) と等価です。 (開始条件名を括る括弧は不要ですが、良いスタイルであるとされています。) .PP .B BEGIN アクションは、ルール部の先頭のインデントされたコード中に現れても良いです。 例えば以下の例では、 .B yylex() が呼ばれグローバル変数 .I enter_special が真の場合には、スキャナは "SPECIAL" 開始条件に入ります: .nf int enter_special; %x SPECIAL %% if ( enter_special ) BEGIN(SPECIAL); blahblahblah ...more rules follow... .fi .PP 開始条件を説明するために、 "123.456" のような文字列を 2 通りの異なった解釈をするスキャナを示します。 デフォルトではこれは、 整数 "123" とドット ('.') と整数 "456" の 3 トークンに数えられます。 しかし、この文字列の前に "expect-floats" の文字列がある場合、 これは単一のトークンであるとされ、浮動小数点数 123.456 とされます: .nf %{ #include %} %s expect %% expect-floats BEGIN(expect); [0-9]+"."[0-9]+ { printf( "found a float, = %f\\n", atof( yytext ) ); } \\n { /* that's the end of the line, so * we need another "expect-number" * before we'll recognize any more * numbers */ BEGIN(INITIAL); } [0-9]+ { printf( "found an integer, = %d\\n", atoi( yytext ) ); } "." printf( "found a dot\\n" ); .fi 次は、C のコメントを理解(して捨てる)一方で、 現在の入力行を数えるスキャナです。 .nf %x comment %% int line_num = 1; "/*" BEGIN(comment); [^*\\n]* /* eat anything that's not a '*' */ "*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */ \\n ++line_num; "*"+"/" BEGIN(INITIAL); .fi このスキャナは各ルールで可能な最大のテキストにマッチしようとする場合、 ちょっとした問題が起こります。 一般的には、高速なスキャナを記述する場合、 各ルールで最大のマッチを得ようとすることが最も成功します。 .PP 開始条件名は実際には整数値であり、格納することが出来ることに注意して下さい。 そのため、上記例は以下のように拡張できます: .nf %x comment foo %% int line_num = 1; int comment_caller; "/*" { comment_caller = INITIAL; BEGIN(comment); } ... "/*" { comment_caller = foo; BEGIN(comment); } [^*\\n]* /* eat anything that's not a '*' */ "*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */ \\n ++line_num; "*"+"/" BEGIN(comment_caller); .fi さらに、現在の開始条件を整数値であるマクロ .B YY_START にてアクセスできます。 例えば、上記の .I comment_caller への代入は次のように記述できます。 .nf comment_caller = YY_START; .fi flex は .B YYSTATE を .B YY_START のエイリアスとして提供します (AT&T の .I lex が使用しています)。 .PP 開始条件は独自の名前空間を持たないことに注意して下さい; %s や %x の宣言における名前宣言の扱いは #define と同じです。 .PP 最後に、排他的開始条件を使用する、 展開されたエスケープシーケンスを含む(長すぎる文字列のチェックは含みません) C スタイルのクオート文字列へのマッチ方法を示します: .nf %x str %% char string_buf[MAX_STR_CONST]; char *string_buf_ptr; \\" string_buf_ptr = string_buf; BEGIN(str); \\" { /* saw closing quote - all done */ BEGIN(INITIAL); *string_buf_ptr = '\\0'; /* return string constant token type and * value to parser */ } \\n { /* error - unterminated string constant */ /* generate error message */ } \\\\[0-7]{1,3} { /* octal escape sequence */ int result; (void) sscanf( yytext + 1, "%o", &result ); if ( result > 0xff ) /* error, constant is out-of-bounds */ *string_buf_ptr++ = result; } \\\\[0-9]+ { /* generate error - bad escape sequence; something * like '\\48' or '\\0777777' */ } \\\\n *string_buf_ptr++ = '\\n'; \\\\t *string_buf_ptr++ = '\\t'; \\\\r *string_buf_ptr++ = '\\r'; \\\\b *string_buf_ptr++ = '\\b'; \\\\f *string_buf_ptr++ = '\\f'; \\\\(.|\\n) *string_buf_ptr++ = yytext[1]; [^\\\\\\n\\"]+ { char *yptr = yytext; while ( *yptr ) *string_buf_ptr++ = *yptr++; } .fi .PP 上記例のように同一の開始条件を持つ全てのルールの前に 開始条件を書かねばならないことが多いです。 flex はこれを簡単かつ綺麗にするため開始条件 .I スコープ を導入しました。 開始条件スコープは次のように始まります: .nf { .fi ここで .I SCs は 1 つ以上の開始条件のリストです。 開始条件スコープ内では、 最初の .I '{' にマッチするまでの .I '}' において、全てのルールは自動的に .I のプレフィックスが付きます。 そのため、例えば .nf { "\\\\n" return '\\n'; "\\\\r" return '\\r'; "\\\\f" return '\\f'; "\\\\0" return '\\0'; } .fi は次のものと等価です: .nf "\\\\n" return '\\n'; "\\\\r" return '\\r'; "\\\\f" return '\\f'; "\\\\0" return '\\0'; .fi 開始条件スコープはネストすることが出来ます。 .PP 開始条件のスタックを制御するために 3 つのルーチンを使用可能です: .TP .B void yy_push_state(int new_state) 現在の開始条件を開始条件スタックの先頭にプッシュし、 .B BEGIN new_state を使用したかのように .I new_state に切替えます (開始条件名は整数値でもあることを思い出して下さい)。 .TP .B void yy_pop_state() スタックの先頭をポップし、 .B BEGIN を使用してその開始条件に切替えます。 .TP .B int yy_top_state() スタックの内容を変更せずに、スタックの先頭を返します。 .PP 開始条件スタックは動的に大きくなり、 また組み込み時のサイズ制限はありません。 メモリを使い切ると、プログラム実行は中止されます。 .PP 開始条件スタックを使用するためには、スキャナは .B %option stack ディレクティブをインクルードする必要があります (下記オプションを参照して下さい)。 .SH 複数の入力バッファ スキャナによっては(ファイルの "include" をサポートする等) 複数の入力ストリームを扱う必要があります。 .I flex スキャナでは大きなバッファリングを行うため、 スキャンコンテキストに影響される .B YY_INPUT を単純に書き換えるだけでは次の入力がどこから読まれるのかを制御できません。 .B YY_INPUT が呼ばれるのはスキャナがバッファの終りに到達する時だけですので、 例えば "include" のように入力元を切替える必要のある文をスキャンした後でも 長時間を費す場合があります。 .PP この様な問題を解決するため、 .I flex は複数の入力バッファを生成して切替える機構を提供します。 入力バッファは次のように生成されます: .nf YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) .fi これは .I FILE ポインタと size を取り、与えられる file に関連し .I size 文字を保持するに十分なバッファを生成します (疑わしい場合には size には .B YY_BUF_SIZE を使用して下さい)。 これは、別のルーチン(下記参照)に渡すための .B YY_BUFFER_STATE ハンドルを返します。 .B YY_BUFFER_STATE のタイプは .B struct yy_buffer_state 構造体へのポインタであるため、 安全のため YY_BUFFER_STATE 変数を .B ((YY_BUFFER_STATE) 0) と初期化することが出来、 スキャナではなくソースファイルにおいて 入力バッファを正しく宣言するためにこの構造体を参照することが出来ます。 .B yy_create_buffer 呼び出しにおける .I FILE ポインタは .B YY_INPUT から見える .I yyin の値と同じようにだけ使用されることに注意して下さい; .B YY_INPUT を再定義して .I yyin を使わないようにすることにより、 .B yy_create_buffer に対して安全にニル .I FILE ポインタを渡せます。 スキャンするバッファを選択するためには次のようにします: .nf void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) .fi これはスキャナの入力バッファを切替え、 トークンが .I new_buffer から来るようになります。 新たなファイルをオープンして .I yyin を指すのではなく、スキャンを継続するために yywrap() から .B yy_switch_to_buffer() を使用することがあることに注意して下さい。 また、 .B yy_switch_to_buffer() または .B yywrap() による入力元の切替えは開始条件を変更し .I ない ことにも注意して下さい。 .nf void yy_delete_buffer( YY_BUFFER_STATE buffer ) .fi はバッファに関連づけられたストレージの返還要求に使用します。( .B buffer はニルでも構いませんがこの場合このルーチンは何もしません。) 現在のバッファの内容をクリアするには次のようにします: .nf void yy_flush_buffer( YY_BUFFER_STATE buffer ) .fi この関数はバッファの内容を捨てるため、 次にスキャナがこのバッファとトークンのマッチを行う場合、 スキャナはまず .B YY_INPUT を使用してこのバッファをフィルします。 .PP .B yy_new_buffer() は .B yy_create_buffer() のエイリアスであり、動的オブジェクトの生成と破壊のために使用する C++ の .I new と .I delete との互換性のために提供しています。 .PP 最後に .B YY_CURRENT_BUFFER マクロは、現在のバッファに対する .B YY_BUFFER_STATE ハンドルを返します。 .PP この機能を使用してインクルードファイルを展開するスキャナの記述例です( .B <> 機能は後述します): .nf /* the "incl" state is used for picking up the name * of an include file */ %x incl %{ #define MAX_INCLUDE_DEPTH 10 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; %} %% include BEGIN(incl); [a-z]+ ECHO; [^a-z\\n]*\\n? ECHO; [ \\t]* /* eat the whitespace */ [^ \\t\\n]+ { /* got the include file name */ if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) { fprintf( stderr, "Includes nested too deeply" ); exit( 1 ); } include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER; yyin = fopen( yytext, "r" ); if ( ! yyin ) error( ... ); yy_switch_to_buffer( yy_create_buffer( yyin, YY_BUF_SIZE ) ); BEGIN(INITIAL); } <> { if ( --include_stack_ptr < 0 ) { yyterminate(); } else { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( include_stack[include_stack_ptr] ); } } .fi ファイルではなくメモリ上の文字列をスキャンするための 入力バッファを設定するための 3 つのルーチンを使用可能です。 いずれも文字列をスキャンする新しい入力バッファを生成し、対応する .B YY_BUFFER_STATE ハンドル(終了時には .B yy_delete_buffer() にて消去します)を返します。新しいバッファに切替える時には .B yy_switch_to_buffer() を使用し、次の .B yylex() の呼び出し時にはこの文字列をスキャン開始します。 .TP .B yy_scan_string(const char *str) NUL ターミネートされた文字列をスキャンします。 .TP .B yy_scan_bytes(const char *bytes, int len) .I len バイト (NUL が含まれるかも知れません)を位置 .I bytes からスキャンします。 .PP どちらの関数も文字列もしくはバイト列の .I コピー を生成してからスキャンします。( .B yylex() はスキャンするバッファの内容を変更するため、これが望ましいのです。) コピーを避けるためには次のようにします: .TP .B yy_scan_buffer(char *base, yy_size_t size) バッファ内で .I base から .I size バイトの長さをスキャンします。最後の 2 バイトは .B YY_END_OF_BUFFER_CHAR (ASCII NUL) である .I 必要があります。 これらの最後の 2 バイトはスキャンされません; そのためスキャンの内容は .B base[0] から .B base[size-2] までで両端を含みます。 .IP この様になるように .I base を設定しなかった場合(つまり最後の 2 つの .B YY_END_OF_BUFFER_CHAR バイトを忘れた場合)、 .B yy_scan_buffer() は新しいバッファを生成するのではなくニルポインタを返します。 .IP 型 .B yy_size_t は整数型であり、 バッファの大きさを反映する整数式をこの型にキャストすることが出来ます。 .SH ファイルの終りのルール 特別ルール "<>" は、 ファイルの終了時もしくは yywrap() が非ゼロ(すなわち処理するファイルが無いことを表す)の時に 行われるべきアクションを表します。 アクションは以下の 4 つのうちのいずれかで終る必要があります。 .IP - .I yyin に新しいファイルを割り当てる(前のバージョンの flex では、 割り当て後に特別なアクション .B YY_NEW_FILE を呼び出す必要がありました; 今では不要です。); .IP - .I return 文を実行する; .IP - 特別な .B yyterminate() アクションを実行する; .IP - .B yy_switch_to_buffer() を使用して新たなバッファに切替える (上記例で示した通り)。 .PP <> ルールを他のパターンと共に使用してはなりません; 他のパターンは開始条件のリストともにだけ満たされるからです。 満たされない <> ルールが与えられた場合、 <> アクションをまだ持っていない .I 全ての 開始条件に適用されます。 <> ルールを最初の開始条件だけに指定するためには次のようにして下さい。 .nf <> .fi .PP これらのルールは閉じていないコメントを捕まえる場合等に便利です。 例えば: .nf %x quote %% ...other rules for dealing with quotes... <> { error( "unterminated quote" ); yyterminate(); } <> { if ( *++filelist ) yyin = fopen( *filelist, "r" ); else yyterminate(); } .fi .SH 雑多なマクロ マクロ .B YY_USER_ACTION にはマッチルールアクションに先だって常に行うアクションを定義できます。 例えば、yytext を小文字に変換するルーチンを呼ぶように #define 出来ます。 .B YY_USER_ACTION 起動時には、変数 .I yy_act はマッチしたルールの番号を与えます(ルールは 1 番から数えます)。 各ルールがマッチする頻度を知りたい場合を想像して下さい。 以下に仕掛けを示します: .nf #define YY_USER_ACTION ++ctr[yy_act] .fi ここで .I ctr は配列であり、それぞれのルールがマッチした回数を計数します。 マクロ .B YY_NUM_RULES はルールの総数を表すため( .B \-s を使った時でさえデフォルトルールを含みます)、 正しい .I ctr の宣言は次のようになります: .nf int ctr[YY_NUM_RULES]; .fi .PP マクロ .B YY_USER_INIT には最初のスキャンの前に常に行うアクションを再定義できます (スキャナの内部初期化の前に行われます)。 例えばデータ表を読み込んだり、ログファイルをオープンするために使用できます。 .PP マクロ .B yy_set_interactive(is_interactive) は現在のバッファが .I 対話的 と見倣されているか否かを制御するために使用します。 対話的なバッファの処理は遅くなりますが、 スキャナの入力元が対話的でありバッファをフィルするのを待つことに起因する 問題を避けるためには指定しなければなりません(以下の .B \-I フラグに関する議論を参照して下さい)。 マクロ起動時に非ゼロを指定するとバッファは対話的になり、 ゼロを指定すると非対話的になります。 このマクロの使用は .B %option always-interactive と .B %option never-interactive に優先します(下記オプションを参照して下さい)。 バッファをスキャンして対話的である(もしくはでない)と判断される前に、 .B yy_set_interactive() を起動して下さい。 .PP マクロ .B yy_set_bol(at_bol) は現在のバッファにおける次のトークンに対するマッチのためのスキャンが 行頭から始まるか否かを制御します。 非ゼロのマクロ引数は、'^' が付いたルールを有効にしますが、 ゼロのマクロ引数は '^' が付いたルールを無効にします。 .PP 現在のバッファからスキャンされた次のトークンが有効な '^' ルールを持つ時、 マクロ .B YY_AT_BOL() は真を返します。 そうでない場合は偽を返します。 .PP 生成されたスキャナでは、全てのアクションは大きな一つの switch 文に 集められ、 .B YY_BREAK で分けられています。 .B YY_BREAK は再定義可能です。デフォルトではそれぞれのルールのアクションを 分けるための単なる "break" です。 .B YY_BREAK を再定義することにより、例えば C++ ユーザが #define YY_BREAK を何もしないように定義し (ただし全てのルールが "break" か "return" で終るように 注意しなければなりません!)、 ルールのアクションが "return" で終ることにより .B YY_BREAK がアクセスできないことに起因する、 到達できない文があるという警告を避けることが出来ます。 .SH ユーザが使用可能な値 この節ではユーザがルールのアクション部分で使用可能な値をまとめます。 .IP - .B char *yytext 現トークンのテキストを保持しています。内容を変更しても構いませんが、 その長さを伸ばしてはいけません(終りに文字を追加してはいけない)。 .IP スキャナの記述の最初の部分に特別な指示である .B %array が書かれているとき、 .B yytext は .B char yytext[YYLMAX] と定義されます。 .B YYLMAX はマクロで、デフォルトの値 (多くの場合8KB) を変更したい場合には 最初の部分で再定義可能です。 .B %array を使うといくらか遅いスキャナになりますが、 .B yytext の値は .I input() と .I unput() の呼び出しでも破壊されなくなります。 .B yytext が文字ポインタである場合、 これらの関数呼び出しは .B yytext を破壊する可能性があります。 .B %array と対称な指定 .B %pointer がデフォルトです。 .IP C++ のスキャナクラスを生成する (オプション .B \-+ ) ときには .B %array は使えません。 .IP - .B int yyleng 現トークンの長さを保持しています。 .IP - .B FILE *yyin はデフォルトで .I flex が読むファイルです。再定義することは可能ですが、スキャンを 始める前か EOF に到達した後でのみ再定義は意味を持ちます。 スキャンの途中で変更すると予想外の結果をもたらします。 というのも .I flex は入力をバッファリングしているからです; そのような場合には、直接再定義せず .B yyrestart() を使って下さい。 ファイルの終わりでスキャンが終了した場合には .I yyin を新しい入力ファイルに割り当て、 再びスキャナを呼び出してスキャンを続けることが出来ます。 .IP - .B void yyrestart( FILE *new_file ) を呼ぶことで .I yyin が新しい入力ファイルを指すように出来ます。新しいファイルへの変更は すぐに行われます (それまでにバッファに読み込まれていた入力は失われます)。 .I yyin を引数として .B yyrestart() を呼ぶと、現在の入力バッファを捨てて同じ入力ファイルを スキャンし続けることに注意して下さい。 .IP - .B FILE *yyout は .B ECHO アクションが行われる対象のファイルです。 ユーザが再割当することが出来ます。 .IP - .B YY_CURRENT_BUFFER カレントバッファの .B YY_BUFFER_STATE ハンドルを返します。 .IP - .B YY_START 現在の開始条件に対応する整数値を返します。 続いてこの値を .B BEGIN と共に使うことで、スキャナをその開始条件へ戻すことが出来ます。 .SH YACC とのインタフェース .I flex の主な使用方法の一つは、 .I yacc パーサジェネレータと共に使用することです。 .I yacc パーサは .B yylex() と言う名前のルーチンを呼び、次の入力トークンを見付けるものとしています。 このルーチンは、次のトークンの型を返し、 関連する値をグローバルの .B yylval に格納するものとされています。 .I flex を .I yacc と共に使うには、 .I yacc に .B \-d オプションを指定して、 .I yacc の入力に現れる全ての .B %tokens の定義を含む .B y.tab.h ファイルを生成させます。 このファイルは .I flex スキャナにインクルードされます。 例えばトークンの一つが "TOK_NUMBER" である場合、 スキャナの一部分は次のようになっています: .nf %{ #include "y.tab.h" %} %% [0-9]+ yylval = atoi( yytext ); return TOK_NUMBER; .fi .SH オプション .I flex には以下のようなオプションがあります: .TP .B \-b バックアップ情報を .I lex.backup に出力します。 このファイルには、スキャナのバックアップ(backing-up)を必要とする状態と それに対応する入力文字の一覧がリストされます。 ルールを追加することでバックアップ状態を取り除くこと ができます。バックアップ状態が .I 全て 取り除かれ、 .B \-Cf または .B \-CF を指定すると、生成されたスキャナの実行速度が向上します( .B \-p フラグを見て下さい)。 スキャナをぎりぎりまで最適化しようとしてるユーザのみが このオプションに関係あります。 (後述の性能関連の節を見て下さい。) .TP .B \-c 何もしません。POSIX 互換のために用意されています。 .TP .B \-d 生成されたスキャナが .I デバッグ モードで実行されます。 .B yy_flex_debug が非ゼロの場合(デフォルト)、 パターンが認識されるたびに、スキャナは次のようなメッセージを .I 標準エラー出力 へ出力します。 .nf --accepting rule at line 53 ("the matched text") .fi 行番号はスキャナを定義しているファイル (flexに与えられたファイル) でのルールの位置です。 スキャナがバックアップしたとき、デフォルトルールを受け入れたとき、 入力バッファの最後に到達したとき (あるいは、NULに到達したとき; スキャナには、この二つの区別はつきません) 、ファイルの最後に到達した ときにもメッセージが出力されます。 .TP .B \-f .I 高速なスキャナ を指定します。 テーブル圧縮は行われず、標準入出力をバイパスします。 その結果生成されるスキャナは大きくなりますが、高速なものになります。 このオプションは .B \-Cfr と同等です (以下を参照)。 .TP .B \-h .I flex のオプションの要約からなる "ヘルプ" を .I 標準出力 に書き出し終了します。 .B \-? と .B \-\-help とは .B \-h と同じです。 .TP .B \-i .I 大文字小文字を区別しない スキャナを生成します。 .I flex の入力パターンに与えられる文字が大文字であるか小文字であるかは区別されず、 スキャナに入力される文字列は大文字小文字に関係なくマッチします。 マッチしたテキスト .I yytext では入力時の大文字小文字が保存されます (大文字を小文字に変換したりしません)。 .TP .B \-l AT&T の .I lex の実装に対して最大限の互換性を持たせます。これは .I 完全な 互換性を意味しません。 このオプションを使用すると性能に大きな影響があります。 このオプションは、 .B \-+, \-f, \-F, \-Cf, \-CF と同時に使用できません。詳しくは、 後述の "Lex および POSIX との非互換性" の節を御覧下さい。 またこのオプションを使用すると、 .B YY_FLEX_LEX_COMPAT が生成されたスキャナの名前に #define されます。 .TP .B \-n 何もしません。POSIX 互換のためにだけ用意されたオプションです。 .TP .B \-p 性能情報を標準エラー出力に出力します。 .I flex 入力ファイルの記述のうち、 生成されるスキャナの性能低下の深刻な原因となる部分について、 コメントされます。 オプションを2回指定すると、より細かな性能低下についても コメントが出力されます。 .IP .B REJECT ・ .B %option yylineno ・可変長右文脈(欠陥/バグの節で後述)は多大なる性能への悪影響があります; .I yymore() の使用・ .B ^ オペレータ・ .B \-I フラグは小さな性能の悪影響があります。 .TP .B \-s .I デフォルトルール (マッチしないスキャナの入力を .I 標準出力 に出力する) が抑制されます。ルールにマッチしない入力が表れたとき、スキャナは エラーで異常終了します。 スキャナのルールの組に抜けが無いかを確認する場合に有効です。 .TP .B \-t .B lex.yy.c ではなく、標準出力にスキャナを書き出します。 .TP .B \-v 生成するスキャナの特徴の要約を .I 標準エラー出力 に出力するように .I flex に指示します。 ほとんどの特徴は通常の .I flex ユーザには意味がありませんが、最初の行は .I flex のバージョンを表示し( .B \-V で表示されるもと同じです)、次の行はデフォルトを含むスキャナ生成時のフラグです。 .TP .B \-w 警告メッセージを抑制します。 .TP .B \-B .I 対話的 なスキャナ (以下の .B \-I の項を参照) ではなく .I バッチ的 なスキャナを生成するよう .I flex に指示します。 通常 .B \-B を使用するのは、スキャナを対話的に使用しないことが .I 分かっている 時であり、 .I 少しでも 性能を追求したい時です。 より大きい性能を追求する場合には、 .B \-Cf もしくは .B \-CF オプションを使用すべきです(後述)。 .B \-B を自動的に設定します。 .TP .B \-F .ul 高速な スキャナテーブルの表現を使う(標準入出力はバイパスする)ことを指定します。 この表現は、完全テーブル表現 .B (-f) とほぼ同じぐらい高速で、 ある種のパターンに対してはかなり小さく (ある種に対しては大きく) なります。 通常、次のように、パターンの組が "keywords" とその対応 および "identifier" ルールからなる場合: .nf "case" return TOK_CASE; "switch" return TOK_SWITCH; ... "default" return TOK_DEFAULT; [a-z]+ return TOK_ID; .fi この場合、完全テーブル表現を使用する方が良いです。 もし "identifier" ルールからのみ表現され、 キーワードを検知するためにハッシュ表等を使用する場合は、 .B -F を使用する方が良いです。 .IP このオプションは .B \-CFr と等価です (以下を参照)。 これは .B \-+ オプションとは同時に指定できません。 .TP .B \-I .I flex に .I 対話的 なスキャナを生成するように指示します。 対話的なスキャナは、 先読みすることによりマッチするトークンが完全に決まる場合のみ先読みします。 現在のトークンが既に明らかな場合でも常に先読みする方法は、 必要時のみ先読みする方法より少し速いです。 しかし、常に先読みする方法では対話性能に著しく悪影響があります; 例えばユーザが改行を入力した場合、 .I 別の トークンを入力するまでそれは改行として認識されません。 大概の場合、次の行全体を入力することになります。 .IP .I flex のスキャナのデフォルトは .I 対話的 であり、例外は .B \-Cf や .B \-CF といったテーブル圧縮オプション(後述)使用時です。 高性能追求時にはこれらのオプションを使用しているべきですので、 これらのオプションを使用していない場合には、 .I flex は実行時性能を少し犠牲にして直観的な対話的な振舞いを取っているものとします。 .B \-I オプションを .B \-Cf や .B \-CF と共に .I 使用できない ことにも注意して下さい。 実際はこのオプションは不要です; 許される場合、デフォルトで有効になっています。 .IP スキャナを対話的で .I 無い ように強制するには .B \-B (先述)を使用します。 .TP .B \-L .I flex に .B #line ディレクティブを .B lex.yy.c 中に生成しないように指示します。 デフォルトではこの #line ディレクティブを生成するので、 アクションにおけるエラーメッセージは、オリジナルの .I flex 入力ファイル( エラーが入力ファイルのコードに起因する場合)もしくは ファイル .B lex.yy.c ( .I flex の誤り -- 以下の電子メールアドレスに報告して下さい) における正しい位置を与えます。 .TP .B \-T .I flex を .I トレース モードで実行します。 入力の形式とその結果として出力される非決定性/決定性有限 オートマトンに関して .I 標準エラー出力 に多量のメッセージを出力します。 このオプションは主に .I flex をメンテナンスするために使われます。 .TP .B \-V バージョン番号を .I 標準出力 に出力して終了します。 .B \-\-version は .B \-V と同じです。 .TP .B \-7 7 ビットのスキャナを生成します。 すなわち、入力に 7 ビットの文字のみを使用することを意味します。 .B \-7 を指定する利点は、 .B \-8 オプション(後述)を指定して生成するテーブルの半分まで小さくなりうることです。 欠点は、入力に 8 ビット文字が含まれている時に、 スキャナがハングもしくはクラッシュすることです。 .IP しかしながら、 .B \-Cf や .B \-CF といったテーブル圧縮オプション使用時にはテーブル圧縮の効果は少なく、 移植性が著しく低下することに注意して下さい。 .I flex のデフォルトの動作では、 .B \-Cf や .B \-CF, を指定しない限り 8 ビットスキャナを生成します。 指定時には、 あなたのサイトが常に 8 ビットスキャナを生成するように (USA 以外のサイトでは良くあります)していない場合には、 7 ビットスキャナを生成します。 flex が 7 ビットもしくは 8 ビットのいずれのスキャナを生成するのかを 知りたい場合には、上述の .B \-v の出力のフラグの要約を調べて下さい。 .IP .B \-Cfe もしくは .B \-CFe (これらのテーブル圧縮オプションおよび等価クラスは後述) を使用しても、flex はデフォルトで 8 ビットスキャナを生成することに 注意して下さい。 なぜなら、完全な 8 ビットテーブルは 7 ビットテーブルと比べても たいして高価にはならないからです。 .TP .B \-8 8 ビットのスキャナを生成するように .I flex に指示します。すなわち 8 ビット文字を解釈します。 圧縮オプション .B \-Cf と .B \-CF 使用時にのみ必要です。 なぜなら flex はデフォルトでは 8 ビットスキャナを生成するからです。 .IP flex のデフォルト動作と 7 ビットおよび 8 ビットスキャナの トレードオフに関しては、上記 .B \-7 の議論を見て下さい。 .TP .B \-+ C++ のスキャナクラスを生成します。 詳しくは C++ スキャナの生成で後述します。 .TP .B \-C[aefFmr] テーブル圧縮の程度と、 より一般的には小さいスキャナと高速なスキャナとのトレードオフを指定します。 .IP .B \-Ca ("アライン") 生成されるスキャナのテーブルは、 メモリアクセスおよび計算のためにアラインされるため、より大きなものになります。 RISC アーキテクチャではロングワードのフェッチおよび操作は ショートワードといったより小さな大きさのものに対するものより効率的です。 場合によってはスキャナのテーブルサイズが通常の 2倍になることもあります。 .IP .B \-Ce .I 等価クラス (同一の字句属性を持つ文字セット)を構築します (例えば、 .I flex 入力中に数字が現れるのが文字クラス "[0-9]" のみの場合、 数字 '0', '1', ..., '9' は全て同じ等価クラスになります)。 多くの場合、等価クラスを用いることで最終的なテーブル/ オブジェクトファイルのサイズを劇的(平均して 1/2-1/5)に減らすことが出来ます。 また、その際の性能コストは非常に低く抑えられます ( 1文字スキャンするごとに 1回の配列検索を行うだけです)。 .IP .B \-Cf .I 完全(full) スキャナテーブルを生成することを指示します - .I flex は、別の状態に関する類似した遷移関数をうまく利用するという、 テーブル圧縮手法を用いません。 .IP .B \-CF 別の高速スキャナ表現( .B \-F フラグにて記述)を用いることを指定します。 このオプションは .B \-+ と同時に使用できません。 .IP .B \-Cm .I flex に .I メタ等価クラス を構築するよう指示します。 メタ等価クラスは一緒に使われることの多い等価クラス (等価クラスが使われていないときには文字群) の集合です。 圧縮テーブルを使っているとき、 メタ等価クラスは多くの場合にかなりの効果的をもたらしますが、 やや性能に影響します (1-2 回の条件テストと 1 回の配列検索がスキャンした文字ごとに行われます)。 .IP .B \-Cr 生成されたスキャナは入力に対しては標準入出力ライブラリ(標準入出力)を .I バイパス します。 スキャナは、 .B fread() や .B getc() ではなく、 .B read() システムコールを使用します。 性能改善結果はシステムに依存します。 オプション .B \-Cf もしくは .B \-CF を使用していない場合には、 一般にこのオプションは性能をあまり改善しません。 .B \-Cr を指定すると、例えばスキャナを設定する前に標準入出力を使用して .I yyin を読み取る等した場合奇妙な動作となり得ます (標準入出力の入力バッファに以前読み込んだものを、スキャナは読めません)。 .IP .B \-Cr は .B YY_INPUT を定義した場合意味がありません (前述の生成されたスキャナを参照)。 スキャナの呼出に先だって標準入力を使って .I yyin から読みだしているときには、予想外の振る舞いをすることがあります。 .IP .B \-C のみを指定したときには、スキャナはテーブル圧縮は行いますが、 等価クラスもメタ等価クラスも使いません。 .IP オプション .B \-Cf と .B \-CF はオプション .B \-Cm を同時に指定しても意味をなしません - なぜなら、テーブル圧縮が行われないときメタ等価クラス は現れないからです。 それ以外のオプションは自由に組み合わせることが出来ます。 .IP デフォルトの設定は .B \-Cem です。このとき .I flex は等価クラスとメタ等価クラスを生成します。 この設定は最も高いテーブル圧縮を行います。 テーブルサイズの大きさと実行の高速性はトレードオフの関係にあり、 一般に .nf 遅いが 小さい -Cem -Cm -Ce -C -C{f,F}e -C{f,F} -C{f,F}a 速いが 大きい .fi となります。 小さいテーブルのスキャナは通常生成もコンパイルも高速であるため、 通常の開発時は最大の圧縮を行うでしょう。 .IP 製品のスキャナでは、 .B \-Cfe が速度と大きさの良いバランスです。 .TP .B \-ooutput .B lex.yy.c ではなくファイル .B output にスキャナを書くように flex に指示します。 .B \-o と .B \-t オプションを組み合わせると、 スキャナは .I 標準出力 に書かれますが、 .B #line ディレクティブ( .B \\-L にて上述)はファイル .B output を参照します。 .TP .B \-Pprefix .I flex の使うデフォルトのプレフィックス .I "yy" の代わりに .I prefix を使います。これはグローバル変数とファイル名に影響します。 例えば .B \-Pfoo とすると、 .B yytext の名前は .B footext となります。 またデフォルトの出力ファイル名を .B lex.yy.c から .B lex.foo.c に変えます。 影響を受ける名前の一覧です: .nf yy_create_buffer yy_delete_buffer yy_flex_debug yy_init_buffer yy_flush_buffer yy_load_buffer_state yy_switch_to_buffer yyin yyleng yylex yylineno yyout yyrestart yytext yywrap .fi (C++ スキャナ使用時には .B yywrap と .B yyFlexLexer だけが影響を受けます。) スキャナの中では、グローバル変数および関数を どちらの名前ででも参照できます; 外部的には修正した名前のみ持ちます。 .IP このオプションを使用することにより、複数の .I flex プログラムを同一の実行形式に容易にリンクすることが出来ます。 しかし、このオプションは .B yywrap() の名前をも変えますので、 独自の(適切に名前を付けた)ルーチンをスキャナのために用意するか、 .B %option noyywrap を使用して .B \-ll とリンクする .I 必要があります。 どれもデフォルトでは提供されません。 .TP .B \-Sskeleton_file .I flex がスキャナを構築するのに使うデフォルトの スケルトンファイルに優先します。 .I flex のメンテナンスや開発をする場合以外、このオプションは必要ありません。 .PP .I flex は、flex のコマンドラインではなく、 スキャナ仕様記述中からオプションを制御する機構を提供します。 これはスキャナの最初の部分に .B %option ディレクティブを含めることで実現できます。 単一の .B %option ディレクティブにおいて複数のオプションを指定でき、 また複数のディレクティブを flex 入力ファイルの最初の部分に置くことが出来ます。 .PP ほとんどのオプションが単純な名前であり、 オプションとして前に "no" という語(空白をはさみません)を付けて 意味を反転できます。 数値は flex のフラグやその反転と等価です。 .nf 7bit -7 オプション 8bit -8 オプション align -Ca オプション backup -b オプション batch -B オプション c++ -+ オプション caseful または case-sensitive -i オプションの逆(デフォルト) case-insensitive または caseless -i オプション debug -d オプション default -s オプションの逆 ecs -Ce オプション fast -F オプション full -f オプション interactive -I オプション lex-compat -l オプション meta-ecs -Cm オプション perf-report -p オプション read -Cr オプション stdout -t オプション verbose -v オプション warn -w オプションの逆 (-w オプションには "%option nowarn" を使用して下さい) array "%array" と等価 pointer "%pointer" と等価(デフォルト) .fi .B %option には、他では利用できない機能を提供するものもあります: .TP .B always-interactive 入力を常に "対話的" に扱うスキャナを生成するように flex に指示します。 通常、新たな入力ファイル毎にスキャナは .B isatty() を呼び出し、スキャナの入力元が対話的であり 1 度に 1 文字ずつ読むべきか どうか判定しようとします。 一方このオプションを使用するとこの様な呼び出しは行いません。 .TP .B main スキャナに対し、 .B yylex() を呼び出すだけのデフォルトの .B main() プログラムを提供するように指示します。 このオプションは .B noyywrap (後述)も暗黙的に指示します。 .TP .B never-interactive 入力を "対話的" とはしないスキャナを生成するように flex に指示します (これもまた .B isatty() を呼び出しません)。 これは .B always-interactive の逆です。 .TP .B stack 開始条件スタックの使用を有効にします(前述の開始条件を参照)。 .TP .B stdinit 設定されている場合 (すなわち .B %option stdinit) .I yyin および .I yyout を、 デフォルトの .I nil ではなく、 .I 標準入力 と .I 標準出力 に設定します。 既存の .I lex プログラムには、 ANSI C 互換ではないものの、この動作に依存しているものがあります。 ANSI C では .I 標準入力 と .I 標準出力 がコンパイル時の定数である必要はありません。 .TP .B yylineno 入力から読み取った現在の行番号をグローバル変数 .B yylineno に保持するスキャナを生成するように、 .I flex に指示します。 このオプションは .B %option lex-compat から暗黙的に指定されます。 .TP .B yywrap セットされていない場合 (すなわち .B %option noyywrap) 、スキャナはファイルの終りに際し .B yywrap() を呼ばず単にスキャンすべきファイルがもう無いものとするようになります( ユーザが .I yyin を新しいファイルを指すようにし、再度 .B yylex() を呼び出すまでです)。 .PP .I flex はルールアクションをスキャンし、 .B REJECT と .B yymore() の機能が使われているかどうかを調べます。 .B reject と .B yymore のオプションを使用すると、 オプションで指定した通りにこの判定に優先します。 オプションの指定は、セットして機能を使用していることを示す(例えば .B %option reject) 、もしくはアンセットして機能を使用していないことを示す(例えば .B %option noyymore) ものとします。 .PP 次のオプションは文字列の値を取り、'=' で区切ります: .nf %option outfile="ABC" .fi これは .B -oABC と同じであり、 .nf %option prefix="XYZ" .fi は .B -PXYZ と同じです。 最後に、 .nf %option yyclass="foo" .fi は C++ スキャナ生成時のみ有効( .B \-+ オプション)です。これは .I flex に対して、 .B foo が .B yyFlexLexer のサブクラスであることを知らせますので、 .I flex はアクションを .B yyFlexLexer::yylex() ではなく .B foo::yylex() のメンバ関数とします。 また、( .B yyFlexLexer::LexerError() を起動することにより)呼び出すと実行時エラーを除去する .B yyFlexLexer::yylex() メンバ関数を生成します。 詳細は後述の C++ スキャナの生成を見て下さい。 .PP 生成されたスキャナから不要なルーチンを除きたい lint 純正主義者のために 多くのオプションが用意されています。 以下をアンセットすると(例えば .B %option nounput )、対応するルーチンは生成されるスキャナから除かれます: .nf input, unput yy_push_state, yy_pop_state, yy_top_state yy_scan_buffer, yy_scan_bytes, yy_scan_string .fi ( .B yy_push_state() 等は .B %option stack を使用しない場合には現れません)。 .SH 性能関連 .I flex の主なデザインゴールは高性能なスキャナを生成することです。 多くのルールセットを良く扱うことで最適化されます。 既に概説した .B \-C オプション使用によるテーブル圧縮に起因する速度への影響の他に、 性能を悪化させる多くのオプション/アクションがあります。 それらを高価なものから安価なものへと並べます: .nf REJECT %option yylineno 自由長の右文脈(trailing context) バックアップが必要なパターンの組 %array %option interactive %option always-interactive '^' 行頭オペレータ yymore() .fi 最初の 3 つは非常に高価であり、最後の 2 つは非常に安価です。 .B unput() は潜在的に非常に大きな仕事をするルーチン呼び出しとして実装されているのに対し、 .B yyless() は非常に安価なマクロです; ですからスキャンした余分なテキストを戻すだけの場合には .B yyless() を使って下さい。 .PP 性能が重要な場合には、出来うる限りの努力でもって .B REJECT を避けて下さい。 これは特に高価なオプションです。 .PP バックアップを取り除くと、乱雑になり、 ひどく苦労して複雑なスキャナを作ることになります。 実際的には .B \-b フラグを指定して .I lex.backup ファイルを生成することから始めます。例えば、入力 .nf %% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; .fi に対しては、ファイルは次のようになります: .nf State #6 is non-accepting - associated rule line numbers: 2 3 out-transitions: [ o ] jam-transitions: EOF [ \\001-n p-\\177 ] State #8 is non-accepting - associated rule line numbers: 3 out-transitions: [ a ] jam-transitions: EOF [ \\001-` b-\\177 ] State #9 is non-accepting - associated rule line numbers: 3 out-transitions: [ r ] jam-transitions: EOF [ \\001-q s-\\177 ] Compressed tables always back up. .fi 最初の数行は、 \&'o' に遷移できるが他の文字には遷移できない状態があり、 その状態では現在スキャンされたテキストは他のルールにはマッチしないことを 表します。 この状態が発生したのは、 入力ファイルの行 2, 3 のルールにマッチしようとした時です。 スキャナがこの様な状態にあり 'o' 以外の文字を読んだ場合には、 マッチするルールを探すためのバックアップが必要となります。 少し考えれば、これは "fo" を見た時にある状態に違いないことが分かるでしょう。 この様な時、'o' 以外のものが現れると、 スキャナは、単に 'f' にマッチする(デフォルトルール)ところまで 戻り(バックアップし)ます。 .PP 状態 #8 に関係するコメントは、 "foob" がスキャンされた時に問題があることを表しています。 実際、'a' 以外の文字に出会うと、スキャナは "foo" を受理するところまで戻ります。 同様に状態 #9 に関係するコメントは、 "fooba" がスキャンされ 'r' が続かない場合に関係します。 .PP 最後のコメントが通知するのは、 .B \-Cf や .B \-CF を使っているのでなければ バックアップを取り除こうと努力することは無意味であることです。 なぜなら、圧縮されたスキャナに対してそのようなことをしても、 性能上の利益は無いからです。 .PP バックアップを取り除くためには "エラー" ルールを追加します: .nf %% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; fooba | foob | fo { /* false alarm, not really a keyword */ return TOK_ID; } .fi .PP キーワードのリストからバックアップを取り除くには、"全てを捕まえる" ルールを使用することが出来ます: .nf %% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; [a-z]+ return TOK_ID; .fi 通常、適切な時にはこれは一番良い解決策です。 .PP バックアップメッセージはカスケードすることが多いです。 複雑なルールの組では、数百ものメッセージを得るのは普通のことです。 しかし、これを解析すれば、バックアップを除去するためには 大抵の場合数ダースのルールにだけ関係あることが分かるでしょう (しかし、間違えることが多く、誤ったルールが偶然有効なトークンにマッチし得ます。 将来の .I flex の機能では、 自動的にバックアップを除去するルールを追加するようになるかも知れません)。 .PP バックアップを除去することにより利益があるのは、 .I 全ての バックアップを除去した時だけということを覚えておくことは重要です。 たった一つを残しても何も得ることが出来ません。 .PP .I 可変長の 右文脈 (左部分と右部分のいずれかもしくは両方が可変長)は .B REJECT とほぼ同じだけの(すなわち相当の)性能劣化となります。 そのため次のようなルール: .nf %% mouse|rat/(cat|dog) run(); .fi は次のように書くか: .nf %% mouse/cat|dog run(); rat/cat|dog run(); .fi 次のように書いた方が良いです: .nf %% mouse|rat/cat run(); mouse|rat/dog run(); .fi 特別な '|' アクションは助けにはなり .I ません し、かえって状況を悪くします (後述の欠陥/バグを参照)。 .LP スキャナの性能を向上させるための余地(実現は最も容易)は、 マッチするトークンが長ければスキャナが高速になることにあります。 長いトークンではほとんどの入力処理は(短い)内部ループで処理され、 アクションのためにスキャナ環境を設定する追加の仕事(例えば .B yytext) をほとんどしないからです。 C コメントのスキャナを思い出しましょう: .nf %x comment %% int line_num = 1; "/*" BEGIN(comment); [^*\\n]* "*"+[^*/\\n]* \\n ++line_num; "*"+"/" BEGIN(INITIAL); .fi 次のように書くと高速になります: .nf %x comment %% int line_num = 1; "/*" BEGIN(comment); [^*\\n]* [^*\\n]*\\n ++line_num; "*"+[^*/\\n]* "*"+[^*/\\n]*\\n ++line_num; "*"+"/" BEGIN(INITIAL); .fi 今度は、改行毎に別のアクションの処理を行うのではなく、 改行認識はルール間で "分散" され、 可能な限り長いテキストにマッチするようになっています。 ルールの .I 追加 はスキャナを遅く .I しません! スキャナの速度は、ルール数とも、 オペレータ '*' や '|' といったものに基づくルールの複雑さ (この節の始めで扱いました)とも独立です。 .\" 括弧内自信無しです .\" Apr 29 1997, horikawa@jp.freebsd.org .PP 最後の高速化の例です: 1 行に 1 つずつであり別の文字は付かないような、 識別子とキーワードを全てファイルからスキャンすることを考えます。 最初は次のようになるでしょう: .nf %% asm | auto | break | ... etc ... volatile | while /* it's a keyword */ .|\\n /* it's not a keyword */ .fi 後戻りを避けるために全てを捕まえるルールを導入します: .nf %% asm | auto | break | ... etc ... volatile | while /* it's a keyword */ [a-z]+ | .|\\n /* it's not a keyword */ .fi 1 行に正確に 1 語だけあることが保証されている場合、 改行の認識を別のトークンと併せることで、 マッチの総数を半分に減らすことが出来ます: .nf %% asm\\n | auto\\n | break\\n | ... etc ... volatile\\n | while\\n /* it's a keyword */ [a-z]+\\n | .|\\n /* it's not a keyword */ .fi ここで、再度バックアップをスキャナに組み込んだことに 気を付けなければなりません。 実際 .I 我々は 入力ストリームはレターと改行だけであることを知っていますが、 .I flex はこれが分からないため、 トークン "auto" などをスキャンした次の文字が改行でもレターでもない場合には バックアップが必要であると考えます。 以前は "auto" ルールに適合しそれで終りでしたが、 今は "auto" ルールは無く、"auto\\n" ルールだけがあります。 バックアップの可能性を除去するためには、 最後の改行以外のルールを二重化するか、 そのような入力に出くわさないので分類は不要と分かっているため、 改行を導入しないもう一つの全てを捕まえるルールを導入することが出来ます: .nf %% asm\\n | auto\\n | break\\n | ... etc ... volatile\\n | while\\n /* it's a keyword */ [a-z]+\\n | [a-z]+ | .|\\n /* it's not a keyword */ .fi .B \-Cf を付けてコンパイルすると、実際問題上 .I flex で得られるほぼ最速になります。 .PP 最後の注意事項: .I flex は NUL にマッチする時には遅く、トークンが複数の NUL を含む時には特に遅いです。 テキストがしばしば NUL を含むものと予想される場合には、テキストの .I 短い 部分とマッチするようにルールを書くべきです。 .PP もう一つの性能に関する最終注意事項: 入力のマッチ方法の節で既に示したように、 大きなトークンを納めるために .B yytext のサイズを動的に変更すると処理が遅くなります。 なぜなら、(巨大な)トークンを再度先頭からスキャンしなおさねばならないからです。 性能が重要な場合、 テキストの "大きな" 部分にマッチさせるべきですが "巨大な" 部分にマッチさせる べきではありません。 両者の堺目は 8K 文字/トークンです。 .SH C++ スキャナの生成 .I flex は 2 通りの C++ スキャナ生成方法を提供します。 最初の方法は .I flex が生成したスキャナを単に C コンパイラではなく C++ コンパイラで コンパイルするというものです。 この場合コンパイルエラーには出会わないはずです (見付けた場合には作者の節で後述する電子メールアドレスに報告して下さい)。 この場合ルールにおいて C コードではなく C++ コードを書くことが出来ます。 スキャナのデフォルトの入力元は .I yyin のままであり、 デフォルトのエコー先は .I yyout のままであることに注意して下さい。 どちらも .I FILE * 変数のままであり、C++ .I streams ではないです。 .PP .I flex に C++ スキャナクラスを生成させることも出来ます。 .B \-+ オプションを指定する(もしくは等価的に .B %option c++ を使う)とこのように実行され、 flex の実行形式名が '+' で終っている場合には自動的に指定されます。 このオプションを指定すると flex が生成するスキャナのデフォルトはファイル .B lex.yy.cc となり .B lex.yy.c ではありません。 生成されたスキャナは 2 つの C++ クラスとのインタフェースを定義するヘッダファイル .I FlexLexer.h をインクルードします。 .PP 最初のクラス .B FlexLexer は一般的なスキャナクラスを定義する抽象基盤クラスを提供します。 以下のメンバ関数を提供します: .TP .B const char* YYText() 最後にマッチしたテキストを返します。 .B yytext と等価です。 .TP .B int YYLeng() 最後にマッチしたトークンの長さを返します。 .B yyleng と等価です。 .TP .B int lineno() const 現在の入力の行番号( .B %option yylineno 参照)もしくは .B %option yylineno を使用していない場合には .B 1 を返します。 .TP .B void set_debug( int flag ) スキャナのデバッグフラグをセットします。 .B yy_flex_debug に代入するのと同じです(オプションの節で前述)。 スキャナ構築時に .B %option debug を使用してデバッグ情報を組み込む必要があることに注意して下さい。 .TP .B int debug() const 現在のデバッグフラグの設定を返します。 .PP また次のものと等価なメンバ関数も提供されます .B yy_switch_to_buffer(), .B yy_create_buffer() (最初の引数は .B istream* オブジェクトポインタであり .B FILE* ではありません), .B yy_flush_buffer(), .B yy_delete_buffer(), .B yyrestart() (これもまた最初の引数は .B istream* オブジェクトポインタです)。 .PP 2 番目のクラスは .I FlexLexer.h で定義される .B yyFlexLexer であり、 .B FlexLexer から導出したものです。 以下の追加のメンバ関数を定義します: .TP .B yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 ) 与えられた入出力ストリームを使う .B yyFlexLexer オブジェクトを構築します。 指定しない場合にはそれぞれストリームのデフォルト .B cin と .B cout になります。 .TP .B virtual int yylex() これは .B yylex() が通常の flex スキャナに対して行ったのと同様の役割を担います: ルールのアクションが値を返すまで、 入力ストリームをスキャンし、トークンを消費します。 .B yyFlexLexer からサブクラス .B S を導出し .B yylex() から .B S のメンバ関数および変数をアクセスしたい場合、 .B %option yyclass="S" を指定して .B yyFlexLexer ではなくサブクラスを使用することを .I flex に知らせる必要があります。 この場合 .B yyFlexLexer::yylex() を生成するのではなく、 .I flex は .B S::yylex() (および呼び出されたなら .B yyFlexLexer::LexerError() を呼び出すダミーの .B yyFlexLexer::yylex() も)を生成します。 .TP .B virtual void switch_streams(istream* new_in = 0, .B ostream* new_out = 0) .B yyin を .B new_in (非ニルの場合) に再割当し、 .B yyout を .B new_out (同様)に再割当します。 .B yyin が再割当された場合には以前の入力バッファは消去されます。 .TP .B int yylex( istream* new_in, ostream* new_out = 0 ) まず入力ストリームを .B switch_streams( new_in, new_out ) を使用して切替え、 .B yylex() の値を返します。 .PP さらに、 .B yyFlexLexer は次のプロテクトされた仮想関数を定義します。 スキャナにあわせてこれらを導出クラスにおいて再定義出来ます: .TP .B virtual int LexerInput( char* buf, int max_size ) 最大 .B max_size 文字を .B buf に読み込み、読めた文字数を返します。 入力の終りを示すには 0 文字を返します。"対話的" スキャナ( .B \-B と .B \-I フラグを参照)はマクロ .B YY_INTERACTIVE を定義することに注意して下さい。 .B LexerInput() を再定義し、 対話的な入力元をスキャンする可能性があるかどうかに依存して 異なるアクションが必要となる場合、 この名前が存在するかどうかのテストは .B #ifdef にて可能です。 .TP .B virtual void LexerOutput( const char* buf, int size ) .B size 文字をバッファ .B buf から書き出します。 スキャナのルールが NUL を含むテキストにマッチ可能な場合、 NUL 終端されているこのバッファは "内部に" NUL を含んでいても構いません。 .TP .B virtual void LexerError( const char* msg ) 致命的なエラーメッセージを報告します。 デフォルトのこの関数はメッセージをストリーム .B cerr に書き、終了します。 .PP .B yyFlexLexer オブジェクトは .I 全ての スキャン時の状態を含むことに注意して下さい。 それゆえこの様なオブジェクトをリエントラントなスキャナとして使用できます。 同一の .B yyFlexLexer クラスの複数のインスタンスを具体化可能であり、 複数の C++ スキャナクラスを組み合わせ上記 .B \-P オプションを使用することで同一のプログラムで使用可能です。 .PP 最後に .B %array 機能は C++ スキャナクラスでは使用できないことに注意して下さい; .B %pointer を使用しなければなりません(デフォルト)。 .PP 単純な C++ スキャナの例を以下に示します: .nf // An example of using the flex C++ scanner class. %{ int mylineno = 0; %} string \\"[^\\n"]+\\" ws [ \\t]+ alpha [A-Za-z] dig [0-9] name ({alpha}|{dig}|\\$)({alpha}|{dig}|[_.\\-/$])* num1 [-+]?{dig}+\\.?([eE][-+]?{dig}+)? num2 [-+]?{dig}*\\.{dig}+([eE][-+]?{dig}+)? number {num1}|{num2} %% {ws} /* skip blanks and tabs */ "/*" { int c; while((c = yyinput()) != 0) { if(c == '\\n') ++mylineno; else if(c == '*') { if((c = yyinput()) == '/') break; else unput(c); } } } {number} cout << "number " << YYText() << '\\n'; \\n mylineno++; {name} cout << "name " << YYText() << '\\n'; {string} cout << "string " << YYText() << '\\n'; %% int main( int /* argc */, char** /* argv */ ) { FlexLexer* lexer = new yyFlexLexer; while(lexer->yylex() != 0) ; return 0; } .fi 複数の(異なった)字句解析クラスを生成したい場合、 .B \-P フラグ (もしくは .B prefix= オプション) を使用して各 .B yyFlexLexer を .B xxFlexLexer 等の別の名前にします。 次に字句解析クラスのソースごとに .B をインクルードします。 以下のように .B yyFlexLexer をリネームします: .nf #undef yyFlexLexer #define yyFlexLexer xxFlexLexer #include #undef yyFlexLexer #define yyFlexLexer zzFlexLexer #include .fi これはあるスキャナに対し .B %option prefix="xx" を使用しもう一方に対し .B %option prefix="zz" を使用した場合です。 .PP 重要: 現在のスキャンクラスの形式は .I 実験的 であり、メジャーリリースが変わると大きく変更される可能性があります。 .SH LEX および POSIX との非互換性 .I flex は AT&T Unix の .I lex ツールのリライトですが(2 つの実装はいかなるコードも共有しません)、 いくばくかの拡張と非互換性を持っており、 どちらの実装でも受理可能なスキャナを書きたい方は これを意識しなければなりません。 flex は POSIX .I lex 仕様に完全合致しますが、例外は .B %pointer (デフォルト)使用と .B unput() 呼び出しにより .B yytext の内容を破壊することであり、これは POSIX 仕様に反します。 .PP この節では、 flex と AT&T lex と POSIX 仕様との間の全ての既知の非互換性を扱います。 .PP .I flex の .B \-l オプションはオリジナルの AT&T .I lex 実装との最大の互換性を有効にしますが、 生成されたスキャナの性能は大きく低下します。 .B \-l オプションを使用しても発生しうる非互換性は後で述べます。 .PP .I flex は以下の例外を除き .I lex と完全互換です: .IP - ドキュメントに記載されていない .I lex スキャナ内部の変数 .B yylineno は .B \-l もしくは .B %option yylineno を使用しないとサポートされません。 .IP .B yylineno はスキャナ毎(単一のグローバル変数)ではなく、バッファ毎に管理されるべきです。 .IP .B yylineno は POSIX 仕様ではありません。 .IP - .B input() ルーチンは再定義できませんが、 ルールにマッチしたものに後続する文字を読むために呼ばれえます。 .B input() がファイルの終りに到達すると、通常の .B yywrap() 処理は終了します。``実際の'' ファイルの終りは .I EOF として返されます。 .IP 実際には入力は .B YY_INPUT マクロを定義することにより制御されます。 .IP .B input() を再定義できないという .I flex の制限は、最初に .I yyin を設定する以外のスキャナ入力制御方法を単に規定していないという、 POSIX 仕様と合致します。 .IP - .B unput() ルーチンは再定義できません。この制限は POSIX に合致しています。 .IP - .I flex スキャナは .I lex スキャナとは異なりリエントラントではありません。 実際、対話的なスキャナにおいて、 割り込みハンドラにてロングジャンプを用いてスキャナから脱出し、 その後スキャナを再度呼び出す場合、以下のメッセージを得るでしょう: .nf fatal flex scanner internal error--end of buffer missed .fi スキャナに再度入るためには、まず以下のようにして下さい .nf yyrestart( yyin ); .fi この呼び出しにより入力バッファは捨てられることに注意して下さい; 通常これは対話的スキャナでは問題ではありません。 .IP また、C++ スキャナクラスはリエントラント .I です ので、C++ を使用できるのなら、C++ を使用すべきです。 前述の "C++ スキャナの生成" を参照して下さい。 .IP - .B output() はサポートされていません。 .B ECHO マクロからの出力はファイルポインタ .I yyout (デフォルトでは .I 標準出力 )に対して行われます。 .IP .B output() は POSIX 仕様にはありません。 .IP - .I lex は排他的開始条件 (%x) をサポートしませんが、これは POSIX 仕様にあります。 .IP - 定義を展開する時、 .I flex では括弧で括ります。 lex では以下は: .nf NAME [A-Z][A-Z0-9]* %% foo{NAME}? printf( "Found it\\n" ); %% .fi 文字列 "foo" にはマッチしません。 なぜなら展開されたマクロはルール "foo[A-Z][A-Z0-9]*?" と等価になり、 優先度にて `?' は "[A-Z0-9]*" と結び付きます。 .I flex ではルールが展開されると "foo([A-Z][A-Z0-9]*)?" となり、 文字列 "foo" がマッチします。 .IP .B ^ で始まるか .B $ で終る定義は、展開時に括弧で括らず、 これらのオペレータが定義において特別な意味を失わないようにすることに 注意して下さい。 しかし .B , /, .B <> オペレータは .I flex の定義では使用できません。 .IP .B \-l を使用すると、 .I lex の振舞いと同じく定義を括弧で括りません。 .IP POSIX 仕様では、定義を括弧で括ります。 .IP - .I lex の実装によっては、 ルールのパターンの右側に空白がある場合、 ルールのアクションを別の行から始めることを許します: .nf %% foo|bar { foobar_action(); } .fi .I flex はこの機能をサポートしません。 .IP - .I lex の .B %r (Ratfor スキャナの生成)オプションはサポートされていません。 これは POSIX 仕様には含まれません。 .IP - スキャナを .B %array を使用して構築したのではない限り、 .B unput() 呼び出し後には、次のトークンにマッチするまで .I yytext は未定義です。 これは .I lex にも POSIX 仕様にも当てはまりません。 .B \-l オプションを指定するとこの非互換性を取り除きます。 .IP - .B {} (数値範囲)オペレータの優先度が異なります。 .I lex は "abc{1,3}" を "1 度か 2 度か 3 度の 'abc' にマッチ" と解釈しますが、 .I flex は "'ab' に 1 度か 2 度か 3 度の 'c' が続くものにマッチ" と解釈します。 後者が POSIX 仕様に合致します。 .IP - .B ^ オペレータの優先度が異なります。 .I lex は "^foo|bar" を "行頭の 'foo' か任意位置の 'bar' にマッチ" と解釈しますが、 .I flex は "行頭の 'foo' か 'bar' にマッチ" と解釈します。 後者が POSIX 仕様に合致します。 .IP - .I lex でサポートされている .B %a 等の特別なテーブルサイズの宣言は .I flex スキャナでは不要です; .I flex はこれらを無視します。 .IP - .I flex と .I lex のどちらでもスキャナを使用可能に書けるように、 .bd FLEX_SCANNER という名前を定義します。 スキャナを生成した .I flex のバージョンを表す .B YY_FLEX_MAJOR_VERSION と .B YY_FLEX_MINOR_VERSION を、スキャナは含みます (例えば 2.5 リリースではこれらはそれぞれ 2 と 5 になります)。 .PP 以下の .I flex の機能は .I lex および POSIX 仕様には含まれません: .nf C++ スキャナ %option 開始条件スコープ 開始条件スタック 対話的/非対話的スキャナ yy_scan_string() 等 yyterminate() yy_set_interactive() yy_set_bol() YY_AT_BOL() <> <*> YY_DECL YY_START YY_USER_ACTION YY_USER_INIT #line ディレクティブ アクションの周りの %{} 単一行における複数のアクション .fi さらにほぼ全ての flex フラグです。 リストの最後の機能の意味は、 .I flex では複数のアクションをセミコロンで区切って同一行に記述可能ですが、 .I lex では次の .nf foo handle_foo(); ++num_foos_seen; .fi は (驚くべきことに) 次のように切り詰められるということです。 .nf foo handle_foo(); .fi .I flex はアクションを切り詰めません。 ブレースで括られないアクションは単純に行末で終了します。 .SH 診断 .PP .I warning, rule cannot be matched 常に同じテキストにマッチするルールが前にあるので、 与えられたルールがマッチしません。 例えば以下の "foo" は "全てを捕まえる" ルールの後ろにありますので 決してマッチしません: .nf [a-z]+ got_identifier(); foo got_foo(); .fi スキャナ中で .B REJECT を使用するとこの警告を抑制します。 .PP .I warning, .B \-s .I option given but default rule can be matched (おそらくある特定の開始条件のもとでは) デフォルトルール (任意の一文字にマッチする) しか特定の入力に 対してはマッチしないことがあります。 .B \-s を指定しているので、おそらくそうなりません。 .PP .I reject_used_but_not_detected undefined あるいは .I yymore_used_but_not_detected undefined - これらのエラーは コンパイル時に起きます。スキャナが .B REJECT もしくは .B yymore() を使っていますが .I flex がそのことに気づかなかったということです。 つまり、 .I flex は最初の 2 つの部分を探しても これらのアクションの出現を見つけられなかったのですが、 実際には何らかの方法 (例えば #include ファイルを介して)でこれらが記述されていた、ということです。 .B %option reject か .B %option yymore を使用して、flex にこれらの機能を実際に使用していることを教えて下さい。 .PP .I flex scanner jammed - .B \-s でコンパイルされたスキャナが、どのルールにもマッチしない 入力文字列に遭遇しました。 内部的な問題に起因してこのエラーが起こることもあります。 .PP .I token too large, exceeds YYLMAX - スキャナが .B %array を使っている場合に、あるルールが定数 .B YYLMAX (デフォルトで 8K バイト) より大きな文字列とマッチしました。 .I flex の入力ファイルの定義部で .B YYLMAX を #define することで値を大きくできます。 .PP .I scanner requires \-8 flag to .I use the character 'x' - スキャナの記述に 8 ビットの文字 .I 'x' を識別する部分があり、 .B \-Cf もしくは .B \-CF のテーブル圧縮オプションのためにデフォルトの 7 ビットになっている にもかかわらず、 \-8 オプションをつけていないということです。 詳細は .B \-7 フラグのオプションの議論を参照して下さい。 .PP .I flex scanner push-back overflow - .B unput() でテキストを戻しすぎたため、スキャナのバッファは 戻したテキストと現トークンを .B yytext に保てません。 この場合、理想的にはスキャナが動的にバッファの大きさを変えるべきですが、 現在のところそうなってはいません。 .PP .I input buffer overflow, can't enlarge buffer because scanner uses REJECT - スキャナは非常に大きなトークンのマッチを調べていて、入力バッファを 拡張する必要が起きました。しかしながら、バッファの拡張は .B REJECT を使うスキャナでは働きません。 .PP .I fatal flex scanner internal error--end of buffer missed - スキャナが使用しているフレームから(を越えて)ロングジャンプした後、 再度スキャナに入った場合に起こります。 再度スキャナに入る前に: .nf yyrestart( yyin ); .fi を使うか、前述のように C++ スキャナクラスを使用するようにして下さい。 .PP .I too many start conditions in <> construct! - 存在するより多くの開始条件を <> 中に記載しました (少なくとも一つを二度記載しました)。 .SH 関連ファイル .TP .B \-ll スキャナがリンクしなければならないライブラリ。 .TP .I lex.yy.c 生成されたスキャナ(システムによっては .I lexyy.c という名前になります)。 .TP .I lex.yy.cc .B -+ を使った時に作成された C++ スキャナクラス。 .TP .I C++ スキャナベースクラス .B FlexLexer とその導出クラス .B yyFlexLexer を定義するヘッダファイル。 .TP .I flex.skl スケルトンスキャナ。 このファイルは flex の実行時ではなく、flex を構築する時のみ利用されます。 .TP .I lex.backup .B \-b フラグ用のバックアップ情報(システムによっては .I lex.bck という名前になります)。 .SH 欠陥 / バグ .PP 右文脈(trailing context)パターンの中には、正しくマッチせず 警告メッセージ ("dangerous trailing context") を出すものがあります。 これらのパターンは、 ルールの最初の部分が 2番目の頭の部分とマッチするようなものです。 例えば "zx*/xy*" の場合、'x*' は右文脈の頭の 'x' とマッチします。 (POSIX ドラフトではそのようなパターンにマッチするテキストは 未定義であると述べていることに注意して下さい。) .PP 右文脈の中には、実際には固定長であるのにそうとは解釈されないものがあり、 上に述べた性能の低下が起こります。 特に、 '|' や {n} (例えば "foo{3}") は常に可変長であると解釈されます。 .PP 右文脈と特別なアクション '|' を組み合わせると .I 固定の 右文脈がよりコストのかかる .I 可変の 右文脈となります。例えば、次のようなものです: .nf %% abc | xyz/def .fi .PP .B %array もしくは .B \-l オプションを指定しない場合、 .B unput() を使うと yytext と yyleng を破壊します。 .PP NUL のパターンマッチングは他の文字の比較よりかなり遅くなっています。 .PP 入力バッファの動的な大きさの再調整は時間がかかります。これは現トークン (一般に巨大)までのマッチした全テキストの再スキャンを伴うためです。 .PP 入力のバッファリングと先読みのため、 ルーチンと 混合して使うことが出来ません。例えば、 .B getchar() と .I flex のルールはうまく行きません。代わりに .B input() を使って下さい。 .PP .B \-v オプションで表示される全テーブルエントリには、 どのルールがマッチしたのかを決定するのに必要なテーブルエントリ数が 含まれていません。エントリの数はスキャナが .B REJECT を使っていないときには DFA 状態数に等しく、 使っているときには DFA 状態数よりいくらか大きくなります。 .PP .B REJECT がオプション .B \-f もしくは .B \-F とともに使えません。 .PP .I flex の内部アルゴリズムについてのドキュメントが必要です。 .SH 関連項目 .PP lex(1), yacc(1), sed(1), awk(1). .PP John Levine, Tony Mason, and Doug Brown, .I Lex & Yacc, O'Reilly and Associates. 第 2 版を入手すること。 .PP M. E. Lesk and E. Schmidt, .I LEX \- Lexical Analyzer Generator .PP Alfred Aho, Ravi Sethi and Jeffrey Ullman, .I Compilers: Principles, Techniques and Tools, Addison-Wesley (1986). .I flex で使用しているパターンマッチング技法を解説している(決定性オートマトン)。 .SH 作者 Vern Paxson が多くのアイディアとインスピレーションを得る助けを Van Jacobson から受けました。 オリジナルバージョンは Jef Poskanzer が作成しました。 高速テーブル表現は Van Jacobson のデザインの部分実装です。 この実装は Kevin Gong と Vern Paxson が行いました。 .PP 多くの .I flex ベータテスタ、フィードバッカ、コントリビュータ、特に Francois Pinard, Casey Leedom, Robert Abramovitz, Stan Adermann, Terry Allen, David Barker-Plummer, John Basrai, Neal Becker, Nelson H.F. Beebe, benson@odi.com, Karl Berry, Peter A. Bigot, Simon Blanchard, Keith Bostic, Frederic Brehm, Ian Brockbank, Kin Cho, Nick Christopher, Brian Clapper, J.T. Conklin, Jason Coughlin, Bill Cox, Nick Cropper, Dave Curtis, Scott David Daniels, Chris G. Demetriou, Theo Deraadt, Mike Donahue, Chuck Doucette, Tom Epperly, Leo Eskin, Chris Faylor, Chris Flatters, Jon Forrest, Jeffrey Friedl, Joe Gayda, Kaveh R. Ghazi, Wolfgang Glunz, Eric Goldman, Christopher M. Gould, Ulrich Grepel, Peer Griebel, Jan Hajic, Charles Hemphill, NORO Hideo, Jarkko Hietaniemi, Scott Hofmann, Jeff Honig, Dana Hudes, Eric Hughes, John Interrante, Ceriel Jacobs, Michal Jaegermann, Sakari Jalovaara, Jeffrey R. Jones, Henry Juengst, Klaus Kaempf, Jonathan I. Kamens, Terrence O Kane, Amir Katz, ken@ken.hilco.com, Kevin B. Kenny, Steve Kirsch, Winfried Koenig, Marq Kole, Ronald Lamprecht, Greg Lee, Rohan Lenard, Craig Leres, John Levine, Steve Liddle, David Loffredo, Mike Long, Mohamed el Lozy, Brian Madsen, Malte, Joe Marshall, Bengt Martensson, Chris Metcalf, Luke Mewburn, Jim Meyering, R. Alexander Milowski, Erik Naggum, G.T. Nicol, Landon Noll, James Nordby, Marc Nozell, Richard Ohnemus, Karsten Pahnke, Sven Panne, Roland Pesch, Walter Pelissero, Gaumond Pierre, Esmond Pitt, Jef Poskanzer, Joe Rahmeh, Jarmo Raiha, Frederic Raimbault, Pat Rankin, Rick Richardson, Kevin Rodgers, Kai Uwe Rommel, Jim Roskind, Alberto Santini, Andreas Scherer, Darrell Schiebel, Raf Schietekat, Doug Schmidt, Philippe Schnoebelen, Andreas Schwab, Larry Schwimmer, Alex Siegel, Eckehard Stolz, Jan-Erik Strvmquist, Mike Stump, Paul Stuart, Dave Tallman, Ian Lance Taylor, Chris Thewalt, Richard M. Timoney, Jodi Tsai, Paul Tuinenga, Gary Weik, Frank Whaley, Gerhard Wilhelms, Kent Williams, Ken Yap, Ron Zellar, Nathan Zelle, David Zuhn, および私の最低のメールアーカイブ能力から滑り落ちた方々、 それらの方々の協力にも同様に感謝します。 .PP Keith Bostic, Jon Forrest, Noah Friedman, John Gilmore, Craig Leres, John Levine, Bob Mulcahy, G.T. Nicol, Francois Pinard, Rich Salz, Richard Stallman には多くの悩みの分散に関して感謝します。 .PP Esmond Pitt と Earle Horton には 8 ビット文字サポートに関して; Benson Margulies と Fred Burke には C++ サポートに関して; Kent Williams と Tom Epperly には C++ クラスサポートに関して; Ove Ewerlid には NUL のサポートに関して; Eric Hughes には複数バッファのサポートに関して、それぞれ感謝します。 .PP この作品は当初、私が CA Berkeley の Lawrence Berkeley Laboratory における Real Time Systems Group にいた時に作成されました。 私に協力してくれた方々に感謝します。 .PP コメントは vern@ee.lbl.gov に送って下さい。 diff --git a/ja_JP.eucJP/man/man1/lpr.1 b/ja_JP.eucJP/man/man1/lpr.1 index abea91d085..09f3234caa 100644 --- a/ja_JP.eucJP/man/man1/lpr.1 +++ b/ja_JP.eucJP/man/man1/lpr.1 @@ -1,242 +1,242 @@ .\" Copyright (c) 1980, 1990, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)lpr.1 8.1 (Berkeley) 6/6/93 .\" %Id: lpr.1,v 1.8 1997/09/24 06:48:07 charnier Exp % .\" jpman %Id: lpr.1,v 1.3 1997/08/11 14:28:54 horikawa Stab % .\" .Dd June 6, 1993 .Dt LPR 1 .Os BSD 4 .Sh 名称 .Nm lpr .Nd 印刷ジョブを生成し、キューに登録する .Sh 書式 .Nm lpr .Op Fl P Ns Ar printer .Op Fl \&# Ns Ar num .Op Fl C Ar class .Op Fl J Ar job .Op Fl T Ar title .Op Fl U Ar user .Op Fl i Ar numcols .Op Fl 1234 Ar font .Op Fl w Ns Ar num .Op Fl cdfghlnmprstv .Op Ar name ... .Sh 解説 .Nm lpr は、プリンタが利用可能になったときにファイルをプリント アウトするためにスプーリングデーモンを利用します。 もしファイル名が指定されないようなら、標準入力から読みます。 .Pp 以下の単一文字のオプションは、ファイルが通常のテキストファイルでないこ とをラインプリンタのスプールデーモンに教えるためのものです。スプールデー モンはそのデータを適切に出力するために、データにふさわしいフィルタを使 うようになります。 .Bl -tag -width indent .It Fl c ファイルが .Xr cifplot 1 で作成されたデータを含んでいるものとみなします。 .It Fl d ファイルが .Tn TeX の .Tn DVI フォーマットであるとみなします。 .It Fl f 各行の最初の文字を、標準的な FORTRAN のキャリッジコントロール キャラクタとして処理するフィルタを使うようになります。 .It Fl g ファイルが .Xr plot ルーチンで作成された 標準的な plot データであるとみなします。 .It Fl l コントロールキャラクタを通し、ページの区切りを抑制するフィルタを利用します。 .It Fl n ファイルが .Em ditroff (デバイスに依存しないtroff) からのデータであるとみなします。 .It Fl p ファイルの整形に .Xr pr 1 を利用します。 .It Fl t ファイルが(写植印字コマンドである) .Xr troff 1 からのデータであるとみなします。 .It Fl v ファイルが Benson Varian のようなデバイスのためのラスターイメージを 含むものとみなします。 .El .Pp 以下のオプションは、プリントジョブを操作するときに適用します: .Bl -tag -width indent .It Fl P 指定したプリンタに出力します。これを指定しない通常の場合は、 デフォルトプリンタが使われる (これはサイトごとに依存します)か、 環境変数 .Ev PRINTER の値が使われます。 .It Fl h バーストページを出力しないようにします。 .It Fl m 終了時にメールを送ってきます。 .It Fl r -スプーリングの終了時、もしくは、出力の終了時にファイルを削除します ( +スプーリングの終了時にファイルを削除します。 .Fl s -オプション使用時)。 +オプション使用時には出力の終了時に削除します。 .It Fl s シンボリックリンクを利用します。通常、ファイルはスプールディ レクトリにコピーされますが、大きなファイルをコピーするよりは .Fl s オプションで .Xr symlink 2 を使ってデータファイルにリンクを張ったほうがよ いでしょう。つまり、これはファイルのプリントアウトが完了するまではファ イルに変更を加えたり、削除したりするべきではないということを意味します。 .El .Pp 残りのオプションはコピーを行ったり、ページの表示やヘッダの表示を行います: .Bl -tag -width indent .It Fl \&# Ns Ar num .Ar num は、各ファイルのコピーの枚数です。例えば、 .Bd -literal -offset indent lpr \-#3 foo.c bar.c more.c .Ed は、foo.cのコピーを3回行った後、bar.cのコピーを3回行います。一方、 .Bd -literal -offset indent cat foo.c bar.c more.c \&| lpr \-#3 .Ed .Pp は、連結されたファイルのコピーを3回行います。 をこの機能を禁止してコピー機の使用を推奨しているサイトがあるかもしれません。 .It Xo .Fl Ns Oo Cm 1234 Oc Ar font .Xc フォントポジション .Ar i のフォントを指定します。デーモンはフォントのパス名を参照する .Li .railmag ファイルを作成します。 .It Fl C Ar class バーストページで使うジョブ見出しです。例えば、 .Bd -literal -offset indent lpr \-C EECS foo.c .Ed .Pp は、バーストページのシステム名( .Xr hostname 1 で返される)を EECS に置き換えて、foo.c をプリントします。 .It Fl J Ar job バーストページに書くジョブ名です。通常は、 一番最初のファイルの名前が使われます。 .It Fl T Ar title .Xr pr 1 のタイトル名に、ファイル名のかわりにこのタイトルを使います。 .It Fl U Ar user バーストページで使うユーザー名であり、課金目的でも利用されます。 このオプションは実ユーザidがデーモン(あるいはデーモンの代わりに printcap中で指定されているユーザ)のみ使用できます。 .It Fl i numcols 出力が .Pq Ar numcols でインデントされます。 .It Fl w Ns Ar num .Xr pr 1 のページ幅を .Ar num にします。 .El .Sh 環境変数 以下の環境変数が存在すると、 .Nm lpr が使用します: .Bl -tag -width PRINTER .It Ev PRINTER かわりのデフォルトプリンタを指定する .El .Sh 関連ファイル .Bl -tag -width /var/spool/output/*/tf* -compact .It Pa /etc/passwd 個人の識別を行うためのファイル .It Pa /etc/printcap プリンタの特徴を記述したデータベース .It Pa /usr/sbin/lpd ラインプリンタデーモン .It Pa /var/spool/output/* スプーリングのために利用するディレクトリ .It Pa /var/spool/output/*/cf* デーモンの制御のためのファイル .It Pa /var/spool/output/*/df* ``cf'' ファイルが指定するデータファイル .It Pa /var/spool/output/*/tf* ``cf'' ファイルの一時的なコピー .El .Sh 関連項目 .Xr lpq 1 , .Xr lprm 1 , .Xr pr 1 , .Xr symlink 2 , .Xr printcap 5 , .Xr lpc 8 , .Xr lpd 8 .Sh 歴史 .Nm コマンドは .Bx 3 から登場しました。 .Sh 診断 もしとても大きいファイルをスプールしようとするなら、途中で切れてしまう でしょう。 .Nm はバイナリファイルを印刷することを目的としています. もしルート以外のあるユーザーがファイルを印刷しようとしてスプールに 失敗したら、 .Nm はその旨のメッセージを印刷してそのファイルは印刷されません。 もしローカルマシンの .Xr lpd 8 との接続ができなければ、 .Nm はデーモンを起動できなかったと言うでしょう。その結果は .Xr lpd 8 によってファイルのスプールに失敗したとデーモンのログファイルに 残されるでしょう。 .Sh バグ .Xr troff 1 と .Xr tex のフォントは,プリンタがつながっているホストにないといけません。 これは,現在はローカルのフォントライブラリを使うことができないことを 意味します。 diff --git a/ja_JP.eucJP/man/man8/adding_user.8 b/ja_JP.eucJP/man/man8/adding_user.8 index 79c684d361..5bbcbb2298 100644 --- a/ja_JP.eucJP/man/man8/adding_user.8 +++ b/ja_JP.eucJP/man/man8/adding_user.8 @@ -1,125 +1,126 @@ .\" Copyright (c) 1980, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)adduser.8 8.1 (Berkeley) 6/5/93 .\" %Id: adding_user.8,v 1.2 1997/03/07 03:28:19 jmg Exp % .\" jpman %Id: adding_user.8,v 1.3 1997/07/22 16:44:29 horikawa Stab % .\" .Dd June 5, 1993 .Dt ADDING_USER 8 .Os BSD 4 .Sh 名称 .Nm adding_user .Nd 新規ユーザ登録のためのプロシージャ .Sh 解説 新規ユーザはログイン名を選ばなければなりません。 ここで、ログイン名は既に .Pa /etc/passwd や .Pa /etc/aliases に登録されているものであってはいけません。 また、ハイフン .Ql Fl 文字で始まるものも使えません。 メーラを混乱させないためにも、全ての文字は英小文字でドット .Ql \&. 文字を含まないことが、強く推奨されています。 アカウントは、パスワードファイルを一行編集することで加えることが できます。これを行う時は、パスワードファイルはロックされていなければ なりません。このロックは、 .Xr chpass 1 や .Xr vipw 8 を使うことで可能です。 .Pp 新規ユーザには、グループとユーザ id を与えます。 ログイン名とユーザ id は、システム全体やしばしばシステムグループで 一意でなければなりません。これは、ファイルのアクセスを制御するために 使われるからです。 典型的には、似たようなプロジェクトで働いているユーザは同じグループに -入ります。カルフォルニア大学バークレイ分校では、システムスタッフ・ +入ります。 +University of California の Berkley 校では、システムスタッフ・ 学部・大学院・大きなプロジェクトのための特別なプロジェクトのグループが あります。 .Pp 新規ユーザ \*(lqernie\*(rq のための骨格となるアカウントは、以下のようになります。 .Bd -literal ernie::25:30::0:0:Ernie Kovacs,508 Evans Hall,x7925, 642-8202:/a/users/ernie:/bin/csh .Ed .Pp 個々のフィールドの解説は、 .Xr passwd 5 を参照してください。 .Pp 新規ユーザに始めるにあたっていくつかの助けを与えることは良いことです。 このために、いくつかの骨格となるファイルを与えてあげれます。 .Pa /bin/sh ユーザには、 .Pa \&.profile を、 .Pa /bin/csh ユーザには、 .Pa \&.cshrc や .Pa \&.login を与えれば良いでしょう。 .Pa /usr/share/skel ディレクトリに、そのようなファイルの骨格の定義を置いておけます。 新規ユーザは、これらのファイルの複製を与えられます。 ここで、例えば .Xr tset 1 をログインする度に自動的に実行するように設定できます。 .Sh 関連ファイル .Bl -tag -width /etc/master.passwdxx -compact .It Pa /etc/master.passwd ユーザデータベース .It Pa /usr/share/skel ログインディレクトリのための骨格データ .El .Sh 関連項目 .Xr chpass 1 , .Xr finger 1 , .Xr passwd 1 , .Xr aliases 5 , .Xr passwd 5 , .Xr adduser 8 , .Xr pwd_mkdb 8 , .Xr vipw 8 .Sh バグ ユーザ情報は (段々とそうなってきていますが)、別のところに 記憶するべきです。 .Sh 歴史 .Nm プロシージャは .Bx 3.0 から導入されました. diff --git a/ja_JP.eucJP/man/man8/makekey.8 b/ja_JP.eucJP/man/man8/makekey.8 index 4f87fc1da4..9dec316883 100644 --- a/ja_JP.eucJP/man/man8/makekey.8 +++ b/ja_JP.eucJP/man/man8/makekey.8 @@ -1,60 +1,60 @@ .\" Copyright (c) 1990, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)makekey.8 8.2 (Berkeley) 12/11/93 .\" %Id: makekey.8,v 1.8 1997/11/24 07:29:12 charnier Exp % .\" jpman %Id: makekey.8,v 1.2 1997/05/21 07:56:47 yugawa Stab % .\" .Dd December 11, 1993 .Dt MAKEKEY 8 .Os .Sh 名称 .Nm makekey .Nd 暗号キーやパスワードを作成する .Sh 書式 .Nm makekey .Sh 解説 .Nm makekey は標準入力から読み込んだキーと隠しキー (salt) を暗号化し、 結果を標準出力へ書き込みます。 -キーは 8 バイト、隠しキーは 2 バイトであること期待されます。 +キーは 8 バイト、隠しキーは 2 バイトであることが期待されます。 キーと隠しキーはどんな文字を含んでよいか、 どうやって暗号化計算が行なわれるか、の詳しい情報は .Xr crypt 3 を参照のこと。 .Sh 関連項目 .Xr login 1 , .Xr crypt 3 .Sh 歴史 .Nm コマンドは .At v7 から登場しました。 diff --git a/ja_JP.eucJP/man/man8/ppp.8 b/ja_JP.eucJP/man/man8/ppp.8 index dd29957147..cdca52191c 100644 --- a/ja_JP.eucJP/man/man8/ppp.8 +++ b/ja_JP.eucJP/man/man8/ppp.8 @@ -1,3742 +1,3742 @@ .\" %Id: ppp.8,v 1.126 1998/09/18 23:28:10 brian Exp % .\" jpman %Id: ppp.8,v 1.4 1997/06/08 18:41:58 saeki Stab % .\" WORD: expect string 受信待ち文字列 (chat.8) .\" WORD: negotiation 交渉 .Dd 20 September 1995 .Os FreeBSD .Dt PPP 8 .Sh 名称 .Nm ppp .Nd PPP (Point to Point Protocol) (別名 user-ppp) .Sh 書式 .Nm .Oo .Fl auto | .Fl background | .Fl ddial | .Fl direct | .Fl dedicated .Oc .Op Fl alias .Op Ar system .Sh 解説 本プログラムは、ユーザプロセスとして動作する .Em PPP パッケージです。 .Em PPP は通常、( .Xr pppd 8 でそうなっているように) カーネルの一部として実装されますが、 そのため、デバッグや動作の変更が少々難しい場合があります。 それに対し、この実装ではトンネルデバイスドライバ (tun) を利用して、 ユーザプロセスで .Em PPP を実現しています。 .Sh 主な特徴 .Bl -diag .It 対話的なユーザインタフェースを提供 コマンドモードで利用する場合、ユーザがコマンドを 入力することで、簡単にリモートコンピュータとの接続の確立、 接続状態の確認、 接続の切断を行うことができます。 オプションとして、セキュリティ確保のために すべての機能をパスワードで保護することができます。 .It 手動と自動でのダイヤルをサポート 対話モードでは、直接モデムと通信できるように .Dq term コマンドが用意されています。 モデムがリモートホストと接続されて、 .Em PPP での通信が始まったら、 .Nm はそれを検出して自動的にパケットモードに移行します。 ひとたびリモートホストとの接続に必要なコマンドシーケンスがわかったら、 後々の接続を簡単にするため、必要なダイヤル手順やログイン手順を定義した チャットスクリプトを書くことができます。 .It オンデマンドでのダイヤルアップをサポート .Fl auto モード (自動モード) では .Nm はデーモンとして動作し、 .Em PPP リンクを通して送られるパケットを待ちうけます。 パケットを検出すると、デーモンが自動的にダイヤルを行って接続を確立します。 .Fl ddial モード (直接ダイヤルモード) でも ほぼ同様に、自動ダイヤルと接続の確立を行います。 しかしながらこのモードは、送るべきパケットが存在しない場合にも、 リンクが切れていることを検出するといつでもリモートへダイヤルするという点が auto モードと異なります。 このモードは、電話料金よりも常時接続されていることが重視される場合に有用です。 3 番目の .Fl dedicated モード (専用線モード) も利用可能です。 このモードは 2 つのマシン間の専用線を対象にしています。 専用線モードでは .Nm は自発的に動作を終了することはありません - 終了するには .Dq quit all コマンドを診断ソケットを介して送る必要があります。 .Dv SIGHUP は LCP の再交渉を強要し、 .Dv SIGTERM は終了を強要します。 .It クライアントコールバックをサポート .Nm は標準 LCP コールバックプロトコルならびに Microsoft コールバック制御プロトコル (ftp://ftp.microsoft.com/developr/rfc/cbcp.txt) を使用できます。 .It パケットエイリアシングをサポート パケットエイリアシング (別名: IP マスカレード) により、 未登録でプライベートなネットワーク上のコンピュータからも インターネットにアクセスすることが可能です。 .Em PPP ホストはマスカレードゲートウェイとして動作します。 送信パケットの IP アドレスと TCP や UDP のポート番号は どちらもエイリアスされ、返信パケットではエイリアスが元に戻されます。 .It バックグラウンド PPP 接続をサポート バックグラウンドモードでは、接続を確立するのに成功した場合に .Nm はデーモンになります。 それ以外の場合はエラーで終了します。 これにより、 接続が成功裏に確立した場合のみコマンドを実行するようなスクリプト をセットアップすることが出来ます。 .It サーバとしての PPP 接続をサポート ダイレクトモードでは、 .Nm は標準入力/標準出力からの .Em PPP 接続を受け入れるサーバとして動作させることができます。 .It PAP と CHAP による認証をサポート PAP もしくは CHAP を用いることにより、Unix スタイルの .Xr login 1 手続きをスキップし、 .Em PPP プロトコルを代りに認証に使用することが可能です。 相手が Microsoft CHAP 認証を要求し、かつ .Nm が DES をサポートするようにコンパイルされている場合、適当な MD4/DES 応答がなされます。 .It 代理 arp (Proxy Arp) をサポート .Em PPP がサーバとして動作している時、その接続について代理 arp を行うよう 設定できます。 .It パケットのフィルタリングをサポート ユーザは 4 種類のフィルタを定義できます。 .Em in は受信パケットに対するフィルタです。 .Em out は送信パケットに対するフィルタです。 .Em dial はダイヤルを行うきっかけとなるパケットを定義するフィルタで、 .Em alive は接続を保持するためのパケットを定義するフィルタです。 .It トンネルドライバは bpf (Berkeley Packet Filter) をサポート .Em PPP リンクを流れるパケットを調べるために、 .Xr tcpdump 1 を使うことができます。 .It PPP オーバ TCP をサポート デバイス名が .Em host Ns No : Ns Em port 形式で指定された場合、 .Nm は通常のシリアルデバイスを使うのではなく、データ転送のための TCP 接続を開きます。 .It IETF ドラフトの Predictor-1 と DEFLATE 圧縮をサポート .Nm は VJ 圧縮の他に Predictor-1 と DEFLATE 圧縮もサポートしています。 モデムは通常 (例えば v42.bis のような) 組み込みの圧縮機能を持っており、 その結果システムは .\"(訳注)「転送データレートよりも」をここにいれたいと考えています。 .\" 2.2.1R 対象(1997/04/02) Takeshi MUTOH より高いデータレートで通信できます。 これは一般には良いことですが、より高速のデータによってシリアル回線からの 割り込みが増加します。 システムはこの割り込みをモデムと通信して処理しなくてはならないため、 システムの負荷と遅延時間が増加することになります。 VJ 圧縮とは異なり、Predictor-1 と DEFLATE 圧縮はリンクを通る .Em すべての ネットワークトラフィックをあらかじめ圧縮しておくことで、オーバヘッドを 最小にします。 .It Microsoft の IPCP 拡張をサポート Microsoft の .Em PPP スタックを使用するクライアント (つまり Win95, WinNT) との間で ネームサーバのアドレスと NetBIOS ネームサーバのアドレスを 交渉することができます。 .It マルチリンク PPP をサポート 接続先への複数の物理的な回線をオープンし、すべてのリンクの 帯域幅を合わせてより高いスループットを得ることができます。 .El .Sh パーミッション .Nm はユーザ .Dv root 、グループ .Dv network 、パーミッション .Dv 4554 でインストールされます。 デフォルトでは .Nm は、起動したユーザ ID が 0 でない場合には実行しません。 これは .Dq allow users コマンドを .Pa /etc/ppp/ppp.conf に記載することにより変更することが可能です。 通常ユーザとして実行する場合には、 .Nm はユーザ ID 0 に変わり、システムの経路表の変更と、 システムロックファイルの作成と、 ppp の設定ファイルの読み込みを行います。 すべての外部コマンド ("shell" や "!bg" で実行されます) は、 .Nm を起動したユーザ ID で実行されます。 ユーザ ID 0 にて正確になにが行われているのかに興味がある場合には、 ログ機能の .Sq ID0 を参照してください。 .Sh 始める前に 最初に .Nm を実行する時には、いくつかの初期設定を整える必要があります。 .Bl -bullet .It カーネルにトンネルデバイスが含まれていなければ なりません (GENERIC カーネルではデフォルトで 1 つ含まれます)。 もし含まれていない場合や複数の tun インタフェースが必要な場合、 次の行をカーネル設定ファイルに追加して、 カーネルを再構築する必要があります: .Pp .Dl pseudo-device tun N .Pp ここで .Ar N は .Em PPP 接続を行いたい最大の数です。 .It .Pa /dev ディレクトリにトンネルデバイスのエントリ .Pa /dev/tunN があるかどうかを調べてください。 ここで .Sq N は、0 から始まる tun デバイスの番号です。 もし無いようならば、"sh ./MAKEDEV tunN" を実行すれば作ることができます。 これにより 0 から .Ar N までの tun デバイスが作成されます。 .It あなたのシステムの .Pa /etc/group ファイルに .Dq network グループがあり、そのグループが .Nm を使うと想定されるすべてのユーザ名を含んでいることを確かめてください。 詳細は .Xr group 5 マニュアルページを参照してください。また、これらのユーザは .Pa /etc/ppp/ppp.conf ファイルで .Dq allow users コマンドを使用してアクセス権が与えられなければなりません。 .It ログファイルを作成します。 .Nm は .Xr syslog 3 を使用して情報をログします。通常のログファイル名は .Pa /var/log/ppp.log です。 このファイルに出力を行うためには、次の行を .Pa /etc/syslog.conf ファイルに記述してください: .Bd -literal -offset indent !ppp *.*/var/log/ppp.log .Ed .Pp TAB と書かれている場所には、実際にはタブを入力します。 空白文字を使うと、 .Xr syslogd 8 はこの行を無視し、そのことも報告しません。 .Pp .Nm の実行形式にリンクを作成することにより、複数の .Em PPP ログファイルを持つことが可能です: .Pp .Dl # cd /usr/sbin .Dl # ln ppp ppp0 .Pp として .Pa /etc/syslog.conf で .Bd -literal -offset indent !ppp0 *.*/var/log/ppp0.log .Ed .Pp とします。 .Pa /etc/syslog.conf を更新した後に、 .Xr syslogd 8 に .Dv HUP シグナルを送ることをお忘れなく。 .It 厳密には .Nm の操作とは関係ありませんが、リゾルバが正しく働くように設定した方が 良いでしょう。 これは .Pq Xr named 8 を用いて ローカルな DNS サーバを設定するか、もしくは .Pa /etc/resolv.conf ファイルに適切な .Sq name-server 行を加えることで行われます。 詳細は .Xr resolv.conf 5 のマニュアルを参照してください。 .Pp 他の方法として、もし接続先がサポートしている場合には .Nm が接続先にネームサーバのアドレスを尋ねて、自動的に .Pa /etc/resolv.conf を更新することができます。詳細は後述の .Dq enable dns コマンドを参照してください。 .El .Sh 手動ダイヤル 次の例では、あなたのマシン名が .Dv awfulhak であるとして説明します。 .Nm を引数無しで起動すると (前述の .Em パーミッション 参照) 次のプロンプトが表示されます: .Bd -literal -offset indent ppp ON awfulhak> .Ed .Pp プロンプトの .Sq ON の部分は常に大文字であるべきです。ここが小文字の場合、 .Dq passwd コマンドを使用してパスワードを入力しなければならないことを意味します。 実行中の .Nm に接続し、 まだ正しいパスワードを入力していない場合にのみこのような状態になります。 .Pp ここで、モデムのデバイス名、スピードやパリティの設定、 CTS/RTS 信号を使うかどうか (デフォルトでは CTS/RTS が使用されます) を 指定して、開始可能です。もしハードウェアが CTS/RTS 信号を持っていない場合 (これは PPP 可能な端末サーバに直接つなぐ場合に起こり得ます)、 .Nm はそのポートを通してどんな出力も送らず、来るはずのない信号を待ち続けます。 したがって、直接接続で通信ができないような場合には、 CTS/RTS を off にしてみてください: .Bd -literal -offset indent ppp ON awfulhak> set line /dev/cuaa0 ppp ON awfulhak> set speed 38400 ppp ON awfulhak> set parity even ppp ON awfulhak> set ctsrts on ppp ON awfulhak> show modem * モデム関連のパラメータが、ここに示されます * ppp ON awfulhak> .Ed .Pp ここでは、直接モデムと通信するために term コマンドを使用可能です: .Bd -literal -offset indent ppp ON awfulhak> term at OK atdt123456 CONNECT login: ppp Password: Protocol: ppp .Ed .Pp 相手が .Em PPP で話しはじめると、 .Nm はそれを自動的に検出してコマンドモードに戻ります。 .Bd -literal -offset indent ppp ON awfulhak> Ppp ON awfulhak> PPp ON awfulhak> PPP ON awfulhak> .Ed .\" your end で「あなた側」 このようにならない場合、接続先がこちらの開始交渉を 待っている可能性があります。強制的に .Nm に接続先への PPP 設定パケットの送出を開始させるためには .Dq ~p コマンドを使ってパケットモードに移行して下さい。 .Pp これで接続されました! プロンプトの .Sq PPP が大文字に変化して、接続されたことを知らせます。もし 3 つの P の内 いくつかだけが大文字になっている場合には、すべての文字が大文字もしくは 小文字になるまで待ってください。もし小文字に戻った場合には、それは .Nm が接続先との交渉に成功しなかったことをを意味します。 たいてい、その原因は PAP もしくは CHAP 認証の name や key が 正しくないことです。 .Dq set log local phase することが、この時点でのトラブルシューティングへの第一歩としては 良いでしょう。 詳細は、下記の .Dq set log コマンドの説明を参照してください。 .Pp リンクが確立したら、show コマンドを使用することで、 どのように事態が進行しているのかが分ります: .Bd -literal -offset indent PPP ON awfulhak> show modem * モデム関連の情報がここに表示されます * PPP ON awfulhak> show ccp * CCP (圧縮) 関連の情報がここに表示されます * PPP ON awfulhak> show lcp * LCP (回線制御) 関連の情報がここに表示されます * PPP ON awfulhak> show ipcp * IPCP (IP) 関連の情報がここに表示されます * PPP ON awfulhak> show link * (高レベル) リンク関係の情報がここに表示されます * PPP ON awfulhak> show bundle * (高レベル) 論理接続関係の情報がここに表示されます * .Ed .Pp この時点で、マシンは接続先に対するホスト単位の経路 (host route) を持っています。 これはリンクの相手のホストとのみ接続可能であるという意味です。 デフォルト経路のエントリ (他の経路エントリを持たずに、全パケットを .Em PPP リンクの相手に送る ように、あなたのマシンに指示します)を追加したければ、 次のコマンドを入力してください。 .Bd -literal -offset indent PPP ON awfulhak> add default HISADDR .Ed .Pp .Sq HISADDR という文字列は、相手側の IP アドレスを表します。 .Sq HISADDR の位置に .Sq INTERFACE キーワードを使用可能です。 これにより tun インタフェース上に直接経路を作成します。 既存の経路のために失敗する場合には、 .Bd -literal -offset indent PPP ON awfulhak> add! default HISADDR .Ed .Pp を用いることで既存の経路を上書きできます。 ここで、(ping, telnet, ftp のような) ネットワークアプリケーションを 別のウィンドウで使用可能です。 使用可能コマンドの詳細は .Em PPP コマンドリスト の節を参照してください。 .Sh 自動ダイヤル 自動ダイヤルを行うためには、ダイヤルとログインのチャットスクリプトを 用意しなければなりません。定義の例は .Pa /etc/ppp/ppp.conf.sample を見てください ( .Pa /etc/ppp/ppp.conf の書式は非常に簡単です)。 各行は単一のコメント、インクルード、ラベル、コマンドのいずれかを含みます。 .Bl -bullet .It .Pq Dq # 文字で始まる行は、コメントとして扱われます。 コメント行と認識した場合、先行する空白は無視されます。 .It インクルードは語 .Sq !include から始まる行です。 1 つの引数 - インクルードするファイル - を持つ必要があります。 古いバージョンの .Nm との互換性のために、 .Dq !include ~/.ppp.conf を使用したいかもしれません。 .It ラベルは行頭から始まり、最後にコロン .Pq Dq \&: が続かなければなりません。 .It コマンド行は、最初の桁に空白かタブを含む必要があります。 .El .Pp .Pa /etc/ppp/ppp.conf ファイルには少なくとも .Dq default セクションが存在する必要があります。 このセクションは常に実行されます。 このファイルには 1 つ以上のセクションが含まれます。 セクション名は用途に応じて付けます。例えば、 .Dq MyISP はあなたの ISP を表したり、 .Dq ppp-in は入力の .Nm 構成を表したります。 .Nm ppp を立ち上げる際に、接続先のラベル名を指定可能です。 .Dq default ラベルに関係づけられたコマンドが実行されてから、 接続先ラベルに関連づけられたコマンドが実行されます。 .Nm を引数無しで起動した場合、 .Dq default だけは実行されます。load コマンドを使用して、 .Pa /etc/ppp/ppp.conf のセクションを手動でロード可能です: .Bd -literal -offset indent PPP ON awfulhak> load MyISP .Ed .Pp ひとたび接続が確立したなら、プロンプトの .Sq ppp は .Sq PPP に変わります: .Bd -literal -offset indent # ppp MyISP ... ppp ON awfulhak> dial Ppp ON awfulhak> PPp ON awfulhak> PPP ON awfulhak> .Ed .Pp Ppp プロンプトは .Nm が認証フェースに入ったことを示します。PPp プロンプトは .Nm がネットワークフェーズに入ったことを示します。PPP プロンプトは .Nm がネットワーク層プロトコルの交渉に成功し、使用可能状態にあることを示します。 .Pp もし .Pa /etc/ppp/ppp.linkup が利用可能ならば、 .Em PPP 接続が確立された時に、その内容が実行されます。 接続が確立された後のバックグラウンドでのスクリプト実行については、 提供されている .Pa /etc/ppp/ppp.conf.sample の .Dq pmdemand の例を参照してください。 .Dv HISADDR , .Dv MYADDR , .Dv INTERFACE というリテラル文字列を使用することができ、それらは関連する IP アドレスと インタフェース名に置換されます。 同様に、接続が閉じられると、 .Pa /etc/ppp/ppp.linkdown ファイルの内容が実行されます。 これらのファイルのフォーマットは .Pa /etc/ppp/ppp.conf と同じです。 .Pp 以前のバージョンの .Nm では、デフォルト経路のような経路は .Pa ppp.linkup ファイルで追加し直す必要がありました。 現在では .Nm は、 .Dv HISADDR もしくは .Dv MYADDR が変化したときに、自動的に .Dv HISADDR もしくは .Dv MYADDR 文字列を含むすべての経路を更新する .Sq スティッキー経路 をサポートします。 .Sh バックグラウンドダイヤル .Nm を使って非対話的に接続を確立したい場合 (例えば .Xr crontab 5 エントリや .Xr at 1 ジョブから使うような場合) には、 .Fl background オプションを使います。 .Fl background が指定された場合、 .Nm はすぐに接続を確立しようとします。 複数の電話番号が指定された場合には、各電話番号が 1 回づつ試されます。 これらに失敗すると、 .Nm は即座に終了し、0 でない終了コードを返します。 接続に成功すると .Nm はデーモンになり、呼び出し側に終了コード 0 を返します。 デーモンは、リモートシステムが接続を終了した場合、 もしくは .Dv TERM シグナルを受け取った場合に、自動的に終了します。 .Sh ダイヤルオンデマンド デマンドダイヤル機能は .Fl auto または .Fl ddial オプションにて有効にされます。この場合にも .Pa /etc/ppp/ppp.conf で定義された接続先のラベルを指定しなければなりません。 これには、リモート接続先の IP アドレスを指定するための .Dq set ifaddr コマンドも書かれていなければなりません ( .Pa /etc/ppp/ppp.conf.sample を参照してください)。 .Bd -literal -offset indent # ppp -auto pmdemand .Ed .Pp .Fl auto または .Fl ddial が指定された時に .Nm はデーモンとして動作しますが、 .Pa /etc/ppp/ppp.conf 中で .Dq set server コマンドを使うことで、設定を確認したり変更したりすることができます。 .Po たとえば、 .Dq set server +3000 mypasswd とすると .Pc 次のように診断ポートを通じて接続することができます。 .Bd -literal -offset indent # pppctl 3000 (tun0 を仮定 - ``set server'' の記述を参照) Password: PPP ON awfulhak> show who tcp (127.0.0.1:1028) * .Ed .Pp .Dq show who コマンドは現在 .Nm 自身に接続しているユーザの一覧を表示します。診断ソケットが閉じられる、 もしくは異なるソケットに変更された場合、すべての接続は即座に終了します。 .Pp .Fl auto モードにて 送信パケットが検出された時、 .Nm は (チャットスクリプトに基づいて) ダイヤルを行い、 通信相手に接続しようとします。 .Fl ddial モードでは回線がダウンしていることが確認された場合にはいつでも ダイヤルが行われます。 接続に失敗したら、デフォルトの動作では 30 秒間待ってから、 別の送信パケットが検出された時に接続しようとします。 この動作は次の方法で変更できます。 .Bd -literal -offset indent set redial seconds|random[.nseconds|random] [dial_attempts] .Ed .Pp .Sq seconds は、再び接続しようとするまでの秒数です。 引数が .Sq random の場合には、待ち時間を 0 秒から 30 秒の間でランダムに選びます。 .Sq nseconds は電話番号リストの中の次の番号をダイヤルする前に待つ秒数です。( .Dq set phone コマンドを参照してください)。これのデフォルトは 3 秒です。 繰り返しますが、引数が .Sq random の場合には、待ち時間を 0 秒から 30 秒の間でランダムに選びます。 .Sq dial_attempts は、受け取った個々の送信パケットに対して、何回接続を試みるのかを示す 数字です。 このパラメータが省略された場合には、以前の値がそのまま使われます。 .Sq dial_attempts に 0 が指定された場合には、 .Nm は接続できるまでダイヤルを続けます。 .Bd -literal -offset indent set redial 10.3 4 .Ed .Pp は個々の送信パケットに対して 4 回接続を試み、 番号間の待ち時間が 3 秒で、すべての番号を試した後に 10 秒待つことを表します。 複数の電話番号が指定されている場合でも、トータルのダイヤル回数は 4 回のままです。 (それぞれの番号を 4 回ダイヤルするのではありません)。 リンクの両端が .Nm のデマンドダイヤルモードを利用している場合は、 ダイヤル間隔を変更しておくのが良いでしょう。 もし、リンクの両端が同じタイムアウト時間に設定されていて、 リンクが切れて両方に送信待ちのパケットがあった場合、 両方が同時に相手を呼び出しあうことになってしまいます。 場所によっては、シリアルリンクに信頼性がなく、 切れるべきでない時にキャリアが失われるかもしれません。 セッションの途中で予期せずキャリアが失われた場合、 .Nm にリダイヤルさせることができます。 .Bd -literal -offset indent set reconnect timeout ntries .Ed .Pp このコマンドは、キャリアが失われた時に .Ar timeout 秒の間隔を置いて .Ar ntries 回まで接続を再確立するよう .Nm に指示します。例えば、 .Bd -literal -offset indent set reconnect 3 5 .Ed .Pp は、予期せぬキャリア喪失の際に .Ar 3 秒待ってから再接続を試みるように .Nm に指示します。これは .Nm があきらめる前に .Ar 5 回まで行われます。 ntries のデフォルト値は 0 (再接続しない) です。 このオプションを使用する際には注意が必要です。 もしローカル側のタイムアウトがリモート側よりもわずかに長いと、 リモート側がタイムアウトにより回線を切断した場合に、 再接続機能が (指定した回数まで) 起動されてしまいます。 注: この文脈においては、多くの LQR を喪失するとキャリア喪失を引き起こし、 ひいては再接続を引き起こします。 .Fl background フラグが指定された場合、接続が行えるまで すべての電話番号が最大 1 回ダイヤルされます。 .Dq set redial コマンドにて、リダイヤル期間の後に、 再接続回数を指定します。 リダイヤル値が指定した電話番号数より少ない場合、 指定した電話番号で使用されないものが出来ます。 プログラムを終了させるには、次のように入力してください。 .Bd -literal -offset indent PPP ON awfulhak> close ppp ON awfulhak> quit all .Ed .Pp .Dq quit コマンドは .Xr pppctl 8 もしくは .Xr telnet 1 による接続を終了しますが、 プログラム自身は終了させません。 .Nm も終了させたい場合には、 .Dq quit all を実行してください。 .Sh PPP 接続の受け入れ (方法その 1) .Em PPP 接続要求を受け入れるには、次の手順にしたがってください。 .Bl -enum .It モデムと、 (必要であれば) .Pa /etc/rc.serial が正しく設定されていることを確認します。 .Bl -bullet -compact .It フロー制御にはハードウェアハンドシェイク (CTS/RTS) を使います。 .It モデムはエコーバックを行わず (ATE0) 、コマンドの結果も報告しない (ATQ1) ように設定されていなければなりません。 .El .Pp .It モデムが接続されているポートで .Xr getty 8 が起動されるように .Pa /etc/ttys を編集します。 例えば、次のように設定すれば良いでしょう: .Pp .Dl ttyd1 "/usr/libexec/getty std.38400" dialup on secure .Pp .Xr getty 8 を起動するために .Xr init 8 プロセスに .Dv HUP シグナルを送るのを 忘れないでください: .Pp .Dl # kill -HUP 1 .It .Pa /usr/local/bin/ppplogin ファイルを次のような内容で作成します: .Bd -literal -offset indent #!/bin/sh exec /usr/sbin/ppp -direct incoming .Ed .Pp ダイレクトモード .Pq Fl direct では、 .Nm は標準入力と標準出力を使って動作します。クライアント動作の .Nm と同様に、 .Xr pppctl 8 を使用することで、構成された診断ポートに接続可能です。 .Pp ここで .Pa /etc/ppp/ppp.conf 中の .Ar incoming セクションが設定されていなければなりません。 .Pp .Ar incoming セクションに適当な .Dq allow users コマンドがあることを確かめておいてください。 .It 受け入れるユーザのアカウントを用意してください。 .Bd -literal ppp:xxxx:66:66:PPP Login User:/home/ppp:/usr/local/bin/ppplogin .Ed .Pp 詳細は .Xr adduser 8 と .Xr vipw 8 のマニュアル項目を参照してください。 .Dq accept dns および .Dq set nbns コマンドを使うことで IPCP によるドメインネームサーバと NetBIOS ネームサーバの 交渉を有効にすることが可能です。 下記の記述を参照してください。 .El .Pp .Sh PPP 接続の受け入れ (方法その 2) この方法は、 .Xr login 1 ではなく .Nm ppp で接続の認証を行うという点が異なります。 .Bl -enum .It .Pa /etc/gettytab の default セクションに .Dq pp ケーパビリティを指定することで ppp を自動的に認識するように 設定してください。 .Bd -literal default:\\ :pp=/usr/local/bin/ppplogin:\\ ..... .Ed .It 上記の方法その 1 の最初の 3 手順と同じように、 シリアルデバイスを設定し、 .Xr getty 8 を有効にして、 .Pa /usr/local/bin/ppplogin を作成してください。 .It .Pa /etc/ppp/ppp.conf の .Sq incoming ラベル (もしくは .Pa ppplogin が用いるラベルならなんでも構いません) 下に .Dq enable chap か .Dq enable pap .Pq もしくはその両方 を加えてください。 .It .Pa /etc/ppp/ppp.secret に、受け入れるユーザそれぞれについて、エントリを作成してください。 .Bd -literal Pfredxxxx Pgeorgeyyyy .Ed .El .Pp これで、 .Xr getty 8 は (HDLC フレームヘッダを認識することで) ppp 接続を検出すると、すぐに .Dq /usr/local/bin/ppplogin を実行します。 .Pp 上記のように PAP もしくは CHAP を有効にすることは .Em 必須 です。そうしなければ、あらゆる人があなたのマシンにパスワード .Em なしに ppp セッションを確立することを許可し、 あらゆる種類の潜在的な攻撃に対して門戸を開いていることになります。 .Sh 内向き接続の認証 通常、接続の受信側は相手が相手自身を認証することを要求します。 これは通常 .Xr login 1 にて行われますが、代りに PAP か CHAP を使用可能です。 2 つのうちで CHAP の方がより安全ですが、 クライアントによってはサポートしていないものがあります。 どちらを使いたいか決めたら、 .Sq enable chap または .Sq enable pap を .Pa ppp.conf の適切なセクションに追加してください。 .Pp その後、 .Pa /etc/ppp/ppp.secret ファイルの設定を行う必要があります。 このファイルは、クライアントになりうるマシンごとに 1 行を含みます。 各行は 4 つまでのフィールドからなります: .Bd -literal -offset indent name key [hisaddr [label]] .Ed .Pp .Ar name と .Ar key は期待されるクライアントを指定します。 .Ar key が .Dq \&* で PAP が使用される場合、 .Nm は認証時にパスワードデータベース .Pq Xr passwd 5 を検索します。 .Pa ppp.secret の如何なる .Ar name No / Ar key の組み合わせにおいても適切でない返答をクライアントが与える場合、 認証は失敗します。 .Pp 認証に成功したならば、 .Pq 指定時には .Ar hisaddr を IP 番号交渉時に使用します。詳細は .Dq set ifaddr コマンドを参照してください。 .Pp 認証に成功し .Ar label が指定された場合、現在のシステムラベルは .Ar label にマッチするように修正されます。 このことはファイル .Pa ppp.linkup と .Pa ppp.linkdown の後続のパーズに影響があります。 .Sh PPP オーバ TCP (別名: トンネリング) シリアルリンク上以外の .Nm の使用方法として、 device にホストとポートを指定することにより、 TCP 接続を使用することが可能です: .Pp .Dl set device ui-gate:6669 .Pp シリアルデバイスをオープンする代りに、 .Nm は指定されたマシンの指定されたソケットへの TCP 接続をオープンします。 .Nm は telnet プロトコルを使用しないこと、 telnet サーバと交渉できないことに注意を払うべきです。 受信マシン (ui-gate) 上に、 この ppp 接続を受信するポートを設定する必要があります。まず .Pa /etc/services を更新して、サービスを定義します: .Pp .Dl ppp-in 6669/tcp # Incoming PPP connections over tcp .Pp そして .Pa /etc/inetd.conf を更新して、このポートへの受信接続をどのように扱うかを .Xr inetd 8 に指示します: .Pp .Dl ppp-in stream tcp nowait root /usr/sbin/ppp ppp -direct ppp-in .Pp .Pa /etc/inetd.conf を更新した後には、 .Xr inetd 8 に .Dv HUP シグナルを送るのをお忘れなく。 ここではラベル名 .Dq ppp-in を使用します。 ui-gate (受信側) の .Pa /etc/ppp/ppp.conf エントリは次の内容を含みます: .Bd -literal -offset indent ppp-in: set timeout 0 set ifaddr 10.0.4.1 10.0.4.2 add 10.0.1.0/24 10.0.4.2 .Ed .Pp セキュリティのために PAP もしくは CHAP の設定をしたいかもしれません。 PAP を有効にするには次の行を追加します: .Bd -literal -offset indent enable PAP .Ed .Pp また、次のエントリを .Pa /etc/ppp/ppp.secret に作成する必要があります: .Bd -literal -offset indent MyAuthName MyAuthPasswd .Ed .Pp .Ar MyAuthPasswd が .Pq Dq * の場合には、パスワードは .Xr passwd 5 データベースから検索されます。 .Pp awfulhak (起動側) の .Pa /etc/ppp/ppp.conf エントリは次の内容を含む必要があります: .Bd -literal -offset indent ui-gate: set escape 0xff set device ui-gate:ppp-in set dial set timeout 30 set log Phase Chat Connect hdlc LCP IPCP CCP tun set ifaddr 10.0.4.2 10.0.4.1 add 10.0.2.0/24 10.0.4.1 .Ed .Pp PAP を有効にしようとしている場合、次の設定も必要です: .Bd -literal -offset indent set authname MyAuthName set authkey MyAuthKey .Ed .Pp 我々は、 ui-gate に 10.0.4.1 のアドレスを割り当て、 awfulhak に 10.0.4.2 のアドレスを割り当てようとしています。 接続をオープンするためには、次の内容をタイプするだけで良いです。 .Pp .Dl awfulhak # ppp -background ui-gate .Pp 結果として、 awfulhak にはネットワーク 10.0.2.0/24 への新たな「経路」が、 ui-gate にはネットワーク 10.0.1.0/24 への新たな「経路」が、 TCP 接続経由でそれぞれ作成されます。 ネットワークは実質的にブリッジされます - 下位レベルの TCP 接続はパブリックなネットワーク (例えばインターネット) を またがっても良いです。 また 2 つのゲートウェイ間では ppp トラフィックは 概念的に TCP ストリーム中でカプセル化されます (パケットがパケットに対応するわけではありません)。 この機構の大きな欠点は、同時に 2 つの「配送保証」機構が存在することです - この 2 つとは、下位レベルの TCP ストリームと .Em PPP リンク上で使用されるプロトコルであり、おそらくまた TCP でしょう。 パケット喪失が起ると、両者はそれぞれの方法で喪失した パケットを再送しようと するでしょう。 .Sh パケットエイリアシング .Fl alias コマンドラインオプションにより、 パケットエイリアシングが有効になります。 これにより、 .Nm ホストがローカルエリアネットワークの他のコンピュータに対して マスカレードゲートウェイとして動作するようになります。 送信される IP パケットは、まるで .Nm ホストから来たかのようにエイリアスされ、 受信パケットは、それがローカルエリアネットワークの正しいマシンに 送られるようにエイリアスが戻されます。 パケットエイリアシングにより、 未登録でプライベートなサブネット上のコンピュータを 外部から見えないようにしつつ、 インターネットへアクセス可能とします。 一般に、 .Nm が正しく動作していることの確認は、 まず最初にパケットエイリアシングを禁止して行います。 次に .Fl alias オプションを有効にして、 .Nm ホストの上で (ウェブブラウザや .Xr telnet 1 , .Xr ftp 1 , .Xr ping 8 , .Xr traceroute 8 などの) ネットワークアプリケーションの動作を確認します。 最後に、LAN 上の別のコンピュータの上で同様なアプリケーションの 動作を確認することになります。 .Nm ホストではネットワークアプリケーションが正しく動作するのに、 LAN 上の別のコンピュータでは動かないのであれば、マスカレードソフトウェアは 正しく動いているけれども、ホストが IP パケットをフォワーディングしないか、 ひょっとするとパケットが送られて来ていないかのどちらかです。 .Pa /etc/rc.conf で IP フォワーディングが有効にされていることと、 他のコンピュータで .Nm ホストがその LAN のゲートウェイとして 指定されていることを確認してください。 .Sh パケットのフィルタリング この実装では、パケットのフィルタリングがサポートされています。 .Em in フィルタ、 .Em out フィルタ、 .Em dial フィルタ、そして .Em alive フィルタの 4 種類のフィルタがあります。 ここでは基本的なことについて書くことにします。 .Bl -bullet .It フィルタ定義は次のような構文になっています。 .Pp set filter .Ar name .Ar rule-no .Ar action .Op Ar src_addr Ns Op / Ns Ar width .Op Ar dst_addr Ns Op / Ns Ar width [ .Ar proto .Op src Op Ar cmp No Ar port .Op dst Op Ar cmp No Ar port .Op estab .Op syn .Op finrst ] .Bl -enum .It .Ar name -には、 +は、 .Sq in , .Sq out , .Sq dial , .Sq alive -のいずれかです。 +のうちのいずれか 1 つです。 .It .Ar rule-no は .Sq 0 から .Sq 19 までの数値で、ルール番号を指定します。 ルールは .Ar rule-no の番号順に指定されます。 ただしルール .Sq 0 が指定されている場合のみです。 .It .Ar action は .Sq permit , .Sq deny のいずれかです。 もし、あるパケットがルールに一致した場合、 結びつけられた action が直ちに実行されます。 .It .Op Ar src_addr Ns Op / Ns Ar width と .Op Ar dst_addr Ns Op / Ns Ar width は始点と終点の IP アドレスです。 .Op / Ns Ar width が指定された場合には、それによって適切なネットマスクのビット値を与え、 アドレスの範囲を指定することができます。 .It .Ar proto は .Sq icmp , .Sq udp , .Sq tcp のうちのいずれか 1 つです。 .It .Ar cmp は .Sq \< , .Sq \&eq , .Sq \> のうちいずれか 1 つです。それぞれ、より小さい、等しい、 より大きいを意味します。 .Ar port はポート番号で指定するか、 .Pa /etc/services のサービス名で指定することができます。 .It .Sq estab , .Sq syn , .Sq finrst フラグは .Ar proto が .Sq tcp に設定されているときにのみ許可され、それぞれ TH_ACK、TH_SYN、および TH_FIN もしくは TH_RST という TCP フラグを表わします。 .El .Pp .It 各フィルタはルール 0 から始まり、20 個までのルールをもつことができます。 規則のルールは、ルール 0 が定義されていなければ、有効にはなりません。 すなわち、デフォルトではすべてが通されます。 .It パケットにマッチするルールが無い場合は、パケットは破棄 (ブロック) されます。 .It すべての規則を消去するには、 .Dq set filter Ar name No -1 を使ってください。 .El .Pp .Pa /etc/ppp/ppp.conf.example を参照してください。 .Sh アイドルタイマの設定 アイドルタイマを調べたり/設定するためには、それぞれ .Dq show bundle と .Dq set timeout コマンドを使ってください: .Bd -literal -offset indent ppp ON awfulhak> set timeout 600 .Ed .Pp タイムアウト時間は秒数で指定します。デフォルト値は timeout が 180 秒 .Pp 3 分 です。 アイドルタイマ機能を使わないようにするためには、 次のコマンドを利用してください。 .Bd -literal -offset indent ppp ON awfulhak> set timeout 0 .Ed .Pp .Fl ddial と .Fl direct モードではアイドルタイムアウトは無視されます。 .Fl auto モードでは、アイドルタイムアウトが発生すると .Nm プログラムは実行したままで .Em PPP セッションを終了します。別の引金となるパケットがきた時に リンクを再び確立しようとします。 .Sh Predictor-1 および DEFLATE 圧縮 .Nm は Predictor type 1 圧縮および deflate 圧縮をサポートしています。 デフォルトでは、 .Nm は、接続相手が同意 .Pq あるいは要求 した場合に、 この機能を使おうと (もしくは受け入れようと) します。 .Nm は deflate プロトコルを優先します。 これらの機能を使用したくない時には .Dq disable と .Dq deny のコマンドを参照してください。 .Pp .Dq disable deflate か .Dq deny deflate の一方を使用することにより、 方向ごとに異ったアルゴリズムを使用することができます。 .Pq 接続相手が両方のプロトコルをサポートしていると仮定しています。 .Pp デフォルトでは、DEFLATE について交渉するときには .Nm はウィンドウサイズとして 15 を使います。この動作を変更したい場合には .Dq set deflate コマンドを参照してください。 .Pp デフォルトでは無効にされ受け付けませんが、DEFLATE24 と呼ばれる特殊な アルゴリズムを使用することもできます。これは CCP ID 24 を 交渉に使う点を除いては DEFLATE と完全に同じものです。 これを使用することで .Nm は .Nm pppd バージョン 2.3.* と DEFLATE 交渉を成功させることができます。 .Sh IP アドレスの制御 .Nm は IP アドレスの交渉のために IPCP を使います。接続の両側は、自分が 使おうとするアドレスを提示し、要求された IP アドレスが受け入れ可能な ものであれば、相手に ACK (肯定応答) を返します。 受け入れることができなければ、別の IP アドレスの使用を促すために .Nm は相手に NAK (否定応答) を返します。 接続の両側が受け取った要求に同意し (ACK を送っ) た時、 IPCP はオープン状態にセットされ、ネットワーク層での接続が確立されます。 IPCP の動作を制御するために、この実装はローカルとリモートの IP アドレスを定義するための .Dq set ifaddr コマンドを持っています。 .Bd -literal -offset indent set ifaddr [src_addr [dst_addr [netmask [trigger_addr]]]] .Ed .Pp ここで、 .Sq src_addr はローカル側で使おうと思っている IP アドレスで、 .Sq dst_addr はリモート側が使用すべき IP アドレスです。 .Sq netmask は使用すべきネットマスクです。 .Sq src_addr のデフォルトは現在の .Xr hostname 1 のもの、 .Sq dst_addr のデフォルトは 0.0.0.0 であり、 .Sq netmask のデフォルトは .Sq src_addr に適したマスク値です。 .Sq netmask はデフォルトより小さくすることのみ可能です。 ほとんどのカーネルが POINTOPOINT インタフェースのネットマスクを 無視するので、便利な値は 255.255.255.255 でしょう。 .Pp 誤った .Em PPP の実装には、接続交渉のために、 .Sq src_addr ではなく特別な IP アドレスを使用しなければならないものがあります。 この場合、 .Sq trigger_addr で指定した IP アドレスが使用されます。 相手がこの提案された番号に同意しない限り、経路表には影響しません。 .Bd -literal -offset indent set ifaddr 192.244.177.38 192.244.177.2 255.255.255.255 0.0.0.0 .Ed .Pp 上の例の意味は次の通りです: .Pp .Bl -bullet -compact .It 自分の IP アドレスとしてまず 0.0.0.0 を提案しますが、アドレス 192.244.177.38 のみは受け付けます。 .It 相手側のアドレスとして 192.244.177.2 を使うように要求し, 192.244.177.2 以外のどんなアドレスを使うことも許可しません。 相手側が別の IP アドレスを要求してきた時は、いつでも 192.244.177.2 を提案します。 .It 経路表のネットマスク値は 0xffffffff に設定されます。 .El .Pp これは、両側が既に決まった IP アドレスを持っている場合には うまくいきますが、多くの場合、一方がすべての IP アドレスを制御する サーバとして動作しており、もう一方はその方針に従わなくてはなりません。 より柔軟な動作をさせるために、`ifaddr' 変数の IP アドレス指定を もっと緩やかにすることが可能です: .Pp .Dl set ifaddr 192.244.177.38/24 192.244.177.2/20 .Pp スラッシュ (/) に続く数字は、この IP アドレスで意味のあるビットの数を 表現しています。上の例は次のことを示しています。 .Pp .Bl -bullet -compact .It 可能なら自分のアドレスとして 192.244.177.38 を使おうとしますが、 192.244.177.0 から 192.244.177.255 の間の任意の IP アドレスも受け入れます。 .It 相手のアドレスとして 192.244.177.2 を使うことを希望しますが、 192.244.176.0 から 192.244.191.255 の間の任意の IP アドレスも許可します。 .It すでにお気づきと思いますが、 192.244.177.2 は 192.244.177.2/32 と書くことと 等価です。 .It 例外として、0 は 0.0.0.0/0 と等価であり、希望する IP アドレスは 特に無く、リモート接続先の選択に従うことを意味します。 0 を使用した場合は、接続が確立するまで、経路表のエントリは まったく設定されません。 .It 192.244.177.2/0 は、どんな IP アドレスでも受け入れる/許可することを 意味しますが、最初に 192.244.177.2 を使うように提案します。 .El .Pp .Sh インターネットサービスプロバイダと接続する プロバイダに接続する際には、次のステップを踏む必要があるでしょう: .Bl -enum .It .Dq set phone コマンドを使って、ダイヤルスクリプトにプロバイダの電話番号を記述します。 ダイヤルやリダイヤルに使用する電話番号は、 パイプ (|) またはコロン (:) で区切って 複数指定することができます。例えば、次のようになります。 .Bd -literal -offset indent set phone "111[|222]...[:333[|444]...]..." .Ed .Pp 最初のパイプで区切られたリストの番号は、 直前の番号でダイヤルもしくはログインスクリプトが失敗した場合のみ使用されます。 コロンで区切られた番号は、直前の番号の使用によりなにが起ったのかにかかわらず、 この順番で使用されます。例えば: .Bd -literal -offset indent set phone "1234567|2345678:3456789|4567890" .Ed .Pp この場合、まず 1234567 にダイヤルしてみます。 ダイヤルもしくはログインスクリプトに失敗したら、 次は 2345678 を使用します。 しかしこれはダイヤルもしくはログインスクリプトに失敗したとき *のみ* です。 このダイヤルの後、3456789 が使用されます。 4567890 は 345689 でダイヤルもしくはログインスクリプトに失敗したときのみ 使用されます。 2345678 のログインスクリプトが失敗したとしても、次の番号は 3456789 です。 必要な数だけ、パイプとコロンを使用可能です (しかし、通常はパイプのみかコロンのみであり両方の使用はないでしょう)。 次の番号へのリダイヤルまでのタイムアウトは、すべての番号にて使用されます。 リストが終了すると、 通常のリダイヤル期間だけ待ち、 最初から再開します。 .Dq set dial コマンドの \\\\T 文字列は選択された番号で置きかえられます。 (以降を参照してください)。 .It リダイヤルに関する設定は、 .Dq set redial で行います。 例えば回線の調子が悪かったり、 (最近では それほど多くないでしょうが) プロバイダがいつも話中だったりすると、 次のように設定したくなるかもしれません: .Bd -literal -offset indent set redial 10 4 .Ed .Pp これは最初の番号にリダイヤルを行う前に 10 秒待って、 4 回までダイヤルしてみるという意味になります。 .It .Dq set dial と .Dq set login コマンドを使ってログイン手続きを記述します。 .Dq set dial コマンドはモデムと通信してプロバイダへのリンクを確立するのに使われます。 例えば、次のようになります: .Bd -literal -offset indent set dial "ABORT BUSY ABORT NO\\\\sCARRIER TIMEOUT 4 \\"\\" \e ATZ OK-ATZ-OK ATDT\\\\T TIMEOUT 60 CONNECT" .Ed .Pp このモデム「チャット」文字列の意味は次の通りです。 .Bl -bullet .It \&"BUSY" または "NO CARRIER" を受信した場合には処理を中止します。 .It タイムアウトを 4 秒にセットします。 .It 文字列の受信待ちは行いません。 .It ATZ を送信します。 .It OK の受信待ちを行います。もし 4 秒以内に受信できなければ、 もう 1 度 ATZ を送信し、OK の受信待ちを行います。 .It ATDTxxxxxxx を送信します。xxxxxxx は 上記の電話番号リストの中の、次にダイヤルする番号です。 .It タイムアウトを 60 にセットします。 .It 文字列 CONNECT の受信待ちを行います。 .El .Pp 一旦接続が確立されると、ログインスクリプトが実行されます。 このスクリプトはダイヤルスクリプトと同じスタイルで書かれますが、 パスワードがログされないように注意してください: .Bd -literal -offset indent set authkey MySecret set login "TIMEOUT 15 login:-\\\\r-login: awfulhak \e word: \\\\P ocol: PPP HELLO" .Ed .Pp このログイン「チャット」文字列の意味は次の通りです。 .Bl -bullet .It タイムアウトを 15 秒にセットします。 .It "login:" の受信待ちを行います。もし受信できなければ 復改文字を送信して、再び "login:" の受信待ちを行います。 .It "awfulhak" を送信します。 .It "word:" ("Password:" プロンプトの末尾) の受信待ちを行います。 .It .Ar authkey に現在設定されている値を送信します。 .It "ocol:" ("Protocol:" プロンプトの末尾) の受信待ちを行います。 .It "PPP" を送信します。 .It "HELLO" の受信待ちを行います。 .El .Pp .Dq set authkey ( .Ar command ログ使用時には) コマンドのログは特別な方法でとられ、( .Sq ******** とログされますので) 実際のパスワードが危険にさらされることはありません。 .Ar chat ログ使用時には、実際のパスワードの代りに '\\P' とログされます。 .Pp ログインスクリプトはプロバイダによって大きく違うものになるでしょう。 始めてそれを設定するときには .Em チャットログを有効化 することで、あなたのスクリプトが予定通りに動いているかを 調べることができます。 .It シリアル回線と通信速度を指定するためには .Dq set line と .Dq set speed を使います。例えば次のようになります。 .Bd -literal -offset indent set line /dev/cuaa0 set speed 115200 .Ed .Pp FreeBSD では cuaa0 が 1 つめのシリアルポートになります。 OpenBSD で .Nm を実行している場合には cua00 が 1 つめです。 あなたのモデムが 28800 かそれ以上のビットレートで通信することが できるなら、シリアルポートの速度には 115200 を指定しておくべきでしょう。 一般に、シリアルポートの速度はモデムの速度の約 4 倍にしておきます。 .It .Dq set ifaddr コマンドで IP アドレスを定義します。 .Bl -bullet .It プロバイダがどの IP アドレスを使っているのか知っている場合には、 それをリモートアドレス (dst_addr) として使ってください。 知らない場合には、10.0.0.2/0 か何かを使ってください (以降を参照してください)。 .It 特定の IP アドレスをプロバイダから割り当てられている場合は、 それをローカルアドレス (src_addr) として使ってください。 .It プロバイダが IP アドレスを動的に割り当てる場合は、適当に控えめで 緩やかに記述した IP アドレスをローカルアドレスに選んでください。 10.0.0.1/0 が適切でしょう。 / に続く数値は、このアドレスのうち何ビットを重視しているかを示します。 もしもクラス C のネットワーク 1.2.3.0 上のアドレスを使うことを 主張したいのなら、1.2.3.1/24 と指定することができます。 .It プロバイダがあなたが提示した最初の IP 番号を受け付ける場合、 第 3, 4 の引数に .Dq 0.0.0.0 を指定してください。 これによりプロバイダが番号を割り当てます。 (3 つめの引数は、 .Sq src_addr に対してデフォルトのマスクよりも制約が緩いため、無視されます。) .El .Pp 自分の IP アドレスもプロバイダの IP アドレスも 知らない場合には、次の例のようにするとよいでしょう。 .Bd -literal -offset indent set ifaddr 10.0.0.1/0 10.0.0.2/0 0.0.0.0 0.0.0.0 .Ed .Pp .It ほとんどの場合、プロバイダはデフォルトルータでもあるでしょう。 この場合、次の行を .Pa /etc/ppp/ppp.conf に追加します。 .Bd -literal -offset indent add default HISADDR .Ed .Pp これは、 .Nm 接続先のアドレスが何であっても .Pq この例では 10.0.0.2 デフォルト経路として追加するように指示します。 この経路は .Sq スティッキー です。これは .Dv HISADDR の値が変わると、経路もそれに従って自動的に更新されるという意味です。 .Pp 以前のバージョンの .Nm では .Pa /etc/ppp/ppp.linkup ファイルにこれと似たエントリが必要でした。 .Sq スティッキー経路 の出現により、これはもはや必要ではなくなりました。 .It プロバイダが PAP/CHAP による認証を要求している場合は、 .Pa /etc/ppp/ppp.conf ファイルに次の行を追加してください: .Bd -literal -offset indent set authname MyName set authkey MyPassword .Ed .Pp デフォルトではどちらも受け付けられますので、ISP が何を要求しても大丈夫です。 .Pp PAP もしくは CHAP を使用する場合、ログインスクリプトはほとんどの場合、 必要とされないことを記述しておくべきでしょう。 .It 次のような行を加え、ISP にネームサーバアドレスを確認してください。 .Bd -literal -offset indent enable dns .Pp .Ed ローカル DNS を走らせている場合には、これを .Em やらない でください。 .Nm は単純に .Pa /etc/resolv.conf に nameserver 行を入れることで、ローカル DNS の使用を 出し抜いてしまうからです。 .El .Pp 現実の例を見たい場合には、 .Pa /etc/ppp/ppp.conf.sample と .Pa /etc/ppp/ppp.linkup.sample を参照してください。 ラベル pmdemand は、ほとんどのプロバイダで使用できるでしょう。 .Sh ログ機能 .Nm は次のログ情報を、 .Xr syslog 3 経由で、もしくはスクリーンに出力することができます: .Bl -column SMMMMMM -offset indent .It Li Async 非同期レベルパケットの 16 進ダンプ .It Li CBCP CBCP (CallBack Control Protocol) ログの生成 .It Li CCP CCP パケットトレースの生成 .It Li Chat チャットスクリプトのトレースログの生成 .It Li Command コマンド実行のログ .It Li Connect 完全なチャットログの生成 .It Li Debug デバッグ情報のログ .It Li HDLC HDLC パケットの 16 進ダンプ .It Li ID0 ユーザ ID 0 で実行された全関数呼び出しを詳細に記録 .It Li IPCP IPCP パケットトレースの生成 .It Li LCP LCP パケットトレースの生成 .It Li LQM LQR レポートの生成 .It Li Phase フェーズ遷移ログの出力 .It Li TCP/IP 全 TCP/IP パケットのダンプ .It Li Timer タイマ操作のログ .It Li TUN ログの各行に tun デバイスを含めます .It Li Warning 端末デバイスへの出力。端末が存在しない場合は、LOG_WARNING を使用してログファイルに送ります。 .It Li Error 端末デバイスとログファイルへの出力で、LOG_ERROR を使用します。 .It Li Alert ログファイルへの出力で、LOG_ALERT を使用します。 .El .Pp .Dq set log コマンドで、ログの出力レベルを設定することができます。 また、複数のレベルを単一コマンドラインにて指定することも可能です。 デフォルトは、 .Dq set log Phase です。 .Pp スクリーンに直接ログを表示することも可能です。 文法は同じで、語 .Dq local が .Dq set log の直後に付くことだけが違います。 デフォルトは .Dq set log local (つまり、マスクされない警告、エラーと注意のみ出力) です。 .Pp .Dq set log Op local への最初の引数が '+' か '-' の文字で始まる場合、 現在のログレベルを消去せずに修正します。例えば: .Bd -literal -offset indent PPP ON awfulhak> set log phase PPP ON awfulhak> show log Log: Phase Warning Error Alert Local: Warning Error Alert PPP ON awfulhak> set log +tcp/ip -warning PPP ON awfulhak> set log local +command PPP ON awfulhak> show log Log: Phase TCP/IP Warning Error Alert Local: Command Warning Error Alert .Ed .Pp レベル Warning, Error, Alert のメッセージログは .Dq set log Op local では制御できません。 .Pp .Ar Warning レベルは特別で、ローカルに表示可能な場合にはログされません。 .Sh シグナルハンドリング .Nm は次のシグナルを扱います: .Bl -tag -width XX .It INT このシグナルを受信すると、現在の接続がもしあればそれを終了します。 .Fl auto もしくは .Fl ddial のモードではない場合、 .Nm は終了します。 .It HUP, TERM, QUIT .Nm を終了させます。 .It USR2 .Nm に全サーバソケットを閉じさせ、すべての既存の診断ポートへの接続を 取り下げます。 .El .Pp .Sh マルチリンク PPP .Em PPP 相手に接続するのに複数の物理的なリンクを利用したいなら、 接続相手も .Em マルチリンク PPP プロトコルを理解する必要があります。 仕様の詳細は RFC 1990 を参照してください。 .Pp 接続先は、 .Dq 終点の選択 とその .Dq 認証 ID の組み合わせによって識別されます。 これらの一方、もしくは両方を指定することができます。 最低でも片方は指定しておくことが推奨されます。 そうでないと、すべてのリンクが実際に同一のプログラムに接続されていることを 確認する方法がなくなり、 混乱してロックアップを引き起こすことがあります。 ローカルには、これらの識別変数は .Dq set enddisc と .Dq set authname コマンドを用いることで指定されます。先立って接続相手と .Sq authname .Pq と Sq authkey について合意しておく必要があります。 .Pp マルチリンクの能力は .Dq set mrru コマンド (set maximum reconstructed receive unit) を用いることで 有効になります。一度マルチリンクが有効になれば、 .Nm は接続相手とマルチリンク接続の交渉を行います。 .Pp デフォルトでは .Po .Sq deflink と呼ばれる .Pc ただ 1 つの .Sq リンク のみが有効です。さらにリンクを作成するには .Dq clone コマンドが使われます。このコマンドは既存のリンクを複製します。 それは次の点を除いてすべての性質が同じものです: .Bl -enum .It 新しいリンクは .Dq clone コマンドラインで指定された独自の名前を持ちます。 .It 新しいリンクは .Sq interactive リンクです。そのモードは次の .Dq set mode コマンドで変更することができます。 .It 新しいリンクは .Sq closed の状態にあります。 .El .Pp すべての有効なリンクのまとめは、 .Dq show links コマンドを用いて見ることができます。 .Pp 一度リンクが作成されると、コマンドの使用方法が変わります。 すべてのリンク固有のコマンドの前には、 .Dq link Ar name プレフィックスをつけて、 コマンドを適用するリンクを指定する必要があります。 .Nm は十分賢いので、 利用可能なリンクが 1 つだけの場合には、 .Dq link Ar name プレフィックスは不要です。 .Pp コマンドの中には依然としてリンクの指定なしに使用できるものがあり、それは .Sq バンドル レベルの操作を行います。たとえば、2 つ以上のリンクが存在するとき .Dq show ccp はマルチリンクレベルの CPP 設定と統計を表示し .Dq link deflink show ccp は .Dq deflink のリンクレベルの同じ情報を表示します。 .Pp これらの情報を用いて、次の設定を用いることができます: .Pp .Bd -literal -offset indent mp: set timeout 0 set log phase chat set device /dev/cuaa0 /dev/cuaa1 /dev/cuaa2 set phone "123456789" set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \\"\\" ATZ \e OK-AT-OK \\\\dATDT\\\\T TIMEOUT 45 CONNECT" set login set ifaddr 10.0.0.1/0 10.0.0.2/0 set authname ppp set authkey ppppassword set mrru 1500 clone 1,2,3 link deflink remove .Ed .Pp すべての複製が設定の最後で行われていることに注意してください。 一般にはリンクは最初に設定され、そして複製されます。 あなたが常にすべてのリンクがアップ状態であることを望む場合には、 設定の最後に次の行を追加することができます。 .Pp .Bd -literal -offset indent link 1,2,3 set mode ddial .Ed .Pp リンクが必要に応じてダイヤルされることを望む場合には、次のコマンドを 使うことができます。 .Pp .Bd -literal -offset indent link * set mode auto .Ed .Pp 上記の .Dq set device 行を取り除き、 .Dq clone コマンドに続けて次の内容を指定することで、 リンクを特定の名前に結びつけることもできます: .Pp .Bd -literal -offset indent link 1 set device /dev/cuaa0 link 2 set device /dev/cuaa1 link 3 set device /dev/cuaa2 .Ed .Pp どのコマンドが ( .Dq link コマンドを使用した) コンテキスト (文脈) を要求し、 どのコマンドがコンテキストをオプションとし、 そしてどのコマンドがコンテキストを一切とらないかを調べるには、 .Dq help コマンドを使用します。 .Pp .Nm が接続相手と .Em マルチリンク モードで交渉をすると、 .Nm はローカルドメインソケットを .Pa /var/run ディレクトリに作成します。このソケットは、 リンク情報 (実際のリンクファイル記述子も含む) を、異なる .Nm の間で受け渡しするために使われます。 この機能によって、 .Nm はシリアル回線の初期制御を行う必要なしに .Xr getty 8 から、もしくは直接 .Pa /etc/gettydefs から ( .Sq pp= ケーパビリティを用いて) 実行することが可能となっています。 ひとたび .Nm がマルチリンクモードの交渉を行うと、 .Nm は自分がオープンした リンクをすでに実行されている任意の他のプロセスに渡すことができます。 すでに実行されているプロセスがない場合、 .Nm はマスタとして振る舞い、ソケットを作成し、新たな接続を待ちます。 .Sh PPP コマンドリスト この節では利用可能コマンドとその効果をリストします。 .Nm ppp セッションで対話的に使用することも、 設定ファイルで指定することも、 .Xr pppctl 8 もしくは .Xr telnet 1 セッションで指定することも可能です。 .Bl -tag -width XX .It accept|deny|enable|disable Ar option.... これらのディレクティブは 最初の接続においてどのように相手と交渉するかを .Nm に指示します。各 .Dq option は、accept/deny および enable/disable のデフォルトを持ちます。 .Dq accept は相手がこのオプションを要求したら、ACK を送ることを意味します。 .Dq deny は相手がこのオプションを要求したら、NAK を送ることを意味します。 .Dq enable はこのオプションを当方が要求することを意味します。 .Dq disable はこのオプションを当方が要求しないことを意味します。 .Pp .Dq option は次のいずれかです: .Bl -tag -width XX .It acfcomp デフォルト: enable かつ accept。 ACFComp はアドレスおよびコントロールフィールド圧縮 (Address and Control Field Compression) を意味します。 LCP パケット以外は非常に良く似たフィールドを持ちますので、 簡単に圧縮可能です。 .It chap デフォルト: disable かつ accept。 CHAP はチャレンジ交換認証プロトコル (Challenge Handshake Authentication Protocol) を意味します。 CHAP もしくは PAP (後述) のどちらか一方のみ交渉可能です。 CHAP では、認証者は「チャレンジ」メッセージを相手に送ります。 相手は一方向ハッシュ関数を使用して「チャレンジ」を暗号化し、 結果を送り返します。 認証者は同じことを行い結果を比較します。 この機構の利点は、接続を介してパスワードを送らないことです。 接続が最初に確立する時にチャレンジが行われます。 更なるチャレンジが行われるかもしれません。 相手の認証を行いたい場合は、 .Dq enable chap を .Pa /etc/ppp/ppp.conf に書き、相手のエントリを .Pa /etc/ppp/ppp.secret に書く必要があります。 .Pp クライアントとして CHAP を使用する場合、 .Dq AuthName と .Dq AuthKey を .Pa /etc/ppp/ppp.conf に指定するだけで良いです。 CHAP はデフォルトで accept されます。 .Em PPP の実装によっては、チャレンジの暗号化に MD5 ではなく "MS-CHAP" を使用するものがあります。 MS-CHAP は MD4 と DES の組み合わせです。もし .Nm が DES ライブラリの存在するマシン上で構築された場合 MS-CHAP 認証要求に応答しますが、MS-CHAP 認証を要求することは 決してありません。 .It deflate デフォルト: enable かつ accept。 このオプションは圧縮制御プロトコル (Compression Control Protocol; CCP) に deflate 圧縮を使用するか否かを決定します。 使用されるアルゴリズムは .Xr gzip 1 プログラムが使用するものと同じです。 注: .Xr pppd 8 - 多くのオペレーティングシステムで使用可能な .Em PPP の実装 - との .Ar deflate 能力についての交渉には問題があります。 .Nm pppd (バージョン 2.3.1) が .Ar deflate 圧縮の交渉を行おうとする CCP コンフィギュレーションタイプは、 .Pa rfc1979 に規定されたタイプ .Em 26 ではなくタイプ .Em 24 であり、誤っています。 タイプ .Ar 24 は実際には .Pa rfc1975 では .Dq PPP Magna-link Variable Resource Compression と指定されています! .Nm は .Nm pppd と交渉する能力がありますが、 .Dq deflate24 が .Ar enable かつ .Ar accept されている場合のみです。 .It deflate24 デフォルト: disable かつ deny。 これは .Ar deflate のバリエーションで、 .Xr pppd 8 プログラムとの交渉を許可します。 詳細は上記の .Ar deflate セクションを参照してください。 これは .Pa rfc1975 に反するため、デフォルトでは disable となっています。 .It dns デフォルト: disable かつ deny。 このオプションは DNS 交渉を許可します。 .Pp .Dq enable にすることにより、 .Nm は接続相手が .Pa /etc/resolv.conf ファイルのエントリを確認することを要求します。 もし接続相手が当方の要求に否定応答をした場合 (新しい IP アドレスを 提案したら)、 .Pa /etc/resolv.conf ファイルは更新され、新しいエントリを確認するように要求を送ります。 .Pp .Dq accept にすることにより、 .Nm は接続相手からの DNS 検索要求を拒否せずに、返答します。 .Dq set dns コマンドの使用によって上書きされていない場合には、応答は .Pa /etc/resolv.conf から採られます。 .It lqr デフォルト: disable かつ accept。 このオプションはリンク品質要求 (Link Quality Request) を送信する、 もしくは受け入れるかどうかを決定します。 LQR は、モデムのキャリア検出を使用せずに、リンクダウンを .Nm に決定させるプロトコルです。 LQR が enable になっていると、 .Nm は LCP 要求の一部として .Em QUALPROTO オプション (後述の .Dq set lqrperiod を参照) を送ります。 接続相手が同意した場合、両端は同意した間隔で LQR パケットを交換し、 LQM ロギングを有効にすることで、詳細なリンク品質を監視することが 可能になります。 接続相手が同意しなかった場合、ppp は代りに ECHO LQR 要求を 送ります。これらのパケットは興味ある情報を何も渡しませんが、 .Em 必ず 接続相手に応答しなければなりません。 .Pp LQR, ECHO LQR のいずれを用いるにせよ、 .Nm は 5 つのパケットを送ったが確認応答が無い場合、6 つ目のパケットを送らずに 回線を切断します。 メッセージを .Em PHASE レベルで記録し、回線切断の原因が接続相手にあるものとして、適当な .Dq reconnect 値を使用します。 .It pap デフォルト: disable かつ accept。 PAP はパスワード認証プロトコル (Password Authentication Protocol) を 意味します。 CHAP (前述) もしくは PAP のどちらか一方のみ交渉可能です。 PAP では、ID とパスワードが相手に送られ続け、 認証されるか接続が終了されるまでこれが続きます。 これは比較的良くないセキュリティ機構です。 接続が最初に確立した時のみ実行可能です。 相手の認証を行いたい場合は、 .Dq enable pap を .Pa /etc/ppp/ppp.conf に書き、相手のエントリを .Pa /etc/ppp.secret に書く必要があります (ただし、後述の .Dq passwdauth オプションを参照)。 .Pp クライアントとして PAP を使用する場合、 .Dq AuthName と .Dq AuthKey を .Pa /etc/ppp/ppp.conf に指定するだけで良いです。 PAP はデフォルトで accept されます。 .It pred1 デフォルト: enable かつ accept。 このオプションは圧縮制御プロトコル (Compression Control Protocol; CCP) に Predictor 1 圧縮を使用するかどうかを決定します。 .It protocomp デフォルト: enable かつ accept。 このオプションは PFC (プロトコルフィールド圧縮) の交渉を行うために使用されます。 この機構により、 プロトコルフィールド数が 2 オクテットから 1 オクテットに減ります。 .It shortseq デフォルト: enable かつ accept。 このオプションは .Nm がマルチリンクモードの交渉時に .Pq 12 ビットの 短いシーケンス番号を要求し、そして受け入れるかどうかを決定します。 これは、当方の MMRU が設定されたときのみ (マルチリンクが有効になっているときのみ) 適用されます。 .It vjcomp デフォルト: enable かつ accept。 このオプションは Van Jacobson ヘッダ圧縮を使用するかどうかを決定します。 .El .Pp 次に示すオプションは、実際には相手と交渉しません。 それゆえ accept および deny は意味を持ちません。 .Bl -tag -width 20 .It idcheck デフォルト: enable。 低レベルな LCP, CCP, IPCP 設定トラフィックを交換するときに、 すべての応答の識別子フィールドはその要求の識別子フィールドと 同一であることが予定されています。デフォルトでは .Nm は予定された識別子フィールドを持たないすべての応答パケットを 捨て、それぞれのログレベルで報告します。もし .Ar idcheck が disable になっている場合、 .Nm は識別子フィールドを無視します。 .It loopback デフォルト: enable。 .Ar loopback が enable の場合、 .Nm は自動的に .Em PPP インタフェースと同じ終点アドレス宛に送出されたパケットを ループバックします。 disable の場合、 .Nm がパケットを送ると、おそらく他の終点からの ICMP リダイレクトとなります。 インタフェースがデフォルト経路であるため、 ループバック経路を必要とすることを避けたい場合、 このオプションを enable にすると便利です。 .It passwdauth デフォルト: disable。 このオプションを enable にすることにより、 PAP 認証コードが呼び出し側を認証する時に、 .Pa /etc/ppp/ppp.secret ファイル中でみつからない場合、パスワードデータベース ( .Xr passwd 5 参照) を使用します。 .Pa /etc/ppp/ppp.secret は常に、最初に調べられます。 .Xr passwd 5 からパスワードを調べ、かつそのクライアントに対して IP アドレスもしくは ラベルを指定したい場合には、 .Pa /etc/ppp/ppp.secret ファイル中のクライアントのパスワードとして .Dq \&* を用いてください。 .It proxy デフォルト: disable。 このオプションを enable にすることにより、 .Nm に相手のために代理 ARP をさせます。 .It sroutes デフォルト: enable。 .Dq add コマンドが .Dv HISADDR もしくは .Dv MYADDR という値とともに用いられると、エントリは .Sq スティック経路 リストに格納されます。 .Dv HISADDR もしくは .Dv MYADDR が変更される度に、このリストが経路表に適用されます。 .Pp このオプションを disable にすると、 スティッキー経路が適用されなくなります。 .Sq スティック経路 リストは依然として保守されます。 .It throughput デフォルト: enable。 このオプションを有効にすると、 .Nm はスループット統計を収集します。 ずれ動く 5 秒間のウィンドウにおいて入出力が検査され、 現在、最良時、総計の数値が保持されます。 このデータは関連する .Em PPP 層が終了するときに出力され、また .Dq show コマンドで表示することで得られます。スループット統計は .Dq IPCP と .Dq modem のレベルで利用可能です。 .It utmp デフォルト: enable。 通常ユーザが PAP もしくは CHAP で認証された時で、 .Nm が .Fl direct モードで実行されている時は、このユーザのエントリが utmp ファイルおよび wtmp ファイルに作成されます。 このオプションを disable にすると、 .Nm は utmp および wtmp のエントリを作成しません。 通常、 ユーザがログインしかつ認証することを要求する場合のみ必要です。 .El .It add[!] Ar dest[/nn] [mask] gateway .Ar dest は宛先 IP アドレスです。 ネットマスクは .Ar /nn によってビット数で指定するか、もしくは .Ar mask を用いて IP 番号で指定します。 .Ar 0 0 ならびにマスクなしの .Ar 0 はデフォルト経路を意味します。 .Ar 0 の代りにシンボル名 .Ar default を使うことが可能です。 .Ar gateway は、 .Ar dest マシン/ネットワークに至る、次のホップのゲートウェイです。 詳細は .Xr route 8 コマンドを参照してください。 .Pp 宛先にシンボル名 .Sq MYADDR と .Sq HISADDR を使用可能であり、 .Ar gateway には .Sq HISADDR もしくは .Sq INTERFACE を使用可能です。 .Sq MYADDR はインタフェースアドレスに置き換えられ、 .Sq HISADDR はインタフェースの宛先アドレスに置き換えられ、 .Sq INTERFACE は現在のインタフェース名に置き換えられます。 インタフェースの宛先アドレスが ( .Dq set ifaddr によって) 割り当てられていない場合、現在の .Sq INTERFACE が .Sq HISADDR の代りに使用されます。 .Pp .Ar add! コマンド .Po .Dq \&! に注意 .Pc 使用時には、経路が存在する場合には .Sq route change コマンド (詳細は .Xr route 8 参照) にて経路を更新します。 .Pp .Dq HISADDR もしくは .Dq MYADDR を含む経路は .Sq スティッキー と見なされます。これらはリスト (リストを見るには .Dq show ipcp コマンドを使用します) に格納され、 .Dv HISADDR もしくは .Dv MYADDR の値が変更される度に、経路表の関連するエントリが更新されます。 この機能は .Dq disable sroutes を使用することで無効にできます。 .It allow Ar command Op Ar args このコマンドは .Nm と設定ファイルへのアクセスを制御します。 ユーザレベルでのアクセスは可能であり、 設定ファイルのラベルと .Nm の実行モードに依存します。 例えば、ユーザ .Sq fred のみがラベル .Sq fredlabel に .Fl background モードでアクセスできるように、 .Nm を構成したいかもしれません。 .Pp ユーザ ID 0 はこれらのコマンドの対象外です。 .Bl -tag -width XX .It allow user[s] Ar logname... デフォルトでは、ユーザ ID 0 のみが .Nm へのアクセスを許されています。 このコマンドが指定されると、 .Dq allow users が記載されているセクションに列挙されているユーザのアクセスが可能となります。 .Sq default セクションは 常に最初にチェックされます (スタートアップ時に常にロードされる唯一の セクションです)。後続する .Dq allow users コマンドは、先行するコマンドに優先します。 あるラベル以外のすべてにアクセスを許すことが可能であり、 そのためにはデフォルトユーザを .Sq default セクションで指定し、新しいユーザリストをこのあるラベルに指定します。 .Pp ユーザ .Sq * が指定されると、全ユーザにアクセスが許されます。 .It allow mode[s] Ar modelist... デフォルトでは全 .Nm モードが使用可能です。 このコマンドが使用されると、 このコマンドが指定されたラベルのロードに許されるアクセスモードが制限されます。 .Dq allow users コマンドと同様、 各 .Dq allow modes コマンドは先行するコマンドに優先し、 .Sq default セクションは常に最初にチェックされます。 .Pp 使用可能なモードは次の通りです: .Sq interactive , .Sq auto , .Sq direct , .Sq dedicated , .Sq ddial , .Sq background , .Sq * 。 .Pp マルチリンクモードで動作するときには、 現在存在する回線モードを許可するセクションをロード可能です。 .El .Pp .It alias Ar command Op Ar args このコマンドは .Nm 組込みのエイリアシング (マスカレーディング) 機能を 制御するために使用します。 あなたのシステムでエイリアシングが有効になると (コンパイル時に削除できます)、 次のコマンドが使用可能となります: .Bl -tag -width XX .It alias enable [yes|no] エイリアシングを有効もしくは無効にします。 .Fl alias コマンドラインフラグは .Dq alias enable yes と同じ意味です。 .It alias port Op Ar proto targetIP:targetPORT [aliasIP:]aliasPORT このコマンドにより、 マシン .Ar aliasIP の .Ar aliasPORT へ到着する接続を、 .Ar targetIP の .Ar targetPORT へリダイレクトします。 .Ar proto は .Sq tcp もしくは .Sq udp のいずれかで、指定したプロトコルの接続のみマッチします。 あなたのゲートウェイの後のマシンでインターネット電話等を実行したい場合に、 このオプションは有用です。 .It alias addr Op Ar addr_local addr_alias このコマンドにより、 .Ar addr_alias へのデータを .Ar addr_local へリダイレクトします。 少数の実 IP アドレスを持っていて、これらをあなたのゲートウェイの後の 特定のマシンにマップしたい場合に有用です。 .It alias deny_incoming [yes|no] yes に設定した場合、ファイアウォールがパケットを落すのと同様に、 すべての入力の接続を拒否します。 .It alias help|? このコマンドにより、 使用可能なエイリアスコマンドのまとめを表示します。 .It alias log [yes|no] このオプションを指定することにより、 種々のエイリアシングの統計と情報を、ファイル .Pa /var/log/alias.log にログします。 .It alias same_ports [yes|no] 有効になると、 エイリアスライブラリが出力パケットのポート番号を変更しようとすることを 止めさせます。 RPC や LPD といった、 ウェルノウンポート (well known port) からの接続を要求する プロトコルをサポートするのに有用です。 .It alias use_sockets [yes|no] 有効になると、 エイリアスライブラリにソケットを作成させ、 正しい ftp データ入力や IRC 接続を保証できるようになります。 .It alias unregistered_only [yes|no] 登録されていない送信元アドレスの出力パケットのみを、変更します。 RFC1918 によると、登録されていない送信元アドレスは 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 です。 .El .Pp これらのコマンドはソース配布物の .Pa README.alias ファイル中でも議論されています。 .Pp .It [!]bg Ar command 指定した .Ar command を、次の語を置換した後に、バックグラウンドで実行します: .Bl -tag -width PEER_ENDDISC .It Li AUTHNAME これは、ローカルの .Ar authname の値と置き換えられます。後述の .Dq set authname コマンドを参照してください。 .It Li ENDDISC これは、ローカルの終点選択値と置き換えられます。 後述の .Dq set enddisc コマンドを参照してください。 .It Li HISADDR これは、相手の IP 番号と置き換えられます。 .It Li INTERFACE これは、使用中のインタフェース名と置き換えられます。 .It Li LABEL これは、最後に使用したラベル名と置き換えられます。 ラベルは、 .Nm のコマンドラインから .Dq load または .Dq dial のコマンドから指定するか、 .Pa ppp.secret ファイルから指定可能です。 .It Li MYADDR これは、ローカルインタフェースに割り当てられた IP 番号と置き換えられます。 .It Li PEER_ENDDISC これは、相手の終点選択番号と置き換えられます。 .It Li USER これは、PAP もしくは CHAP で認証されたユーザ名と置き換えられます。 通常、この変数は -direct モードでのみ割り当てられます。 この値は、utmp ロギングが有効になっているかどうかに関わらず、利用可能です。 .El .Pp コマンド実行中に .Nm を停止させたい場合は、 .Dq shell コマンドを使用してください。 .It clear modem|ipcp Op current|overall|peak... .Dq modem もしくは .Dq ipcp 階層で、指定されたスループット値をクリアします。 .Dq modem を指定する場合にはコンテキストが与えられなければなりません (後述の .Dq link コマンドを参照)。 第 2 引数が与えられない場合、すべての値がクリアされます。 .It clone Ar name[,name]... 指定されたリンクを複製し、引数の .Ar name に関連づけた新しいリンクを作成します。 このコマンドは、リンクが 1 つしかない場合 (この場合にはそのリンクがデフォルトになります) を除いて後述の .Dq link コマンドから使用する必要があります。 リンクは下記の .Dq remove コマンドで削除できます。 .Pp デフォルトのリンク名は .Dq deflink です。 .It close Op lcp|ccp[!] 引数が与えられないと、適切なプロトコル層がダウンし、リンクが閉じられます。 .Dq lcp が指定されると LCP 層がダウンしますが、 .Nm をオフラインにはしません。例えば .Dq slirp のようなものを使用すれば、 .Dq term .Pq 後述 を使用して相手のマシンと会話できます。 .Dq ccp が指定されると適切な圧縮層が閉じられます。 .Dq \&! が使用されると、圧縮層はクローズ状態のままとなります。 使用されない場合には、STOPPED 状態へ再度入り、 相手が更なる CCP 交渉を開始するのを待ちます。 なにが起きようとも、ユーザを .Nm から切り離すことはありませんし、 .Nm を終了させることもありません。 後述の .Dq quit を参照してください。 .It delete[!] Ar dest このコマンドは指定した .Ar dest IP アドレスの経路を削除します。 .Ar dest に .Sq ALL が指定された場合、 現在のインタフェースの経路表の非直接エントリと .Sq スティッキー経路 がすべて削除されます。 .Ar dest に .Sq default が指定された場合、デフォルト経路が削除されます。 .Pp .Ar delete! コマンドが使用された場合 .Po 最後の .Dq \&! に注意 .Pc 、存在しない経路について .Nm は文句を言わなくなります。 .It dial|call Op Ar label 引数なしで使用された場合、このコマンドは .Dq open コマンドと同一です。 .Ar label が指定された場合、最初に .Dq load が実行されます。 .It down Op Ar lcp|ccp 適切な階層をダウンさせますが、 綺麗な方法ではなく、下位層が使用不能になったように見えます。 オープン状態にある有限状態機械でこのコマンドを使用することは、 丁寧ではないとされています。 引数が与えられない場合、すべてのリンクが閉じられます (コンテキストが与えられない場合にはすべてのリンクが終了されます)。 .Sq lcp が指定された場合、 .Em LCP 層は終了されますが、モデムはオフラインに移行せず、 リンクも閉じられません。 .Sq ccp が指定された場合、 関連する圧縮層のみが終了されます。 .It help|? Op Ar command 利用可能なコマンドをリストします。 .Ar command を指定した場合、このコマンドの使用方法を表示します。 .It [data]link Ar name[,name...] command Op Ar args コマンドが影響を与えるリンクを特定したい場合に、このコマンドを 任意の他のコマンドのプレフィックスとして使うことができます。 これはマルチリンクモードで .Dq clone コマンドを使って複数のリンクを作成した後でのみ適用されます。 .Pp .Ar name は存在するリンク名を指定します。 .Ar name がコンマ区切りのリストの場合には、 .Ar command はそれぞれのリンクに対して実行されます。 .Ar name が .Dq * の場合には、 .Ar command はすべてのリンクに対して実行されます。 .It load Op Ar label .Pa ppp.conf ファイルから指定された .Dq label をロードします。 .Dq label が指定されない場合、 .Dq default ラベルが仮定されます。 .It open Op lcp|ccp|ipcp これは .Dq close の反対のコマンドです。 .Dq open コマンドを引数なしで用いることは .Dq dial を引数なしで用いることと同一です。 すなわちすべての閉じられたリンクが、現在の設定を用いて起動されます ( .Dq set autoload コマンドに基づいた自動リンクの中には起動されないものもあります)。 .Pp LCP 層がすでにオープンされているときに .Dq lcp を指定すると、LCP は再度交渉されます。 したがって、種々の LCP オプションを変更したあとで .Dq open lcp コマンドを用いることで、変更を有効にすることができます。 LCP が再度交渉された後、 同意したあらゆる認証が実行されます。 .Pp .Dq ccp 引数が用いられると、関連する圧縮層がオープンされます。 すでにオープンされている場合には、再度交渉されます。 .Pp .Dq ipcp 引数が用いられると、リンクが通常通り起動されます。すでに IPCP が オープンされている場合には、IPCP は再度交渉され、 ネットワークインタフェースが再設定されます。 .Pp このようにして PPP の状態機械を再オープンするのは、 おそらく良い手段ではありません。 接続相手が正しく振る舞わない可能性があるためです。 しかしながら、強制的に CCP もしくは VJ 辞書をリセットする手段としては 便利です。 .It passwd Ar pass すべての .Nm コマンドセットにアクセスするために要求されるパスワードを指定します。 このパスワードは診断ポート ( .Dq set server コマンド参照) に接続するときに必要です。 .Ar pass は .Dq set server コマンドラインで指定します。 .Ar command ログが有効でも、値 .Ar pass はログされず、文字列 .Sq ******** がログされます。 .It quit|bye [all] .Dq quit が制御接続もしくはコマンドファイルから実行されると、 ppp はすべての接続を閉じた後に終了します。その他の場合、 つまりユーザが診断ソケットから接続している場合には、 単にその接続が失われます。 .Pp .Ar all 引数が与えられた場合、 .Nm はコマンドがどこから発行されたかに関わらず、 すべての存在する接続を閉じて終了します。 .It remove|rm このコマンドは与えられたリンクを消去します。 これはマルチリンクモードでのみ有用です。リンクは消去する前に .Dv CLOSED 状態になっていなければなりません。 .It rename|mv Ar name このコマンドは与えられたリンクの名前を .Ar name に変更します。 .Ar name がすでに他のリンクで使用されている場合には、失敗します。 .Pp デフォルトリンクの名前は .Sq deflink です。これを .Sq modem , .Sq cuaa0 , .Sq USR のいずれかに変更すると、ログファイルの可読性が向上するかも知れません。 .It save このオプションは (まだ) 実装されていません。 .It set[up] Ar var value このオプションは次に示す変数の設定のために使用します: .Bl -tag -width XX .It set accmap Ar hex-value ACCMap は非同期制御文字マップ (Asyncronous Control Character Map) を 意味します。 これはいつも相手と交渉され、デフォルト値は 16 進数で 00000000 です。 このプロトコルが必要なのは、 (XON/XOFF などの) 特定の文字を終点間で受渡すことに依存するハードウェアを 使用する場合です。 .Pp XON/XOFF については .Dq set accmap 000a0000 を使用します。 .It set authkey|key Ar value クライアントモードでの PAP または CHAP の交渉で使用される 認証キー (もしくはパスワード) を、指定した値に設定します。 ダイヤルもしくはログインスクリプトの '\\P' シーケンス で使用されるパスワードを指定しますが、 実際のパスワードがログされることを防ぎます。 .Ar command ログが有効な場合、セキュリティの観点から、 .Ar value は .Sq ******** としてログされます。 .It set authname Ar id クライアントモードでの PAP または CHAP の交渉で使用される 認証 ID を設定します。 .Pp PAP もしくは CHAP を enable にして .Fl direct モードで利用すると、 .Ar id は初期認証要求で用いられ、通常はローカルマシン名に設定されます。 .It set autoload Ar max-duration max-load [min-duration min-load] これらの設定はマルチリンクモードでのみ適用され、 デフォルト値はすべて 0 です。 1 つ以上の .Ar demand-dial .Po .Fl auto としても知られる .Pc モードのリンクが存在する場合、 .Nm が最初に tun デバイスからデータを読むときには最初のリンクのみが 有効になっています。 次の .Ar demand-dial リンクは、 .Ar max-duration 秒の間、送出キューに .Ar max-load 以上のパケットが存在した場合にのみ開かれます。 両方のデフォルト値が 0 であるため、 .Ar demand-dial リンクはデフォルトでは 1 つだけオープンされます。 .Pp 複数のリンクが開かれていて、少なくともその内の 1 つが .Ar demand-dial リンクである場合、 .Ar min-duration 秒の間、送出キューに最大 .Ar min-packets 未満のパケットしか存在しなかったときに閉じられます。 .Ar min-duration が 0 の場合には、タイマは無効になります。 デフォルトでは両方の値が 0 であるため、 .Ar demand-dial リンクはバンドルされたアイドルタイマが期限切れになるまで アクティブであり続けます。 .It set callback [none|auth|cbcp|E.164 *|number[,number]...]... 引数が与えられない場合、コールバックは disable になります。 そうでない場合には、 .Nm は与えられたプロトコルでコールバックを要求します (もしくは .Ar direct モードでは受け付けます)。 要求の否定応答が返されると、 .Nm は他に選択肢がなくなるまで別の要求を出します。 選択肢が尽きると .Nm は交渉を終了します。 オプションは下記の通りです (優先度順): .Pp .Bl -tag .It auth コールバック応答側は、認証に基づいてコールバック番号を 決定することが求められます。 .Nm がコールバック応答側である場合、番号は .Pa /etc/ppp/ppp.secret 中の接続先エントリの 5 番目のフィールドで指定されます。 .It cbcp Microsoft コールバック制御プロトコルが用いられます。後述の .Dq set cbcp を参照してください。 .It E.164 *|number[,number]... コールバック要求側が .Ar number を指定します。 .Nm がコールバック応答側である場合、 .Ar number は許可する番号をコンマで区切って並べたリスト、もしくは 任意の番号を許可するという意味の .Dq \&* とします。 .Nm がコールバック要求側である場合、1 つの数字だけを指定します。 .Pp .Dq \&* を用いる場合、このオプションはとても危険なものとなることに 注意してください。 というのは、悪意あるコールバック要求者が、最初の認証なしに 電話すべき番号として任意の (国際通話番号も可能です) 番号を 伝えることができるからです。 .It none 接続相手がコールバックをまったく望まない場合、 .Nm はそのことを受け入れ、接続を終了するのではなく コールバックせずに処理を続けます。 .El .Pp .It set cbcp Op *|number[,number]... Op delay Op retry 引数が与えられない場合、CBCP (Microsofts CallBack Control Protocol) は disable です。言い換えれば .Dq set callback コマンドで CBCP を設定すると .Nm が CBCP フェーズでコールバック要求を行わなくなります。 そうでない場合、 .Nm は与えられた電話番号 .Ar number を使おうとします。 .Pp サーバモード .Pq Fl direct では、 .Dq \&* を使わない限り .Nm はクライアントがこれらの番号の 1 つを使うことを主張します。 .Dq \&* を使った場合には、クライアントが番号を指定するものと想定します。 .Pp クライアントモードでは .Nm は与えられた番号 (そのうち接続相手と合意可能なもの) を使用しようとします。 .Dq \&* が指定された場合には、 .Nm 接続相手が番号を指定するものと想定します。 .It set choked Op Ar timeout これは .Nm がすべての未送出パケットを破棄する前に 送出キュー詰まりを保持する秒数を設定します。 .Ar timeout が 0 以下もしくは .Ar timeout が指定されない場合、デフォルト値の .Em 120 秒 に設定されます。 .Pp 送出キュー詰まりは .Nm がローカルネットワークから特定の数の送出パケットを読み込んだが、 リンク失敗 (接続相手がビジーなど) のためにデータを送れない場合に 発生します。 .Nm はパケットを無限には読み込みません。代りに .Em 20 パケット (マルチリンクモードでは .Em 20 No + .Em nlinks No * .Em 2 パケット) まで読み込み、 .Ar timeout 秒経過するか、1 つ以上のパケットが送られるまで ネットワークインタフェースの読み込みを停止します。 .Pp .Ar timeout 秒が経過すると、すべての未送出パケットは破棄されます。 .It set ctsrts|crtscts on|off ハードウェアフロー制御をセットします。 デフォルトではハードウェアフロー制御は .Ar on です。 .It set deflate Ar out-winsize Op Ar in-winsize DEFLATE アルゴリズムの、 デフォルトの出力ウィンドウサイズと入力ウィンドウサイズを設定します。 .Ar out-winsize および .Ar in-winsize は、 .Em 8 から .Em 15 までの値をとる必要があります。 .Ar in-winsize が指定されると、 .Nm はこのウィンドウサイズの使用を強要し、相手が他の値を示しても受け入れません。 .It set dns Op Ar primary Op Ar secondary .Dq accept dns コマンドで使用される、DNS 上書きを設定します。 詳細については前述の .Dq accept コマンドの記述を参照してください。本コマンドは .Dq enable dns を使用して要求される IP 番号には影響を与えません。 .It set device|line Ar value[,value...] .Nm が使用するデバイスを、指定された .Dq value に設定します。 全シリアルデバイス名は .Pa /dev/ から始まることが仮定されています。 .Dq value が .Pa /dev/ から始まらない場合、エクスクラメーションマーク .Pq Dq \&! から始めるか、 .Dq host:port の形式である必要があります。 .Pp エクスクラメーションマークで始まる場合、 デバイス名の残りはプログラム名として扱われ、 そのデバイスがオープンされるときにそのプログラムが実行されます。 標準入出力およびエラーは .Nm にフィードバックされ、それらが通常デバイスであるかのように読み書きされます。 .Pp .Dq host:port の組が与えられる場合、 .Nm は、指定された .Dq host の指定された .Dq port と接続しようとします。 詳細は上述の .Em PPP オーバ TCP の節を参照してください。 .Pp 複数の .Dq value を指定した場合、 .Nm は成功するか全デバイスについて実行し終るまで、順番にオープンを試みます。 .It set dial Ar chat-script 相手へダイヤルする際に使用されるチャットスクリプトを指定します。 後述の .Dq set login コマンドも参照してください。 チャットスクリプトのフォーマットの詳細については、 .Xr chat 8 と設定ファイルの例を参照してください。 次の特殊な .Sq value をチャットスクリプトに指定可能です: .Bd -unfilled -offset indent .It \\\\\\\\\\\\\\\\c .Sq 送信 文字列の最後の文字として使用した場合、 改行を追加してはならないことを意味します。 .It \\\\\\\\\\\\\\\\d チャットスクリプトがこのシーケンスに出会うと、2 秒待ちます。 .It \\\\\\\\\\\\\\\\p チャットスクリプトがこのシーケンスに出会うと、1/4 秒待ちます。 .It \\\\\\\\\\\\\\\\n 改行文字と置き換えられます。 .It \\\\\\\\\\\\\\\\r 復改文字と置き換えられます。 .It \\\\\\\\\\\\\\\\s 空白文字と置き換えられます。 .It \\\\\\\\\\\\\\\\t タブ文字と置き換えられます。 .It \\\\\\\\\\\\\\\\T 現在の電話番号と置き換えられます (後述の .Dq set phone 参照)。 .It \\\\\\\\\\\\\\\\P 現在の .Ar authkey 値と置き換えられます (前述の .Dq set authkey 参照)。 .It \\\\\\\\\\\\\\\\U 現在の .Ar authname 値と置き換えられます (前述の .Dq set authname 参照)。 .Ed .Pp 2 つのパーザがこれらのエスケープシーケンスを検査することに注意してください。 .Sq チャットのパーザ にエスケープ文字を見せるには、 .Sq コマンドパーザ からエスケープする必要があります。 つまり、2 つのエスケープを使用する必要があります。例えば次のようにします: .Bd -literal -offset indent set dial "... ATDT\\\\T CONNECT" .Ed .Pp チャットスクリプトから外部コマンドを実行することもできます。 そうするためには、 受信待ち文字列または送信文字列の最初の文字をエクスクラメーションマーク .Pq Dq \&! にします。 コマンドが実行されると、標準入力と標準出力がモデムデバイス ( .Dq set device 参照) に向けられ、標準エラー出力が .Nm に読まれて受信待ち文字列もしくは送信文字列に置き換えられます。 .Nm が対話モードで実行されている場合、ファイルデスクリプタ 3 は .Pa /dev/tty に接続されます。 .Pp 例えば (読み易さのために折り返しています); .Bd -literal -offset indent set login "TIMEOUT 5 \\"\\" \\"\\" login:--login: ppp \e word: ppp \\"!sh \\\\\\\\-c \\\\\\"echo \\\\\\\\-n label: >&2\\\\\\"\\" \e \\"!/bin/echo in\\" HELLO" .Ed .Pp は次のチャットシーケンスになります (ダイヤル前の .Sq set log local chat コマンドによる出力): .Bd -literal -offset indent Dial attempt 1 of 1 dial OK! Chat: Expecting: Chat: Sending: Chat: Expecting: login:--login: Chat: Wait for (5): login: Chat: Sending: ppp Chat: Expecting: word: Chat: Wait for (5): word: Chat: Sending: ppp Chat: Expecting: !sh \\-c "echo \\-n label: >&2" Chat: Exec: sh -c "echo -n label: >&2" Chat: Wait for (5): !sh \\-c "echo \\-n label: >&2" --> label: Chat: Exec: /bin/echo in Chat: Sending: Chat: Expecting: HELLO Chat: Wait for (5): HELLO login OK! .Ed .Pp 複数レベルのネストについて、 エスケープ文字の使用方法に (再度) 注意してください。 ここでは、4 つのパーザが動作してます。 1 番目は、オリジナルの行をパーズし、3 つの引数として読みます。 2 番目は、第 3 引数を 11 個の引数として読みます。 ここで、 .Dq \&- 記号がエスケープされていることが重要です。 そうでなければパーザは、 受信待ち-送信-受信待ちのシーケンスとして見てしまいます。 .Dq \&! 文字を見付けると、実行パーザは最初のコマンドを 3 つの引数として読み、 .Xr sh 1 自身が .Fl c 以降の引数を展開します。 我々は出力をモデムに送り返したいので、 1 番目の例では出力をファイルデスクリプタ 2 (stderr) にリダイレクトして .Nm 自身に送信およびログさせ、 2 番目の例では単に stdout に出力して直接モデムに出力させます。 .Pp もちろん全体を、組み込みのものではなく外部の .Dq chat コマンドに実行させることが可能です。 良い代替方法については .Xr chat 8 を参照してください。 .It set enddisc Op label|IP|MAC|magic|psn value このコマンドは、ローカル終点の選択値を設定します。 LCP 交渉の前に設定されると、 .Nm は LCP 終点選択値オプションを使用して、相手に情報を送ります。 次の選択値を設定可能です。 .Bd -unfilled -offset indent .It Li label 現在のラベルが使用されます。 .It Li IP 当方のローカル IP 番号を使用します。 LCP は IPCP より前に交渉されますので、 IPCP 層が後からこの値を変更することが可能です。 その場合、手動でリセットしない限り、終点の選択値は古い値のままとなります。 .It Li MAC 前述の .Ar IP オプションに似ていますが、 ローカル IP 番号に関係する MAC アドレスが使用される点が異なります。 ローカル IP 番号がどのイーサネットインタフェースにも存在しない場合、 本コマンドは失敗します。 .Pp ローカル IP 番号のデフォルトは、 マシンンホスト名がなんであれ、その名前になりますので、通常 .Dq set enddisc mac を .Dq set ifaddr コマンドよりも先に実行します。 .It Li magic 20 桁の乱数が使用されます。 .It Li psn Ar value 指定された .Ar value が使用されます。 .Ar value は、絶対的な公衆スイッチネットワーク番号の先頭に 国コードを付けたものであるべきです。 .Ed .Pp 引数が与えられない場合、終点の選択値はリセットされます。 .It set escape Ar value... このオプションは前述の .Dq set accmap オプションに似ています。 リンクを経由する時に「エスケープ」される文字を指定するために使用します。 .It set filter dial|alive|in|out rule-no permit|deny Ar "[src_addr/width] [dst_addr/width] [proto [src [lt|eq|gt port]] [dst [lt|eq|gt port]] [estab] [syn] [finrst]]" .Nm は 4 つのフィルタセットをサポートします。 .Em alive フィルタは接続を活性状態に保つパケットを指定します - アイドルタイマをリセットします。 .Em dial フィルタは、 .Fl auto モード時に .Nm にダイヤルさせるパケットを指定します。 .Em in フィルタは、マシンに入力可能なパケットを指定します。 .Em out フィルタは、マシンから出力可能なパケットを指定します。 .Pp フィルタリングは、 エイリアスエンジンが行う IP 変更の前に適用されます。 デフォルトでは、全フィルタセットが全パケットの通過を許可します。 ルールは .Ar rule-no に従って順番に処理されます。 各セットに対し 20 までのルールを指定可能です。 指定されるセットにおけるどのルールにもマッチしないパケットは破棄されます。 .Em in と .Em out のフィルタでは、パケットをドロップすることを意味します。 .Em alive フィルタでは、アイドルタイマをリセットしないことを意味します。 .Em dial フィルタではダイアルさせることにはならないことを意味します。 ダイヤルを引き起こさないパケットは、 キューされるのではなく、捨てられることに注意してください。 上述のパケットのフィルタリングの節を参照してください。 .It set hangup Ar chat-script モデムを閉じる前にこれをリセットする時に使用する、 チャットスクリプトを指定します。 通常は不要であるべきですが、 閉じる時に自己を正しくリセットできないデバイスに対して使用できます。 .It set help|? Op Ar command 利用可能な set コマンドのまとめを表示するか、 .Ar command が指定されると、コマンドの使用方法を表示します。 .It set ifaddr Ar [myaddr [hisaddr [netmask [triggeraddr]]]] このコマンドは、IPCP 交渉の間使用される IP アドレスを指定します。 アドレスのフォーマットは次の通りです。 .Pp .Dl a.b.c.d/n .Pp ここで .Ar a.b.c.d は希望する IP アドレスであり、 .Ar n はこのうち何ビットが有効であるかを示します。 .Ar /n が省略された場合、デフォルトの .Ar /32 になります。 ただし IP アドレスが 0.0.0.0 である場合には、マスクのデフォルトは .Ar /0 です。 .Pp .Ar hisaddr に IP 番号の範囲として .Pp .Dl a.b.c.d[-d.e.f.g][,h.i.j.k[-l,m,n,o]]... .Pp のフォーマットを指定できます。例えば: .Pp .Dl set ifaddr 10.0.0.1 10.0.1.2-10.0.1.10,10.0.1.20 .Pp は .Ar 10.0.0.1 のみをローカル IP 番号として交渉しますが、指定された 10 個の IP 番号から 相手に割り当てを行います。 相手がこれらの番号のうちの 1 つを要求し、この番号が未使用な場合には、 .Nm は相手の要求を認めます。 相手がリンクを再確立して前回割り当てていた IP 番号を使用したい場合に有用です (既存の TCP 接続を保存します)。 .Pp 相手が要求した IP 番号が範囲外もしくは使用中の場合、 .Nm は範囲内の未使用 IP 番号をランダムに指示します。 .Pp .Ar triggeraddr が指定された場合、この値が .Ar myaddr の代りに IPCP 交渉で使用されます。 ただし、 .Ar myaddr の範囲のアドレスのみ受け入れられます。 これが有用なのは、相手が .Ar 0.0.0.0 を要求しない限り IP アドレスを割り当てようとしない .Dv PPP 実装と交渉するときです。 .Pp .Fl auto モードでは設定ファイルの .Dq set ifaddr 行を読んだ直後に .Nm がインタフェースを構成することに注意してください。 他のモードではこれらの値は IPCP 交渉で使用され、 IPCP 層がアップするまでこれらのインタフェースは構成されません。 .Pp .Po PAP か CHAP が .Dq enable である場合 .Pc クライアントが自己証明をした後では、 .Ar HISADDR 引数は .Pa ppp.secret ファイルの第 3 引数で上書きされうることに注意してください。 .Em 内向き接続の認証 の節を参照してください。 .Pp どの場合でも、インタフェースが既に構成されている場合には、 .Nm はインタフェースの IP 番号を保存して、 既にバインドされているソケットが正しいままであるようにします。 .It set ccpretry Ar period .It set chapretry Ar period .It set ipcpretry Ar period .It set lcpretry Ar period .It set papretry Ar period これらのコマンドは .Nm が有限状態機械 (Finite State Machine; FSM) に要求パケットを送る前に 待つ秒数を指定します。 .Ar period のデフォルトは、全 FSM において 3 秒です (ほとんどの場合十分です)。 .It set log [local] [+|-] Ns Ar value... このコマンドにより現在のログレベルを修正できます。 詳細はログ機能の節を参照してください。 .It set login chat-script この .Ar chat-script はダイヤルスクリプトを補います。 もし両方が指定された場合、ダイヤルスクリプトの後で、 ログインスクリプトが実行されます。 ダイヤルスクリプト中で使用可能なエスケープシーケンスはここでも使用可能です。 .It set lqrperiod Ar frequency このコマンドは、 .Em LQR または .Em ECHO LQR のパケットが送信される頻度 .Ar frequency を秒で指定します。デフォルトは 30 秒です。 相手に LQR 要求を送りたい場合には、 .Dq enable lqr コマンドもまた使用する必要があります。 .It set mode Ar interactive|auto|ddial|background 指定したリンクにおけるモード .Sq mode を変更できます。通常マルチリンクモードでのみ有用ですが、 単一リンクモードでも使用可能です。 .Pp .Sq direct または .Sq dedicated のリンクを変更することはできません。 .It set mrru Op Ar value このオプションを設定すると、 マルチリンクプロトコルまたは MP としても知られる、 マルチリンク PPP 交渉を有効にします。 MRRU (Maximum Reconstructed Receive Unit) の値にはデフォルトはありません。 引数を指定しないと、マルチリンクモードは無効にされます。 .It set mru Op Ar value デフォルトの MRU (最大受信単位; Maximum Receive Unit) は 1500 です。 この値を増加させた場合、相手は MTU を増加させても *かまいません*。 デフォルトの MRU より減らすことは意味がありません。 なぜなら、 .Em PPP プロトコルでは少なくとも 1500 オクテットのパケットを 受信できなければ *ならない* からです。 引数が指定されないと、1500 が仮定されます。 .It set mtu Op Ar value デフォルトの MTU は 1500 です。 交渉時に、(296 バイト未満でなければ) 相手が望むいかなる MRU および MRRU も受け付け可能です。 MTU が設定されると、 .Nm は .Ar value よりも小さい MRU/MRRU の値を受け付けなくなります。 交渉が完了すると、相手がより大きな MRU/MRRU を要求していたとしても、 インタフェースに対して MTU が割り当てられます。 当方のパケットサイズを制限するのに有用です (よりよくバンド幅を共有できるようになりますが、 ヘッダデータが増えるというコストがかかります)。 .Pp .Ar value を指定しないと、1500 または相手が要求した値が使用されます。 .It set nbns Op Ar x.x.x.x Op Ar y.y.y.y このオプションは、相手の要求によって返される Microsoft NetBIOS ネームサーバの値を設定します。 値を指定しないと、 .Nm はそのような要求を拒否するようになります。 .It set openmode active|passive Op Ar delay デフォルトでは、 .Ar openmode は常に、1 秒の .Ar delay をもって .Ar active となります。 この場合、 .Nm は回線が設定されてから 1 秒が経過したなら いつでも LCP/IPCP/CCP の交渉を開始します。 相手が交渉を開始するのを待ちたい場合は、値 .Dq passive を使用します。 直ちにもしくは 1 秒以上待ってから交渉を開始したい場合、 .Ar delay を秒単位で指定します。 .It set parity odd|even|none|mark 回線のパリティを設定できます。デフォルト値は .Ar none です。 .It set phone Ar telno[|telno]...[:telno[|telno]...]... ダイヤルおよびログインのチャットスクリプトで使用される \\\\T 文字列が 置き換えられる電話番号を指定できます。 複数の電話番号をパイプ (|) もしくはコロン (:) で区切って指定可能です。 パイプの後の番号がダイヤルされるのは、 直前の番号へのダイヤルもしくはログインのスクリプトが失敗した場合のみです。 回線の切断の理由にかかわらず、 コロンで区切られた番号は順番に試行されます。 複数の番号を指定した場合、接続が確立するまで .Nm はこのルールに基づいてダイヤルします。 再試行の最大値は、後述の .Dq set redial で指定します。 .Fl background モードでは各番号は最大 1 回試行されます。 .It set reconnect Ar timeout ntries (CD の喪失もしくは LQR の失敗により) 予想外の回線切断となった場合、 指定した .Ar timeout の後に接続が再確立されます。 回線は最大 .Ar ntries 回、再接続されます。 .Ar ntries のデフォルトは 0 です。 .Ar timeout に .Ar random を指定すると、0 から 30 秒の間の任意時間の停止となります。 .It set redial Ar seconds[.nseconds] [attempts] .Nm に .Ar attempts 回のリダイヤルを指示できます。 1 より大きな数を指定した場合 (前述の .Ar set phone 参照)、 各番号にダイヤルする前に、 .Ar nseconds だけ停止します。 最初の番号に戻ってダイヤル開始する前に .Ar seconds だけ停止します。 .Dq random を .Ar seconds および .Ar nseconds のところで使用でき、0 から 30 秒の間の任意時間の停止となります。 .Pp .Ar attempts が経過した後でもこの遅延は効果があるので、 すぐに手動でダイヤルしても何も起ってないように見えるかもしれません。 すぐにダイヤルする必要がある場合、 .Dq \&! を .Dq open キーワードの直後に付けます。 更なる詳細については、前述の .Dq open の記述を参照してください。 .It set server|socket Ar TcpPort|LocalName|none password Op Ar mask このコマンドは .Nm に指定したソケットもしくは .Sq 診断ポート にてコマンド接続の入力を listen するように指示します。 .Pp 語 .Ar none は .Nm に既に存在するソケットを閉じさせます。 .Pp ローカルドメインソケットを指定したい場合、 .Ar LocalName に絶対ファイル名を指定します。そうしないと、TCP ポートの名前もしくは番号 であると解釈されます。 ローカルドメインソケットに使用される 8 進 umask を指定可能です。 .Sq 0 から始まる 4 桁 8 進数で指定します。 umask の詳細については .Xr umask 2 を参照してください。TCP ポート名がどのように変換されるかについては .Xr services 5 を参照してください。 .Pp このソケットにクライアントが接続するときに使用されねばならないパスワードも 指定可能です ( 前述の .Dq passwd コマンドを使用します)。 パスワードが空文字列として指定される場合、 クライアントが接続するときにパスワードを必要とされません。 .Pp ローカルドメインソケットが指定される場合、ソケット名中の最初の .Dq %d シーケンスは現在のインタフェースユニット番号で置換されます。 複数接続のために同一のプロファイルを使用したい場合に便利です。 .Pp 同様の方法で TCP ソケットの前に .Dq + 文字を付けることができます。 この場合、現在のインタフェースユニット番号が、ポート番号に加算されます。 .Pp .Nm をサーバソケットと共に使用する場合、通信機構として .Xr pppctl 8 コマンドを使用することが好ましいです。 現在 .Xr telnet 1 も使用可能ですが、将来リンク暗号化が実装されるかもしれませんので、 .Xr telnet 1 に依存しないようにしてください。 .It set speed Ar value シリアルデバイスの速度を指定します。 .It set stopped Ar [LCPseconds [CCPseconds]] このオプションが指定されると、 指定した FSM (有限状態機械; Finite State Machine) が停止状態になってから .Dq seconds で指定した秒数だけ停止したのち、 .Nm はタイムアウトします。 このオプションは、 相手が終了要求を送り我々が終了確認応答を送ったにもかかわらず 実際には接続を閉じない場合に、有用かもしれません。また、 .Dq set openmode passive を使用した場合に相手が指定時間内に Configure Request を送らないことを タイムアウト検出する場合には、便利かもしれません。 .Dq set log +lcp +ccp を使用すると、 .Nm は適切な状態遷移をログします。 .Pp デフォルト値は 0 であり、 停止状態による .Nm のタイムアウトは発生しません。 .Pp この値は openmode の遅延 (上述の .Dq set openmode 参照) より小さくなってはなりません。 .It set timeout Ar idleseconds このコマンドはアイドルタイマの値を指定します。 更なる詳細については .Dq アイドルタイマの設定 というタイトルの節を参照してください。 .It set vj slotcomp on|off このコマンドは .Nm に VJ スロット圧縮を交渉するか否かを指示します。 デフォルトではスロット圧縮は .Ar on です。 .It set vj slots Ar nslots このコマンドは最初の .Ar slots 番号を指定します。 .Nm は VJ 圧縮が enable されている時には、 これを使用して相手と交渉をします (前述の .Sq enable コマンドを参照してください)。 デフォルト値は 16 です。 .Ar nslots は .Ar 4 以上 .Ar 16 以下の値です。 .El .Pp .It shell|! Op Ar command .Ar command が指定されない場合、 .Dv SHELL 環境変数で指定されるシェルが起動されます。 そうでなければ指定された .Ar command が実行されます。 語の置換は、前述の .Dq !bg コマンドと同様の方法で行われます。 .Pp 文字 ! を使用する場合、コマンドとの間に空白が必要です。 このコマンドはフォアグラウンドで実行されることに注意してください - .Nm はプロセスが終了するまでは実行を続けません。 バックグラウンドでコマンド処理を行いたい場合には、 .Dv bg コマンドを使用してください。 .It show Ar var このコマンドを使用して、次の内容を確認できます: .Bl -tag -width 20 .It show bundle 現在のバンドル設定を表示します。 .It show ccp 現在の CCP 圧縮統計を表示します。 .It show compress 現在の VJ 圧縮統計を表示します。 .It show escape 現在のエスケープ文字を表示します。 .It show filter Op Ar name 指定したフィルタの現在のルールをリストします。 .Ar name を指定しないと、全フィルタが表示されます。 .It show hdlc 現在の HDLC 統計を表示します。 .It show help|? 利用可能な show コマンドのまとめを表示します。 .It show ipcp 現在の IPCP 統計を表示します。 .It show lcp 現在の LCP 統計を表示します。 .It show [data]link 高レベルリンク情報を表示します。 .It show links 利用可能な論理リンクのリストを表示します。 .It show log 現在のログ値を表示します。 .It show mem 現在のメモリ統計を表示します。 .It show modem 現在の下位レベルリンク情報を表示します。 .It show proto 現在のプロトコルの総計を表示します。 .It show route 現在の経路表を表示します。 .It show stopped 現在の stopped タイムアウト値を表示します。 .It show timer アクティブアラームタイマを表示します。 .It show version .Nm の現在のバージョン番号を表示します。 .El .Pp .It term 端末モードに移行します。 キーボードからタイプした文字はモデムに送られます。 モデムから読んだ文字はスクリーンに表示されます。 モデムの相手側に .Nm の相手が認識された時には、 .Nm は自動的にパケットモードを有効にし、コマンドモードに戻ります。 .El .Pp .Sh 更に詳細について .Bl -bullet .It 設定ファイルの例を読んでください。良い情報源です。 .It 何が利用できるかについては、 .Dq help , .Dq show ? , .Dq alias ? , .Dq set ? , .Dq set ? コマンドを使って、オンライン情報を取得してください。 .It 次の URL に有用な情報があります: .Bl -bullet -compact .It http://www.FreeBSD.org/FAQ/userppp.html .It http://www.FreeBSD.org/handbook/userppp.html .El .Pp .El .Pp .Sh 関連ファイル .Nm は、4 つのファイル .Pa ppp.conf , .Pa ppp.linkup , .Pa ppp.linkdown , .Pa ppp.secret を参照します。 これらのファイルは .Pa /etc/ppp に置かれます。 .Bl -tag -width XX .It Pa /etc/ppp/ppp.conf システムのデフォルト設定ファイル。 .It Pa /etc/ppp/ppp.secret 各システム用の認証設定ファイル。 .It Pa /etc/ppp/ppp.linkup .Nm がネットワークレベルの接続を確立した時に実行されるファイル。 .It Pa /etc/ppp/ppp.linkdown .Nm がネットワークレベルの接続を閉じる時にチェックするファイル。 .It Pa /var/log/ppp.log ログとデバッグ情報のファイル。このファイル名は .Pa /etc/syslogd.conf にて指定されます。詳細は .Xr syslog.conf 5 を参照してください。 .It Pa /var/spool/lock/LCK..* tty ポートをロックするためのファイル。詳細は .Xr uucplock 3 を参照してください。 .It Pa /var/run/tunN.pid tunN デバイスに接続されている .Nm プログラムのプロセス ID (pid) 。 ここで .Sq N はデバイスの番号です。 .It Pa /var/run/ttyXX.if このポートで使われている tun インタフェース。 このファイルも .Fl background , .Fl auto , .Fl ddial のいずれかのモードの時のみ作成されます。 .It Pa /etc/services サービス名でポート番号が指定されている場合に、ポート番号を取得します。 .It Pa /var/run/ppp-authname-class-value マルチリンクモードでは、 相手の認証名称 .Pq Sq authname と相手の終点選択クラス .Pq Sq class と相手の終点選択値 .Pq Sq value を使用して、ローカルドメインソケットが生成されます。 終点選択値はバイナリ値であってもかまわないため、 実際のファイル名を判定するために 16 進数に変換されます。 .Pp このソケットは、別の .Nm のインスタンスとリンクを受け渡しを行うために使用します。 .El .Pp .Sh 関連項目 .Xr at 1 , .Xr ftp 1 , .Xr gzip 1 , .Xr hostname 1 , .Xr login 1 , .Xr tcpdump 1 , .Xr telnet 1 , .Xr syslog 3 , .Xr uucplock 3 , .Xr crontab 5 , .Xr group 5 , .Xr passwd 5 , .Xr resolv.conf 5 , .Xr syslog.conf 5 , .Xr adduser 8 , .Xr chat 8 , .Xr getty 8 , .Xr inetd 8 , .Xr init 8 , .Xr named 8 , .Xr ping 8 , .Xr pppctl 8 , .Xr pppd 8 , .Xr route 8 , .Xr syslogd 8 , .Xr traceroute 8 , .Xr vipw 8 .Sh 歴史 元のプログラムは Toshiharu OHNO (tony-o@iij.ad.jp) が作成し、 FreeBSD-2.0.5 に Atsushi Murai (amurai@spec.co.jp) が提出しました。 .Pp 1997 年中に本質的に Brian Somers (brian@Awfulhak.org) が修正をし、 11 月に OpenBSD に移植されました (2.2-RELEASE の直後です)。 .Pp 1998 年初頭にマルチリンク ppp サポートが追加されたときに、 ほとんどのコードを Brian Somers が書き直しました。 diff --git a/ja_JP.eucJP/man/man8/sendmail.8 b/ja_JP.eucJP/man/man8/sendmail.8 index bcada3cbe3..0e798c79ec 100644 --- a/ja_JP.eucJP/man/man8/sendmail.8 +++ b/ja_JP.eucJP/man/man8/sendmail.8 @@ -1,562 +1,562 @@ .\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. .\" Copyright (c) 1983, 1997 Eric P. Allman. All rights reserved. .\" Copyright (c) 1988, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" By using this file, you agree to the terms and conditions set .\" forth in the LICENSE file which can be found at the top level of .\" the sendmail distribution. .\" .\" .\" @(#)sendmail.8 8.19 (Berkeley) 5/19/98 .\" jpman %Id: sendmail.8,v 1.2 1997/06/05 01:31:44 yugawa Stab % .\" .Dd May 19, 1998 .Dt SENDMAIL 8 .Os BSD 4 .Sh 名称 .Nm sendmail .Nd 電子メール配送デーモン .Sh 書式 .Nm sendmail .Op Ar flags .Op Ar address ... .Nm newaliases .Nm mailq .Op Fl v .Sh 解説 .Nm sendmail はメッセージを他の人に送ります。必要ならばネットワークを 通してメッセージを正しい場所に転送します。 .Pp ただし、 .Nm sendmail はユーザインタフェースとして使われることは考慮さ れていません。ユーザにとって使いやすいフロントエンドは別のプログラムで 提供されます。 .Nm sendmail は、あらかじめメールとして整形されたメッセージ を配送するためだけに使われます。 .Pp .Nm sendmail を引数を指定せずに起動すると、 .Nm sendmail は標準入力を EOF (エンド・オブ・ ファイル)か `.'だけを含む行まで読み込み、メッセージのなかに記述されている アドレスにメッセージのコピーを送ります。アドレスの文法や内容にもとづいて 経路に使用するネットワークを決定します。 .Pp ローカルアドレスは、ファイルの中を検索して適当なエイリアスを行います。 先頭にバックスラッシュ `\\' のついたアドレスについては、エイリアスは 行なわれません。 通常、送り手はエイリアスの対象に含まれません。つまり、もし `john' が `group' にメールを送って、 `john' が `group' に 含まれている場合、送ったメッセージは `john' には送られません。 .Ss パラメータ .Bl -tag -width Fl .It Fl B Ns Ar type ボディのタイプを .Ar type に設定します。現在有効なのは、 .Li `7BIT' か .Li `8BITMIME' です。 .It Fl ba .Tn ARPANET モードに移行します。すべての入力行は CR-LF で終わらなければならず、 すべてのメッセージの末尾には CR-LF がつきます。また、``From:'' と ``Sender:'' フィールドは送り手の名前としてチェックされます。 .It Fl bd -デーモンモードで実行します。バークレー +デーモンモードで実行します。Berkley .Tn IPC が必要です。 .Nm sendmail は .Xr fork 2 を行い、バックグラウンドで動作し、ソケット番号 25 で .Tn SMTP コネクションを 待ちます。通常このモードは、 .Pa /etc/rc から実行されています。 .It Fl bD フォアグラウンドで動作する以外は .Fl bd と同じです。 .It Fl bh 現在のホストの状況のデータベースを表示します。 .It Fl bH 現在のホストの状況のデータベースをパージします。 .It Fl bi エイリアスデータベースを初期化します。 .It Fl bm 普通にメールを配送します(デフォルト)。 .It Fl bp メールキューのリストを表示します。 .It Fl bs 標準入出力で .Tn RFC821 にもとづいた .Tn SMTP プロトコルを使います。この フラグは、 .Fl ba フラグのうち .Tn SMTP 互換の全ての操作を含みます。 .It Fl bt アドレスのテストモードで起動します。このモードは対話 モードでアドレスを入力し、処理の過程を表示します。設定ファイル をデバッグするのに使います。 .It Fl bv 名前のチェックだけを行います。メッセージの収集や配送は行い ません。ベリファイモードは、ユーザやメーリングリストが有効かどうかを確認する ために使います。 .It Fl C Ns Ar file 別の設定ファイルを使います。 .Nm sendmail は、別の設定ファイル を使用する場合は root として実行することはできません。 .It Fl d Ns Ar X デバッグ値を .Ar X に設定します。 .ne 1i .It Fl F Ns Ar fullname 送り手のフルネームを設定します。 .It Fl f Ns Ar name ``from'' に入る名前(つまり、送り手の名前です)を設定します。 .Fl f は、``trusted''なユーザ(普通は .Em root , .Em daemon , .Em network です)が使うか、 送り手が自分自身の名前を指定して使う場合のみ指定することができます。 .It Fl h Ns Ar N ホップカウントを .Ar N に設定します。ホップカウントは、 メールが処理されるたびに増えていきます。ホップカウントがリミットになった とき、メールは「エイリアスがループしている」という旨のエラーメッセージと いっしょに送り返されます。 もしこのフラグが指定されなければ、メッセージのなかの ``Received:'' 行がカウント されます。 .It Fl i 入力されるメッセージ中の `.' だけを含む行を無視します。 このフラグは、データをファイルから読み込むような場合に使用する必要があります。 .It Fl N Ar dsn 配送状況の通知条件を .Ar dsn に設定します。 .Ar dsn には、 .Ql never (何も通知しない)または、コンマで区切った、 .Ql failure (配送が失敗した場合に通知する) .Ql delay (配送が遅れた場合に通知する) .Ql success (配送が正常に行われた場合に通知する) の組み合わせを指定する事ができます。 .It Fl n エイリアスを行いません。 .It Fl O Ar option Ns = Ns Em value オプション .Ar option を、指定した .Em value に設定します。この形式では長いオプション名が使用されます。 詳しくは後に記述します。 .It Fl o Ns Ar x Em value オプション .Ar x を、指定した .Em value に設定します。 この形式では、一文字のオプション名しか使用できません。 短いオプション名についてはこのマニュアルには記述されていません。 詳しくは、 .%T "Sendmail Installation and Operation Guide" を参照して下さい。 .It Fl p Ns Ar protocol メッセージを受け取るのに利用するプロトコル名を設定します。 設定できるのは、 ``UUCP'' のようなプロトコル名だけかプロトコル+ホスト名、たとえば ``UUCP:ucbvax'' などです。 .It Fl q Ns Bq Ar time キューのなかにあるメッセージを処理する間隔を設定します。 .Ar time を省略した場合は、キューの内容を一度だけしか処理しません。 .Ar time は、 .Ql s (秒)、 .Ql m (分)、 .Ql h (時間)、 .Ql d (日)、 .Ql w (週)の単位を付けた数字で指定します。 たとえば、 .Ql -q1h30m や .Ql -q90m は、タイムアウトを 1 時間 30 分に設定します。 .Ar time が指定されると、 .Nm sendmail はデーモンとしてバックグラウンドで 実行されます。 デーモンとして実行させる際には、同時にオプション .Fl bd を つけておくほうが安全です。 .It Fl qI Ns Ar substr キュー ID の文字列に .Ar substr が含まれるジョブのみを処理します。 .It Fl qR Ns Ar substr 受信者のリストの文字列に .Ar substr が含まれるジョブのみを処理します。 .It Fl qS Ns Ar substr 送信者の文字列に .Ar substr が含まれるジョブのみを処理します。 .It Fl R Ar return メッセージがバウンスした時に返送されるメッセージの量を設定します。 .Ar return パラメータには、メッセージ全体を返送する場合は .Ql full を、ヘッダのみを返送する場合は .Ql hdrs を指定します。 .It Fl r Ns Ar name .Fl f フラグと同じですが、古い形式です。 .It Fl t 受信者をメッセージから読み取ります。To:, Cc:, Bcc: フィールドが受信者 のアドレスとして読み込まれます。Bcc: フィールドはメッセージの転送前に 削除されます。 .It Fl U 最初の(ユーザからの)発送である事を示します。 このフラグは、 .Nm Mail や .Nm exmh の様なユーザエージェントから呼び出す場合は .Em 必ず 指定する必要があり、 .Nm rmail 等のネットワーク配送エージェントから呼び出す場合は、 .Em 絶対に 指定してはいけません。 .It Fl V Ar envid オリジナルのエンベロープ ID を設定します。 これは、DSN をサポートするサーバ間では SMTP 上を伝達し、 DSN に従ったエラーメッセージの中で返送されます。 .It Fl v 詳細モードに移行します。展開されるエイリアスなどが報告されます。 .It Fl X Ar logfile 指定された .Ar logfile に、メーラに出たり入ったり するすべてメッセージに関する情報を記録します。メーラをデバッグする際の 最後の手段としてのみ使ってください。非常に大量の情報があっという間に記録 されます。 .El .Ss オプション .Nm sendmail には、設定することができる多くの処理オプションがあります。 通常、これらのオプションはシステム管理者のみが使います。 オプションは、コマンドラインから .Fl o フラグを使って(短いオプション名で)指定したり、 .Fl O フラグを使って(長いオプション名で)指定したり、 設定ファイルから指定することができます。ここに記述して いるのは部分的なもので、コマンド行から指定する場合に便利な物だけを、 長いオプション名で示しています。完全なリスト(と詳細)は、 .%T "Sendmail Installation and Operation Guide" を参照してください。 オプションには以下の物があります。 .Bl -tag -width Fl .It Li AliasFile= Ns Ar file 別のエイリアスファイルを使います。 .It Li HoldExpensive 接続するのに時間がかかるホストと接続するときは、 すぐに接続せず、リクエストはキューに入れられます。 .It Li CheckpointInterval= Ns Ar N .Nm sendmail が、 .Ar N 個の配送に成功するたびにキューファイルに チェックポイントを設定します(デフォルトは 10 個です)。これによって、 システムのクラッシュによって長いメーリングリストの配送が中断 されたときでも、再開時に同じ人に重複して配送されることを防ぎます。 .ne 1i .It Li DeliveryMode= Ns Ar x 配送モードを .Ar x に設定します。配送モードには .Ql i 対話的(同期的)配送モード、 .Ql b バックグラウンド(非同期的)配送モード、 .Ql q キューモード(実際の配送は、キューが実行されるときに行われる)、 .Ql d 延期モード(データベースの検索(特に DNS や NIS )が行われない以外は .Ql q と同じ)があります。 .It Li ErrorMode= Ns Ar x エラー処理をモード .Ar x に設定します。 .Ql m はエラーメッセージを送り返します。 .Ql w はエラーメッセージを送り手の端末に書き出します (送り手がログインしていなければ、メールを返します)。 .Ql p は、エラーメッセージを端末に表示します(デフォルト)。 .Ql q は、エラーメッセージを捨てます(exit コードだけを返します)。 .Ql e は、BerkNet 用に特別処理をします。 もし、モード .Ql m や .Ql w を使っている場合に、エラーとなったメッセージが エラーメールとして送り返されず、送り手が .Nm sendmail を実行している マシン上のユーザならば、 メッセージのコピーは送り手のホームディレクトリにある .Pa dead.letter に追加されます。 .It Li SaveFromLine メッセージのはじめに .Tn UNIX Ns \-style From 行を残します。 .It Li MaxHopCount= Ar N メールがループしていると判断されない、最大のホップ数を 指定します。 .It Li IgnoreDots `.' だけを含む行をメッセージの終わりとして解釈しません。 .It Li SendMimeErrors エラーメッセージをMIMEフォーマットで送り返します。 設定されていない場合は、DSN (Delivery Status Notification: 配送状況通知) SMTP 拡張は無効になります。 .It Li ConnectionCacheTimeout= Ns Ar timeout コネクションキャッシュの .Ar timeout を設定します。 .It Li ConnectionCacheSize= Ns Ar N コネクションキャッシュのサイズを .Ar N に設定します。 .It Li LogLevel= Ns Ar n ログレベルを .Ar n にします。 .It Li MeToo エイリアスに自分自身が含まれている場合、``me''(送り手自身)にも送ります。 .It Li CheckAliases .Xr newaliases 1 コマンドの実行の際、 エイリアスの右側の項目(エイリアスの値)を有効性をチェックします。 .It Li OldStyleHeaders もしオプションが設定されていれば、メッセージが古いスタイルのヘッダ を持つことがあることを意味します。 このオプションが設定されていなければ、このメッセージが新しい スタイルを持っていることが保証されます(2 つのアドレスの間はスペースのかわり にコンマで区切られます)。このオプションが設定されていると、大抵の場合、 ヘッダのフォーマットを正しく決定するためのアルゴリズムが用いられます。 .It Li QueueDirectory= Ns Ar queuedir キューメッセージを保存するディレクトリを選択します。 .It Li StatusFile= Ns Ar file 指定した名前のファイルに統計情報をセーブします。 .It Li Timeout.queuereturn= Ns Ar time キューのなかの配送されなかったメッセージのタイムアウト時間を設定します。 この時間内に(ホストのダウンなどにより)配送が行われなかったときには、 失敗した旨のメッセージが送り返されます。デフォルトは 5 日です。 .It Li UserDatabaseSpec= Ns Ar userdatabase このオプションが設定されると、情報を送る際にユーザデータ ベースに対する問い合わせが行われます。 この方法をエイリアス機構の補助として使用する事ができます。ただし、 エイリアスはそのホストローカルでのみ有効なので、データベースが意図的に 分散されている場合は使用できません。 .Nm sendmail が .Dv USERDB 付きでコンパイルされていなければ使うことはできません。 .It Li ForkEachJob キューを処理する間、 .Xr fork 2 を行います。メモリが少ないマシン では便利です。 .It Li SevenBitInput 到着するメッセージを 7 ビットにします (8 ビット目は落します)。 .It Li EightBitMode= Ns Ar mode 8 ビットの入力を 7 ビットの宛先へ送る場合の処理方法を .Ar mode に設定します。 処理方法には、 .Li m (mime 化) 7 ビット MIME 形式へ変換、 .Li p (パス) 8 ビットのまま配送(プロトコルには違反します)、 .Li s (厳密) メッセージをバウンス、 があります。 .It Li MinQueueAge= Ns Ar timeout 配送の試行の間、ジョブがキューに蓄積される時間を設定します。 .It Li DefaultCharSet= Ns Ar charset 特に指定されていない場合に、8 ビットのデータである事を示す ラベルとして使用されるデフォルトのキャラクタを設定します。 .It Li DialDelay= Ns Ar sleeptime コネクションの確立が失敗した場合に、再試行までに .Ar sleeptime だけスリープします。オンデマンドでダイアル接続するサイトでの使用に便利です。 .It Li NoRecipientAction= Ns Ar action 受信者ヘッダ (To: Cc: あるいは Bcc:) がない場合の動作を .Ar action に設定します。 .Li none メッセージを変更しない、 .Li add-to To: ヘッダにエンベロープで指定された受信者を加える、 .Li add-apparrently-to Apparrently-To: ヘッダにエンベロープで指定された受信者を加える、 .Li add-bcc 空の Bcc: ヘッダを加える、 .Li add-to-undisclosed .Ql "To: undisclosed-recipients:;" というヘッダを加える、という動作が指定できます。 .It Li MaxDaemonChildren= Ns Ar N 待ち受け SMTP デーモンが同時に動作できる子プロセスの最大数を .Ar N に設定します。 .It Li ConnectionRateThrottle= Ns Ar N SMTP ポートへの 1 秒当りの最大コネクション数を .Ar N に設定します。 .El .Pp エイリアスのなかで最初の文字が `|' で始まるものは、メールの内容をパイプで コマンドに送るものと解釈されます。引数などをつけるために空白文字が 必要な場合はクォートする (" でくくる)必要があります。以下に、例を示します: .Pp .Bd -literal -offset indent -compact msgs: "|/usr/bin/msgs -s" .Ed .Pp エイリアスには、 .Dq :include: Ns Ar filename という文法もあります。 .Nm sendmail は、 メールの受け手のエイリアスとして、指定されたファイルを読みます。 以下に、例を示します: .Pp .Bd -literal -offset indent -compact poets: ":include:/usr/local/lib/poets.list" .Ed .Pp 上記の例の場合は、 .Pa /usr/local/lib/poets.list を読み、`poets' のグループの ためのアドレスリストを作ります。 .Pp .Nm sendmail は、以下に示すような終了コードを返します。これらの コードは、 .Aq Pa sysexits.h に定義されています。 .Bl -tag -width EX_UNAVAILABLE -compact -offset indent .It Dv EX_OK すべてのアドレスについて完全に成功しました。 .It Dv EX_NOUSER ユーザ名が認識できません。 .It Dv EX_UNAVAILABLE 処理に必要なリソースを得ることができません。 .It Dv EX_SYNTAX アドレスに文法的な間違いがあります。 .It Dv EX_SOFTWARE 引数が間違っている等の、内部的なエラーです。 .It Dv EX_OSERR .Dq cannot fork のような、一時的な OS エラーです。 .It Dv EX_NOHOST ホスト名が認識できません。 .It Dv EX_TEMPFAIL メッセージはすぐには送られませんでしたが、 キューには入れられました。 .El .Pp .Nm newaliases というコマンドで実行されると、 .Nm sendmail はエイリアス データベースを再構築します。 .Nm mailq というコマンドで実行されると、 .Nm sendmail はメールキューの内容を表示します。 .Sh 関連ファイル .Pa /etc/sendmail.cf とデーモンプロセス ID ファイルを除き、以下のファイルのパスはすべて .Pa /etc/sendmail.cf 内部で決められています。以下は一例に過ぎません。 .Pp .Bl -tag -width /usr/lib/sendmail.fc -compact .It Pa /etc/aliases エイリアス名の生データ .It Pa /etc/aliases.db エイリアス名のデータベース .It Pa /etc/sendmail.cf 設定ファイル .It Pa /usr/share/misc/sendmail.hf ヘルプファイル .It Pa /var/log/sendmail.st 統計情報ファイル .It Pa /var/spool/mqueue/* テンポラリファイル .El .Sh 関連項目 .Xr mail 1 , .Xr syslog 3 , .Xr aliases 5 , .Xr mailaddr 7 , .Xr mail.local 8 , .Xr rc 8 , .Xr rmail 8 ; .Pp DARPA Internet Request For Comments .%T RFC819 , .%T RFC821 , .%T RFC822 . .Rs .%T "Sendmail \- An Internetwork Mail Router" .%V SMM .%N \&No. 9 .Re .Rs .%T "Sendmail Installation and Operation Guide" .%V SMM .%N \&No. 8 .Re .Sh 歴史 .Nm コマンドは .Bx 4.2 から登場しました。 diff --git a/ja_JP.eucJP/man/man8/swapon.8 b/ja_JP.eucJP/man/man8/swapon.8 index 357e0e84ec..e0106c8c9d 100644 --- a/ja_JP.eucJP/man/man8/swapon.8 +++ b/ja_JP.eucJP/man/man8/swapon.8 @@ -1,93 +1,93 @@ .\" Copyright (c) 1980, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)swapon.8 8.1 (Berkeley) 6/5/93 .\" %Id: swapon.8,v 1.10 1998/08/03 06:35:01 charnier Exp % .\" jpman %Id: swapon.8,v 1.2 1997/05/03 13:45:14 horikawa Stab % .\" .Dd June 5, 1993 .Dt SWAPON 8 .Os BSD 4 .Sh 名称 .Nm swapon .Nd ページングやスワッピングに使用する追加デバイスを指定する .Sh 書式 .Nm swapon .Fl a .Nm swapon .Ar special_file ... .Sh 解説 .Nm は、ページングやスワッピングを行うための追加デバイス指定にて使用します。 システムは、ただ一つのデバイス上にページングやスワッピングして立ち上がるので、 起動時にはただ一つのディスクを要求します。 通常 .Nm は、システムのマルチユーザモードの初期化ファイル .Pa /etc/rc から起動され、全てのスワップデバイスを有効にし、 ページングとスワッピング動作を複数デバイスにインタリーブします。 .Pp 通常は、最初の書式を使用します: .Bl -tag -width indent .It Fl a .Pa /etc/fstab で、``noauto'' オプションが設定されていない、 ``sw'' と指定されているすべてのスワップデバイスを使用可能にします。 .El .Pp 二番目の書式は、システムスワップコンフィギュレーションテーブルに与えるように、 個々のブロックデバイスを指定します。 これにより、システムは指定されたデバイスのみをスワップ空間として利用します。 .Pp .Sh 関連項目 .Xr swapon 2 , .Xr fstab 5 , .Xr init 8 , -.Xr pstat.8 , +.Xr pstat 8 , .Xr rc 8 , .Xr vnconfig 8 .Sh 関連ファイル .Bl -tag -width /dev/[ru][pk]?b -compact .It Pa /dev/[ru][pk]?b 標準のページングデバイス .It Pa /etc/fstab ascii 形式のファイルシステム記述テーブル .El .Sh バグ デバイスへのページングとスワッピングを停止する方法はありません。 ですから、 システム動作中にデバイスのマウントを解除して使用することは不可能です。 .Sh 歴史 .Nm コマンドは .Bx 4.0 から登場しました。