使用 - みる会図書館


検索対象: 月刊 C MAGAZINE 1990年2月号
130件見つかりました。

1. 月刊 C MAGAZINE 1990年2月号

0 「 mation from ( om 「 5 インタの取り扱いやスタックの大 きさについて間題がないか , 再度 プログラムを確認してください Divide e 「「 0 「整数て、 0 除算を行 った場合に発生します。 0 除算を起 こしてもプログラムを中断させな いためには , signal 関数を使って SIGFPE に対する処理ルーチンを 設定しておかなければなりません。 FIoating point e 0 「浮動小数 0 プロ 演算のエラーを意味します ( 表 1 参 照 ) 。これらのエラーを起こしても プログラムを中断させないために は , signal 関数を使って SIGFPE に対する処理ルーチンを設定して おいたり , matherr 関数を定義し ておかなければなりません。 Stack overflow スタックが不足 していることを意味します。関数 中て大きな配列をローカル変数と して定義したり , 再帰呼び出しの ネストが深くなった場合などに発 生します。このエラーは , スタッ クチェックを行うオプションをつ けなければ検出されません。スタ ックチェックを行わずにスタック 不足におちいると , プログラムは おかしな動作をしたり , ハングア ップすることがあります。メモリ モデルを , スモールからラーシに 変更すると動作がおかしくなった , などの現象が発生したら , スタッ クが十分かどうかを検査してくだ NuII pointer assignment スモ ーノレモデルやミディアムモデルて、 , 不正なデータ領域 ( DS : 0000H 以 降の数十バイト ) が破壊されている 場合 , プログラムの終了時に表示 されるメッセージて、す。おもに ポインタが正しく取り扱われてい ない場合に発生します。 Turbo Debugger て、グローバルプレークポ イントとして DS : 0 から数十バイ トを設定し , プログラムを実行し てください 0 printf でファイルに出力した 値が , 同じ書式を使っても scanf で 読み込むことができません。 printf と scanf の書式は似て いますが , まったく同一というわ けて、はありません。たとえば ,printf て、は , float 型や double 型の値に対 して , いずれも、、 % f 〃という指定 て、出力て、きますが , scanf て、は float は、、 % f ク , double はク % If 〃 と両者を区別しなければなりませ ん。 また , 出力するときにそれぞれ の値をスペースて、区切っておかな ければ , 正しく入力されないこと があります。 0 数値演算コプロセッサを搭載 しているかどうか判別するために , 8087 変数を参照していますが , コ プロセッサを搭載していても値が 0 となっているようです。 A- 8087 変数は , 数値演算ライプ ラリがリンクされている場合にの み 0 以外の値を示します。したがっ て , たんに 8087 変数を表示するよ うなプログラムて、は 8087 は 0 のま A まになります。なんらかの数値演 算を行うか , 数学関数を使用すれ ば , 搭載されているコプロセッサ の種類を判別し , 0 ( コプロセッサ 無 ) , 1 ( 8087 ) , 2 ( 80287 ) , 3 ( 80387 ) のいすれかがなえられます。また , 環境変数 87 が定義されている場合 は , 搭載されているコプロセッサ の種類によらす , Y の場合は 1 , N の場合は 0 が与えられます。 0 malloc や realloc でメモリの 確保や再割り当てを行っています が , coreleft が返す未使用メモリ の大きさがおかしいようです。 A coreleft は , すべての未使用 メモリの合計て、はなく , 確保され ているメモリのうちもっとも高い アドレスからメモリの最後 ( スモー ルデータモデルの場合は , スタッ クポインタから 256 バイト引いた位 置 ) まて、の大きさを返します。した がって以前に確保したメモリを解 放しても , それよりも高いアドレ スに別のメモリが確保されている 場合は , coreleft が返す値は変わ りません。 realloc は , 新たなメモリを確保 して以前のメモリの内容を複製し た後に以前のメモリを解放します のて、 , プログラムの先頭て、こうし た関数を使うと , 再割り当てした 大きさ以上に coreleft が返す値が 小さくなる場合があります。 メモリの割り当て , 解放が頻繁 に行われる場合は , メモリ上に解 放されたまま使われずに残ってい る領域があるかもしれませんにれ らの領域は , 新たに確保しようと する大きさがその空き領域よりも 小さければ再利用されます ) 。 cor eleft は , このような部分を計算の 対象としません。 coreleft は , あ くまて、も一度に確保て、きるメモリ の最大値の目安としてご使用くだ さい ( メモリの確保 / 解放の状況に よっては , 確保て、きる最大値と異 なる場合があります ) 。 ムをコンパイルする と , 使用している関数がすべてリ ンク時に Undefinedsymb01 工ラ ーになってしまいます。 A コンパイルオプションを変更 していないかどうか確認してくだ さい。統合環境て、は , 容易に各コ ンパイルオプションを変史するこ とがて、きますが , これらのオプシ ョンのうち , いくつかはかなり重 要な意味をもっています。 たとえば , Option/Compiler/ C0de generation て、表示される メニューのうち Calling conver sion が C て、なく PASCAL になって いると , すべてのシンポルは大文 字て、下線が付加されないという扱 いになります。この場合は , 正し くへッダファイルをインクルード していないと , ライプラリ関数名 が正しく参照て、きなくなり , リン クエラーが発生します。 Generate underbars が Off に なっているときは , シンポルの則 に下線が付加されません。この場 合は , 明示的にライプラリ関数名 の前に下線を付加しなければ , れらの関数を使用することはて、き ません。 lnformation from CompiIer Makers 137

2. 月刊 C MAGAZINE 1990年2月号

環境変数を扱う方法は , 使っているシェ ルの種類 (Bourne Shell か C Shell か ) によ って異なります。 Bourne Shell の場合は = を用いて , $ く変数名〉 = く定義内容〉 の形式ていったんシェル変数を定義してお き , それを環境変数としてほかのコマンド から参照て、きるように export コマンドを ・ (filel , fiIe2 の内容を表示 ) $ export く変数名〉 の形式により設定します。いったん export されると , 環境変数として参照されるよう になります。現在の環境変数を表示させる には printenv コマンドを使用します。 $ LINE=25 $ export LINE $ pri ntenv Fig. 1 1 cat の使用例 ( 1 ) % cat filel This is a sample filel . % cat -n file 1 : This is a sample file2 . This is a sample file2 . This is a sample filel . % cat filel file2 Fig. 12 cat の使用例 2 ・ (filel の内容を表示 ) ・ ( f ⅱ e2 の内容を表示 ) ・ ( 行番号が付加される ) Fig. 13 リダイレクションを用いた cat の使用例 % cat filel file2>file3 % cat file3 This is a sample 川 el . This is a sample file2 . Fig. 14 date の使用例 ・ (filel , f ⅱ e2 の内容を f ⅱ e3 へ出力 ) % date Thu Nov % date -u Wed Nov 1 5 1 5 05 : 28 : 38 JST 20 : 28 : 44 GMT 1 9 8 9 1 9 8 9 ・ ( 現在の時刻 ) ・ ( グリニッジ標準時 ) 大特集・最新 U N Ⅸ考察 大特集最新 UN Ⅸ考察 39 の柔軟性に感激することて、しよう。 その煩わしさをとおりすぎるころには UNIX 心者にはかえって煩わしいかと思いますが , 勝手がかなりきくことて、す。そのため , 初 特長は最後て、も述べましたがユーザの使い 者ともそんなに大差はありません 0UNIX の うか ? ファイル操作に関するコマンドは両 UNIX の雰囲気を味わっていただけたて、しよ UNIX のコマンドを解説してきましたが MS-DOS のコマンドを対比させながら TERM=vt100 SHELL = /bin/csh bin : /bin PATH = . : /usr/local/bin : /usr/ HOME= /usr/member/shoji % printenv % unsetenv LINE の形式て、指定します。 % unsetenv く変数名〉 削除するには unsetenv コマンドを用いて LINE=30 TERM = Vt100 SHELL = /bin/csh bin : /bin PATH = : /usr/local/bin : /usr/ HOME= /usr/member/shoji % printenv % setenv LINE 30 の形式て、指定します。 % setenv く変数名〉く定義内容〉 ドを使います。 setenv は ます。環境変数を登録するには setenv コマン を操作する専用のコマンドを用いて操作し それに対して , C SheIl の場合は環境変数 から参照て、きる環境変数として扱われます。 こうすると , 変数 LINE はほかのコマンド LINE=25 TERM=vt100 SHELL = /bin/csh bin : /bin PATH = . : /usr/local/bin : /usr/ HOME = /usr/member/shoji

3. 月刊 C MAGAZINE 1990年2月号

C 言語フォーラム 恥ず力。しながらドジりました 第 3 回 関数とその引数 ( 中編 ) 岩谷宏 push, POP などのスタック操作命令によ が実行されるとき , 引数は並びの逆順にス C のプログラムては , コンヒ。ュータに実行 って直接に変化するのは , スタックトップ タックに push されます。すなわち , C にお させるべきコードは必ず , なんらかの関数 ける関数への引数渡しは , 引数の値のコピ ( スタックのてつべん = スタックにもっとも の中にあります。したがってその関数の実 ーをスタック上につくることて、す (Fig. 2 参 新しく入った値 ) を指す SP レジスタの値て、 行自体も , ほかの関数の中に記述される関 照 ) 。 数コール文として実行されます。 す。 次に関数コール ( call 命令 ) の前半の動作 push という命令は , データをスタックの 今 , 関数のどこかに、、 funca(), b, c);" によって , リターンアドレスが自動的に push トップに入れます ( Fig. 1 ー 1 ) 。 という文があったら , その箇所て、 funca ( ) と されるのて、 , スタックの姿は Fig. 3 のように POP という命令は , データをスタックのト いう関数をコールする関数コールが行われ , ップから取ります。 Fig. 1 ー 1 の状態から , Fig. 1 なります。 そのとき funca( ) には a, b, c という 3 つの引 関数コール ( call 命令 ) の後半の動作によっ ー 2 となります。 数が渡されます。 てプログラムカウンタ ( 8086 て、は IP レジスタ ) push を繰り返していくとスタックはだん funca( ) カⅳ oid 型の関数て、はなく , 戻り値 ほかのデータ領域などを を返す関数なら , 、、 x=funca(a,b,c);" とい だん大きくなり , う文や , 、、 if(funca(a, b, c ) > 0 ) 〃などの文も 侵す場合もありえます。 pop を繰り返していくとスタックは縮小 ありえます。 し , スタック以降の番地にあるデータを参 コールされる側の関数 funca ( ) の形は , 照してしまう場合もありえます。 ListI のようになっているて、しよう。 c の関数間通信や , 関数内部のローカル変 関数への引数の授受のためのコミュニケ 数利用において , スタックはいわば , 使い ーションチャネルとしては , もつばらスタ 捨ての掲示板みたいなものて、す。そのよう ックというデータ構造が使われます。また , すを , まずコール側から見ていきます。 関数がその内部て、使用するローカル変数用 、、 funca(), b, c);" という関数コール文 のスペースとしてもスタックが使われます。 今日のコンビュータの CPU は , その多く が , メモリ上にスタックを設定し操作て、き るための専用の機構をもっています。 8086 マイクロプロセッサの場合て、すと , それは SS, SP, BP という 3 つのレジスタ , そし て push, POP, pushf, POPf などのスタッ ク操作命令て、す。 8086 のメモリアドレスの指定は , 必ずセ グメント部 , オフセット部という 2 部からな ります。そして SS はセグメント部を指定す るためのレジスタの内のひとつ , そして SP と BP は , セグメント部が SS て、指定されて いることを暗黙の前提として , オフセット 部を指定するレジスタて、す。 116 CMAGAZINE 19 2 GUAG 0 ・ List 1 A ローカル変数を使用する仕様 int funca(int argl, int arg2, intarg3) int workl, work2; / * 以下 , 実行文 * / B ローカル変数を使用しない仕様 int funca(int argl, int arg2, int arg3) / * いきなり , 実行文 * / Fig. 1ー1 ( 低番地 ) SS:SP ( 高番地 ) push AX ( 低番地 ) SP=SP—2 → ( 高番地 ) Fig. 1ー2 pop SP=SP 十 2 → 最初のスタック ( テータが何も入っていない ) AX レジスタの値 ( = 16 ピット テータ ) をスタックに入れると・・・ 16 ピットテータがひとつ 入った状態のスタック AX の値 スタックトップの値を レジスタに入れる 元のスタック ( テータが 何も入っていない )

4. 月刊 C MAGAZINE 1990年2月号

ー 01 コンヾイラ ことになります。また , int → char の変換 は , 上位 8 ビットを切り捨てればよいのて、 , 変換用のコードは必要ありません。 ポインタ型は , どのレジスタに入れるの が適当て、しようか。先ほど考察したように 8086 て、は , AX レジスタはインデクスレジス タとしては使えないのて、 , ポインタを AX レ ジスタに入れるのはよい選択て、はありませ ん。インデクスレジスタとして使用て、きる BX, S 工 , DI, BP の 4 本のレジスタのう ち , BP はフレームボインタとして使用しま す。ポインタ型の結果を入れるレジスタに は , 残る 3 本のレジスタのうち , BX レジス タを使うことにしましよう。 Cm コンパイラて、はサポートしませんが , レジスタ変数には S 工 , D 工を使うことが多い ようて、す。また , CX, DX レジスタは , 補 助的に使用します。たとえば , シフト演算 て、のシフト回数は CX て、指定しなければなり 生成すればよいのかを考えてみましよう。 次に , 関数に対してどのようなコードを 関数のコード ドを出力するかは , 後ほど説明しましよう な木構造をつくり , どのような方針て、コー どのよう コードを生成します。具体的に その木をトラバースしながらオプジェクト まず木をつくり , コンパイラと同じように 式のコード生成については , 第 2 回のミ す。 ませんし , 乗除算て、は DX レジスタを使いま が多いようて、す。 ローカル変数を固定番地に割り当てること に再帰呼び出しをサポートしない言語て、は , ります。これに対して , FORTRAN のよう 実行時にならなければ決まらないことにな パラメータが格納される実際のアドレスは , んて、受け渡しを行います。ローカル変数と ます。また , パラメータもスタック上に積 語て、は , ローカル変数をスタック上にとり PascaI や C のように再帰呼び出しが可能な言 これに対して , グローバル変数は , あら かじめ固定番地に割り当てておきます。っ まり , グローバル変数のアドレスは , コン パイル時に決定していることになりますは り正確にいえば , リンク時に決定されま す ) 。 8086 は , ハードウェアて、スタックをサポ ートしています。「スタックがない CPU なん かあるのか ? 」という疑問もあるて、しよう。 もちろん , 近代的なアーキテクチャのコン ヒ。ュータて、は , スタックがないものはあり ません。しかし , 驚くなかれ IBM の大型コ ンヒ。ュータにはスタックポインタがありま せん。基本的なアーキテクチャは 20 年前か ら変化していないからて、す。 8086 に話を戻しましよう。 8086 は , スタ ックをもっているのて、 , ローカル変数 / パラ メータをハードウェアスタック上におく とにします ( スタックがない CPU て、は , レジ スタを使ってソフトウェアて、スタックを工 ミュレートするようにします ) 。 8086 て、は , スタックポインタ ()P レジスタ ) は , インデ クスレジスタとして使用することはて、きま せん。その代わりに , べースポインタ (BP レジスタ ) があり , これをインデクスレジス タとして使って , ローカル変数 / パラメータ にアクセスする仕組みになっています。 関数呼び出しのプロトコル 関数を呼び出すときに , どのような手順 て、パラメータ , 関数値の受け渡しを行うか を関数呼び出しのプロトコル ( 規約 ) といい List 3 : 4 : 5 : 6 : 7 : 8 : 関数 f00 1 int f00 (int a, char b, char *c) i nt x, y : の内部を詳解 ます。 1 種類の高級言語だけを使ってプログ ラム開発を行う場合には , どのようなプロ トコルが使われているかを意識する必要は ありません。しかし , アセンプラと高級言 語を併用したり , 2 種類以上の高級言語を使 う場合には , 関数呼び出しのプロトコルに ついての具体的な知識が必要になります。 先ほど説明したように , C や Pascal などの プログラミング言語て、は , スタックを使っ てパラメータや関数値の受け渡しを行いま す。このような言語て、の関数呼び出しは , だいたい次のような手順になります。 ①パラメータをスタックに積む ②関数を CALL する ③スタックに積んだパラメータを捨てる C と Pascal て、は , パラメータをスタックに 積む順番 , パラメータを捨てるタイミング が異なります。 Cm て、は , C と同様の関数呼 び出しプロトコルを採用しているのて、 , こて、は , C を中心に話を進めていきましよ まず最初に , 呼び出し側は , 関数に渡す パラメータをスタックにブッシュします。 , こて、 , パラメータが複数あるときには , 「右から左」の順番て、スタックに積みます。 常識的に考えれば「左から右」のほうが自然 て、すが , 「なぜか」 C の場合には右からブッシ ュします。理由は後ほど説明しましよう。 , こて、 , 3 つのパラメータを受け取る関数 f00 ( List1) を呼び出すことを考えてみましよ う。関数 f00 を呼び出す前のスタックの状態 が Fig. 1 ①て、す。ここて、 , パラメータを右か ら左の順て、スタックに積みます。つまり , yacc による C コンバイラブログラミング 79

5. 月刊 C MAGAZINE 1990年2月号

UNIX の デミイスドライバを 解剖する デバイスドライバのコードは , その構造は普通の コードと同じてす。 UNIX て、はドライバは C て、書くの が普通て、す ( 訳注 7 ) 典型的なデバイスドライバて、は , まず冒頭部て、い くつかのシステムヘッダファイルを #include し , そ してデバイスのレジスタのアドレスや内容を # define します。また , そのドライバのグローバル変数も宣 言します。 UNIX のデバイスドライバのほとんどて、 # include されるファイルは以下のとおりて、す。 : バッフアのヘッダ部の情報の定義 : 端末と clist 構造体関連の定義 sys/user. h : user 領域の定義 ( 訳注 8 ) の定義 : ディレクトリ構造に関するパラメータ カーネルのノヾラメータの定義 sys/buf. h sys/tty. h sys/di r. h / * 受信レジスタ * / #define RRDATA (UART BASE 十 0 ) / * 架空のメモリマッブド I/O アドレス * / #define UART BASE Oxffffff3a / * 架空の UART のレジスタアドレスの定義 * / ジスタを次のように #define するてしよう。 たとえば端末用の UART デバイスの場合なら , レ す値も , 同じく #define しておきます。 トアドレスのことて、す。コマンドやステータスを表 やコマンドレジスタなどが割り当てられているポー スタのアドレスとはデバイスのステータスレジスタ す。キャラクタ型のデバイスの場合 , デバイスレジ すが , これらは当然ながらデバイスによって違いま バイスドライバ ( のソースの ) 冒頭部分て # define しま デバイスのレジスタは , そのアドレスや内容をデ て buf. h はプロック型のドライバて、は必ず使います。 tty. h はキャラクタ型のドライバて、使います。そし #define RTDATA (UART BASE 十 1 ) / * 送信レジスタ * / #define RSTATS (UART BASE 十 2 ) / * ステータスレジスタ ( リード時 ) * / #define RCNTRL (UART BASE 十 2 ) / * 制御レジスタ ( 同上のライト時 ) * / / * ステータスレジスタの内容の定義 * / #define SRRDY OXOI / * 受信データレディ * / #define STRDY 0X02 / * 送信レディ * / #define SPERR Ox08 / * パリティエラー * / #define SCTOS 0X40 / * クリアツーセンド * / デバイスドライバが実行する機能は , デバイスの 種類によって違います。どのデバイスにも open や close のルーチンがあり , これがデバイスの I / O の実行を許 可します。 open ルーチンは , デバイスの指定が有効 て、あることや , デバイスがレディて、あることをチェ ックし , それからデバイスを初期化します。 open ル ーチンはプロセスがそのデバイスを使用するたびに 実行されます ( 訳注 9 ) 以下に示す open ルーチンは , td と名づけた一般的 VOid tdopen(int device , int flag) な端末デバイス用のものて、す。 if(UNMODEM(device) > = NTDEVS) { / * デバイス番号をチェック * / / * ローカル変数の宣言 ( ここて、は細部を省略 ) * / チェック * / / * それをオーバライドてきるスーパユーザかを 使用中ならば * / / * デバイスが使用中かチェック , return ; seterror(ENX 工 0); 主 1 ] こ存じのように MS ー DO デ バイスドライバは諺朱なヘッ タ郡などを要し , このためア センプリ言語て書く部分力 須となり , 全体を高級言語で 書くことは困難です。 主 8 ] プロセスのデータのうち , ス ワッヒ。ング操作などのために 膨要なのでメモリに常駐しな ければならない部分を p 「 0 頁 域プロセスがメモリ上て生 きているときだけ要な部分 ( = ディスクへスワッヒ。ングさ れてもよし郵分 ) を use 或と 呼びます。デバイスドライバ の一一 ) ルーチンが use 罠或 のデータを参照します。 主 9 ] OP en, CIOS 師 ) ルーチンは必 須でまありません。利用権を 厳密に里する膨のない単 純なデバイス用のドライバで は省第できます。 Device 0 「 i 「 5 for UNIX UN Ⅸのデノヾイスドライノヾ 21

6. 月刊 C MAGAZINE 1990年2月号

三田典玄の 実践 C プログラマ 養成講座 第⑤回日 S ー 232C の制御 行のこの種のマニュアルは部品会社が普通 10 TREM. RESMAKEFILE に使われ はただて、お客に配るものなのて、 , あまり手 るリンカ応答ファイル に入らないかもしれない パソコンそのもののこういった資 以上の . C ファイルと . ASM ファイルを 9 の 料はメーカーによっては社外秘扱いて、一般 MAKEFILE て、アセンプル / コンパイル / リ デバイスドライバ本体 1 S 工 0 . C には出してくれないものも多い。仮に出て ンクするとサンプルの通信ソフトがて、きあ タイマ割り込みサービ 2 SIGALM . C いたとしてもプログラムを組むのに必要な こから先は各自の好みに応じてプ がる。 スノレーチン 肝心な部分が書かれていなかったり , ある ログラムを拡張してみるとよい RS ー 232C の割り込みサ 3 RSINT. ASM べき表などの類が不足していたり , とにか ービスルーチン く不親切このうえない。アメリカの IBM-PC 4 SIGALMS. ASM タイマ割り込みサービ とそのコンパチて、あれば , まずメーカーが スノレーチン そんな意地悪をユーザにすることはないの アセンプラて、の CLI , 5 CLI. ASM て、安心て、きる。 このプログラムはハードウェアをやった STI 命令を C 言語て、呼 私もこのプログラムをつくるにあたって ことがないとたいへん難しく見えるはずて、 べるようにしたもの はメーカーに関係する某所からいろいろな ある。このプログラムを読む ( 書く ) ために RS ー 232C ライプラリの 情報をウラから項くこともあった , 必要な資料の一部は , ソフトウェア関係の 利用のためのヘッダフ ことをここに書いておこう。とにかくそう 資料だけて、はないのて、 , 書店て、は売ってい ァイル いった「政治カ ( ? ) 」もときには技術者には ないものもある。 タイマ割り込みライプ 7 SIGALM . H 必要になることも多いのだ。 たとえばここて、使っているパソコン内部 ラリの利用のためのヘ の IC チップそのものの資料は必須だが , ッダファイル 般の書店て、はそのマニュアルは手に入らな ライプラリ使用方法を いのが普通て、ある。 知るためのサンプルプ チップのマニュアルは , 東京て、あれば秋 ロクヾラム C 言語とアセンプラルーチンを組み合わせ 葉原の部品屋さんにマニュアルをコヒ。ーし 9 MAKEFILE 以上のルーチンをまと る場合は , 必ずその C 言語特有のクセをきち てもらうか , あるいはマニュアルそのもの める MS-MAKE 用の んと認識しなければならない。そのため , を買ってくるとよい。しかし , メーカー発 MAKEFILE プログラムは 1 行 1 行慎重に行う必要のある マあ のはもちろんのこと , アセンプラとのリン ク時にはコンパイルスイッチなどソースリ スト上に現れない問題があまたあることも 知らなければならない 私は今回のアセンプラルーチンを C 言語コ ンパイラに書かせた。この方法はけっこう 有効て、ある。つまり , 今回使った MS - C て、は 「 -Fa 」というスイッチがあり , これを使って まず C 言語のプログラムの簡単なものを書 き , それをコンパイルし , アセンプラソー スリストを得るわけて、ある。そしてそのア センプラルーチンを書き換えて , 必要なア センプラブログラムを書くわけて、ある。 の方法を使うと , 8086 系 CPU などて、はとく プログラムファイルの内容 ハードウェアに関連する プログラムに必要な資料 6 S 工 0 . H メーカーの C 言語フログラム 特有の間題とアセンプラ 8 TERM. C ◆・ ク 手レ 7 け 106 CMAGAZINE 19 2

7. 月刊 C MAGAZINE 1990年2月号

大特集・最新 UN Ⅸ考察 示しています。このように , 複数のファイ MS-DOS の TYPE コマンドと同じ動作をし プレイに連続して表示されます。このよう ルをディレクトリの下にコヒ。ーすることが ます。 cat の 2 番目の使用例として Fig. 12 を に複数のファイルを指定した使い方は , て、きます。 MS-DOS て、はワイルドカード 見てください TYPE て、はて、きません。 cat の本来の機能は ( * , ? ) を使ってディレクトリの下に複数の % cat くファイル名〉 ファイルを連結して標準出力 ( UNIX て、はデ ファイルをコヒ。ーて、きますが , 複数のファ と使用するとファイルはその順番にディス イスプレイに割り当てられています ) に出力 イル名を指定して一度にディレクトリの下 Fig. 7 cp の使用例 ( 1 ) にコヒ。ーはて、きません。 data filel 次にファイル名の変更と移動を行うコマ ンド mv を説明します。書式は次のとおりて、 % mv くファイル名〉くファイル名〉 % mv くファイル名〉・・・くディレクトリ名〉 実際のオペレーション例を Fig. 9 に示しま す。 MS ー DOS て、はファイル名の変更をする には REN コマンド , ディレクトリ名の変更 をするには RENDIR コマンドを用います が , ファイルを別のディレクトリに移すた めのコマンドは用意されていません。 % cp filel file2 data filel file2 ・ (filel を f ⅱ e2 にコピー ) Fig. 8 cp の使用例 2 data/ filel fiIe2 ・・ ( ふたつのファイル f ⅱ el , f ⅱ e2 をティレクトリ data の下にコピー ) % cp filel file2 data % data datal data2 data3 filel file2 ファイルの削除は rm コマンドて、行いま % rm くオプション〉くファイル名〉・ rm は引数のファイルのモードが書き込み 禁止になっている場合 , 削除の確認を求め てきます。このとき , y を入力すればその ままファイルの削除を実行します。また , 強制的に rm を実行したいときはオプション f を使用します。逆に , 確認を行ってから rm を実行したいときには -i を使用します。 また , オプション r により , 指定されたディ レクトリ以下のファイルをディレクトリも 含めて削除て、きる再帰的なファイルの削除 も可能て、す。オペレーション例を Fig. 10 に 示します。 Fig. 9 mv の使用例 す。 % ヨ total 1 5 2 shOji drwx 「—X 「 -X 1 shOji 1 shOji 384 Nov 16 04 : 17 data 1 1 9 58 N ov 1 6 02 : 4 5 file 1 2 6 N ov 1 3 1 9 : 41 file 2 % cat file2 This is a sample fiIe2 ( ファイル名を変更する ) % mv 川 e2 new. file . 2 % ヨ total 1 5 2 shOji drwx 「—xr—x 1 shoji 1 shOji 384 Nov 16 04 : 17 data 1 1 9 58 N ov 1 6 02 : 45 file 1 2 6 N ov 1 3 1 9 : 41 new. file. 2 % cat new. file . 2 This is a sample file2 . ・ ( ファイル名が変更されている ) ・ ( ティレクトリ data にファイルを移動 ) アイ ) ーコマンド。 = cat , こて、 cat コマンドについて解説しましょ う。まず Fig. 11 を見てください % cat くファイル名〉 と入力するとそのファイルの内容を表示し ます。このように使用するかぎりて、は cat は % mv filel new. file. 2 data data/ % data filel new. file. 2 ・ ( ファイルが移動した ) 大特集最新 IJN Ⅸ考察 37

8. 月刊 C MAGAZINE 1990年2月号

Device 主 16 ] 上記のことはたとえば , かな り大きい文字バッフアを備え ている UART ならば , 1 文字の I/O ごとに割明を信号させ るよりも , バッフアに文字が 満杯になったころをみはから って ( = みはからえるタイミン クで ) 定期的にポーリングした ほうが , CP まはる力に楽がで きる , という意味です。ただ し , 割り込み要求の要因 を多様に胸できるなどの , ある程度のインテリジェント 皀をもった冖 ) UART を吏 うほうが , さらに有利かもし れません。 UNI 肋蕘りなオペレーティ ングシステムであるとさ れ世界中て・急速に普及した 最大の理由が , この記事で述 べられているような I/O インタ フェイスび←化です。里 酌なターゲットカ舸であ 統一的に open は read(l write()ta•どで I/O ができる , という UN Ⅸの l/ 瞬皀を支え る中心なソフトウェアがデ バイスドライバです。この 相手カヨ可で - きょ I/O イ ンタフェイスを使用できると いう巒皀が , UNIX System V R 引 e a s e 3 . 0 以降は STREAMS という機構によっ て , キャラクタ I/O を行うネッ トワークハードウェアおよび 通信プロトコルなどの多生 に対しても適用できるように なりました。このには , 複数の I/O 源を参照し膨要な ら ( に同期で / 0 を実行できる ための , P011 ( ) というシステ ムコールが提供されています。 明主 15 ] 一定時間カ軽っと , そのデバ イスの intr ルーチンを強齣 に実行する , なと・び里をし ます。 24 CMAGAZINE 19 2 0 新しい の使用 デスドアパ きる割り込みの喪失や , デバイスの動作不能が挙げ 正しく書けているとすると ) , 割り込みの保留中に起 デバイスドライバに共通する間題として ( コードは こしてしまうてしよう。 てきますが , 注意しないと暴走やハングアップを起 を使うと変数やアドレスの値を直接に変えることも 中にカーネルのメモリを調べることがてきます。 adb というデバッガを使って , デバイスドライバの実行 デバイスをスーパューザからテストするときは , adb 使って , ドライバの動作をトレースすると楽てす。 り , コンソールなどほかのデバイスへの getchar() を デバイスドライバのデバッグは , printf ( ) を使った こともたいせってす。 は必要な措置てす。また , スタックを最少に抑える し clist などのバッフアのデータの破壊を防ぐために 割り込みの保留は最少に抑えるべきて、すが , しか て浮動小数点演算を行ってはいけません。 に sleep( ) や seterror( ) を使ってはいけません。そし ことがふたつあります。割り込みの保留中 デバイスドライバのプログラミングて , やっては バをつくるときの腕前とされます ( 訳注 14 ) け少なくしてデバッグすることが , デバイスドライ なります。したがって , リプートの回数をて、きるだ ドライバの変更は , この全工程を繰り返すことに トします。 にシステムをリプートしてデバイスドライバをテス ンクし , それを /devi•ィレクトリにおきます。最後 次にドライバ全体をコンパイルしてカーネルとリ ルーチンなど ) のアドレスを登録します ( 訳注 13 ) ルーチン ) と , そのほかのルーチン ( そのデバイスの open るための配列に割り込みハンドラ ( そのデバイスの intr えます。まず , デバイスのエントリポイントを記述す ドライバは一連の手順を踏んて、 UNIX システムに加 これを防ぐために , ほとんどのデバイスド られます。デバイスがハングしてしまう , という問 題てす。 ライバにはタイムアウトルーチンが含まれています ( 訳注 15 ) spl.. ( ) 関数を適切に使うことによって , デバッグ の間にこれらの問題を突き止めることがて、きます。 典型的なケースとしては , 割り込みが起こるはずの 一定時間が過ぎても起こらなかったら , デ ときに バイスを直接にチェックします。割り込みが失われ るときは , コードてそれをシミュレートて、きます。 プロック型のデバイスドライバは一般的に , 割り 込みを使う書き方をします。しかし , デバイスドラ イバがデバイスのステータスを頻繁にチェックしな ければならないようなキャラクタ型のデバイスには , ポーリングを使うプログラマが多くなっています。 割り込みを待つ必要はなくなりますが , CPU のサイ クルは使います。ポーリングは大容量の外部記憶装 置などには向いていませんが , キャラクタ型のデバ イスには有利な場合があります。 デバイスドライバを割り込み型て、書くと , 19200 ポ ーの端末は毎秒約 1920 回の割り込みを起こし , オペ レーティングシステムはこれだけの回数割り込みを 受けてデバイスドライバに再入しなければならない ことになります。割り込みルーチンをポーリングル ーチンに置き換えれば , 一定数の文字を保持するバ ッフアを使うことによって , CPU を要求する頻度が 大幅に減ります。リアルタイムのデバイスもポーリ ングを使用すれば , 割り込みて℃ PU を酷使すること がないのて、 , 有利だといえます ( 訳注 16 ) デバイスドライバは , 書くのは難しくありません が , デバッグは困難になりがちてす。とくに ほか のプロセスやデバイスを妨害しないための注意が必 要て、す。しかしデバイスドライバが正しく動いたと きの満足感は , 普通のプログラムが完成したときと はひと味違って , 格別なものがあります。 Tim Parker 氏は fCOMPUTER LANGUAGE 』誌 の UN Ⅸ担当編集者て、す。

9. 月刊 C MAGAZINE 1990年2月号

ティスク内 - 、 の お知らせ コヒ。ーしたドライプて、次のように実行し します。 あるディスクを用意し , turbo. exe をコヒ。ー 使用可能ディスク容量が 195K バイト以上 とユーティリティ Tu 市 C 修正差分ファイル ' 90 年 2 月号特別付録 ( 5 〃 1.2M 15 セクタ / トラックフォーマット ) には , 次のプログ ラムが収められています。 ① PVCS Version 2.1 c サンプル版 pvcs. exe ( 自動解凍圧縮ファイル ) ② Tu 「 boc 修正差分ファイル とユーティリティ turbo. exe ( 自動解凍圧縮ファイル ) ③ D-SheII サプセット版 dshs. exe ( 自動解凍圧縮ファイル ) ④本誌掲載プログラム Ycmaga くディレクトリ〉 ⑤付録ディスクの説明 readme ディスクの容量の関係て、 , ① ~ ③のプロ グラムは圧縮してあります。圧縮は ' 89 年 11 月号付録の LHarc を使って行いました ( な お , 解凍に LHarc は必要ありません ) 。各サ プディレクトリにも readme を設けましたの て、そちらも参照してください。 PVCS Version2.Ic サンプル版 使用可能ディスク容量が 850K バイト以上 のディスクを用意し , pvcs. exe コヒ。ーをし ます。 コピーしたドライプて次のように実行し てください pvcs これて、 PVCS Version 2. lc サンプル版 が解凍されます。 PVCS とは , プログラムや 文書ファイルなどのバージョン , リビジョ ンを管理するプログラムてす。 解凍後にてきるファイル readme. doc, pvcs. doc を読んていただき , それらの指示 にしたがって demo. bat を起動すると , PV CS とは何かを体験てきます。 140 CMAGAZINE 19 2 てください turbo /x 固 ( x は小文字 ) これて、 Turbo シリーズの修正差分ファイル とユーティリティが解凍されます。解凍後 にて、きる \ tcupc というディレクトリに Tur boC 修正差分ファイル , \ glio というディレ クトリに TurboC 2.0 用の GLIO ライプラリ て、が収録されています。 tcupc. doc, read me. doc,glio. doc を一読のうえご使用くだ さい D ・ SheII サプセット版 D-SheII とは , MS-DOS ユーザに C-shell ライクな機能を使っていただくために収録 したコマンドインタブリタ型シェルて、す。 使用可能ディスク容量が 490K バイト以上 のディスクを用意し , dshs. exe をコヒ。ーし ます。 コヒ。ーしたドライプて、次のように実行し 本誌掲載プログラム サプディレクトリ \ cmaga の下に記事別の ディレクトリがあり , それぞれの記事に関 するプログラムを収めてあります。 : ' 90 年 1 月号特集未収録リスト : インフォメーション CZATU : C 言語雑学講座 STARTC : C 言語入門講座 OUYOU : 応用 C 言語 : 実践プログラマ養成講座 : C 十十プログラミング CMSIXE : MS-DOS プログラミング入門 : C コンパイラブログラミング : PDS 最新レポート T9001S INFO MITA SCCP YACCP PDS クに収録しました。本号て、は次のものを収 承諾を得られたものについて , 付録ディス レポート』て、紹介したソフトのうち作者の 読者の方々の強い要望により , 『 PDS 最新 PDS 最新レポート readme を参照してください 各々のプログラムの使い方は関連記事と 録してあります。 YpdsYundI ・ YpdsYsnow ・ [ お詫び ] ( 11 月号掲載 ) ・・ undel ・・・ snowfall ( 1 月号掲載 ) てください dshs /x 固 ( x は小文字 ) これて、 D ー She Ⅱサプセット版が解凍されま す 0Ydsh というディレクトリに D ー Shell 本体 (dsh. exe) とそのマニュアル (context. man, ch* . man) が , \ uty というディレク トリに D ー SheII のユーティリティ ( * . exe) と そのマニュアル ( * . man) が収録されていま す。マニュアルをよくお読みになってから ご使用ください。 ' 90 年 1 月号付録ディスクの TurboC 修正差分フ ァイルに BUPDATE. EXE が収録されていませ んて、した。お詫び申し上げます。ドキュメント ファイルには「 BUPDATE. EXE は , 前回使用 したものと仕様が異なります」と書かれていま すが , ' 89 年 12 月号に収録されている BUP DATE. EXE を流用てきますのてそちらをご利 用ください。 12 月号の付録ディスクをお持ちて ない方は株マイクロソフトウェアアソシェイツ まてご連絡ください ( TEL03 ( 486 ) 1403 ) 。

10. 月刊 C MAGAZINE 1990年2月号

けて、す。 Kernighan たぶんそうだと思います。私 たちは , そうしたマシンからより多くのこ とを期待て、きるようになるて、しよう。それ ほど効率よくない形にせよ , 自分がマシン を使って何をしたいのかをより明確にし , 今後数年間で C 言語の特長はどのように それに対してマシンがより多くの資源を投 なっていくと思いますか。 C 十十カ℃に取っ 入して仕事を成し遂げてくれることを期待 て代わるようになるのでしようか , それと て、きるようになるわけて、す。それはちょう も両者が並存して進化していくのでしよう ど , 現在私たちがアセンプリ言語て、はなく 咼級言語を使用したり , スプレッドシート Kernighan いい質問だと思います。私の 予想て、は , C には今後しばらくの間あまり大 などの非常にハイレベルなツールを用いて きな変化はないと思います。 C 言語の進化は いるようなものて、 , マシンはひたすら私た ANSI C の段階てひと休みといった感があり ちのために仕事をしようと精を出してくれ こからさらに進化して昇り調子に ているわけて、す。私たちはこうしたトレー ます。 なるのか , 後退するのか , あるいは現状の ドオフを今後も続けていくと思います。な ぜなら , 人間が費やす時間はマシンの時間 ままなのか , まだわかりません。しかし私 よりもはるかに貴重だからて、す。マシンが の考えて、は , C は ANSI C の形て、ここしばら くの間かなり安定しているのて、はないかと さらに強力になっていけば , 人間が費やす 時間を減らすために , マシンをより多くの 思います。いくっかのちょっとした新しい 時間使うようになるて、しよう。 特長が C につけ加えられていますから , それ 私たちがすて、にこうした方向に向かって らの経験を通して今後何年かの間にさらに かなり前進してきたことは明らかて、す。今 洗練されたものになる可能性はあるて、しょ て、は , マシンの時間ということ自体がほと う。今後登場してくる新しいハードウェア て、きます。しかしコードをアセンプリ言語 んど意味をなさなくなっています。たとえ アーキテクチャを考慮に入れるには , さら に埋め込んて、しまっていると , そうした改 ば , 私はここて、仕をしていますが , 家に に追加されなければならないものもあると 良を利用することはて、きません。効率とい はおそらくスイッチを入れることさえない 思います。たとえば , near ポインタや far ポ うことが前要て、はないということて、はあり パソコンがあります。実際 , 多くのコンヒ。 インタが本当に必要なのかどうか。 ませんが , ほとんどの場合 , それは二義的 ュータが使われずに設置されており , 私た C と C 十十が , 可能なかぎり互換性を保ち な意味あいしかもっていないのて、す。 ちは , 経済的にみて余分のキャパシティを つつ並存して進化するという関係になれば もつだけの価値があるのだと考えるように いいと願っています。両者は同じ言語て、は IOOMIPS マシンと なっています。私たちは , そうした余分な ありません。 C は C 十十の固有のサプセット フログラム羸 マシンのキャパシティの利用方法を考え続 て、はありませんが , 非常に近いことはたし けていくと思いますし , そうすることによ かて、す。プログラマが C から C 十十へ移行す 効率という点ですが , 近い将来 IOOMIPS って私たちはより仕がやりやすくなると ることはまったく間題ありません。ふたっ ( IMIPS は 1 秒当たり 100 万回の命令を行うこ Ⅲいます。こうした方向にさらに進んて、い の言語がて、きるだけ多く , て、きるだけ長く と・編注 ) の性能をもつディスクトップが登 けば , 私たちはマシンに対してよりレベル 互換性を維持し続けてほしいと思います。 場するだろうといわれています。そうなる の高い次兀て、「この仕事をしたいんだ」と指 c が C 十十の固有のサプセットになる可 と , プログラミング言語にとってどのよう 示することがて、き , マシンのほうて、も私た 能性はあるのですか。そうすれば , C でコン な属性が望ましいかという点に関する人々 ちの希望どおりにその仕事を成し遂げるた パイルされるものはすべて , C 十十でもコン の認識も , 変わってくるのでしようか。 めに , より多くの仕事をするようになるわ パイルされることになりますか。 今後の C の方向 Brian W. Kernighan C 言語の立役者 9