コマンド - みる会図書館


検索対象: UNIX MAGAZINE 1994年9月号
81件見つかりました。

1. UNIX MAGAZINE 1994年9月号

LJN Ⅸへの招待⑩ % make texprint ますターゲット latex ( 9 ~ 10 行目で定を実行し、次 にターゲット print ( 12 ~ 13 行目で定義 ) を実行します。 そして、これらの 2 っカ鮗了したのち、ターゲット tex- print に関連した 7 行目の UNIX コマンド (echo) を実 行します。 一括処理することも可能です。ー勺な Makefi1e では、 し、 (texprint のようなターゲットを用意することで ) に関連した複数の作業をそれぞれ単独でも処理できます このような Makefi1e を作成しておけば、 1 つの仕事 更新日時の比較 トを実行できるようにすることがよくあります。 と実行して、 Makefi1e に記載されたすべてのターゲッ % make a11 all という名前のターゲットを設けておき、 孑当日識として ) について若干触れておきましよう。 機能の説明に入る前に、 ( 図 6 の Makefi1e を読む則 になります。 ると、これまでの説明とはちょっと違った動きをするよう ディレクトリにターゲット名と同し名前のファイルがあ 力な機能か利用できます。 make は、実行時のカレント したファイルの名前を使うと、 make のもったいへん強 してきました。ところで、このターゲットに仕事に関連 こまでは、ターゲットを 1 つの仕事にたとえて説明 く整形された文章カ喞刷されます。 ファイルを指定して lpr ー d コマンドを実行すると、美し という名前のファイルに出力結果が作成されます。 X X . dvi というソースファイルをコンパイルすると、 X X . t ex いでは、 この ターゲット Main. tex には、関連するターゲットはあり という 3 つのターゲットカ症義されています。このうち、 図 6 の Makefi1e では、 Main. tex 、 Main. dvi 、 print 190 make 能ー更新日時の比較 % cat -n Makefi1e 図 6 1 2 3 4 5 6 7 8 9 Main . tex Vi Main . tex Main . dvi : Main . tex jlatex Main. tex print : Main. dvi ech0 lpr —d Main. dvi touch print ません。したがって、このターゲットを実行した場合、た Vi . tex んに UNIX コマンド、 % make Main. dvi までの説明では、ユーサーがコマンド、 れには関連するターゲット Main. tex があります。 か夫行されます。次にターゲット Main. dvi ですが、 UNIX MAGAZINE 1994.9 make の説明当耐里しないのでここでは無視してください。 7 このほかに、 Main. aux 、 Main. log というファイルもイ友されますが、 を実行しています。画面には、 % make Main. dvi りました 7 。このあとすぐに マンドで処理した結果作成された Main. dvi ができあが カレントディレクトリには Main. t ex 、それを latex コ Main. tex が実行され make か了します。この結果、 ゲット Main. dvi に関連した UNIX コマンドの jlatex 集することになります。ⅵコマンドカ鮗了すると、ター 最初にⅵが実行され、ユーサーは Main. tex を編 を進めます。実行して石してみましよう ( 図 7 ) 。 いうファイルがなければ、 make はたしかに上の順て、作業 make 夫行時のカレントディレクトリに Main. tex と ンド、 jlatex Main. tex か夫行される。 ・次に、ターゲット Main. dvi に関連した UNIX コマ UNIX コマンドⅵ Main. tex か夫行される ) 。 ・ます、ターゲット Main. tex を実行するにれにより、 うな動きをすることになります。 を入力してこのターゲットを実行すると、 make は次のよ

2. UNIX MAGAZINE 1994年9月号

くタブ文字 > UNIX のコマンド ターゲットとは、たとえていえは 1 つの仕事 ( あるい は目的 ) のようなものです。これには、ユーサーか野みの 名前を付けられます。次行には、行頭にタブ文字を 1 つ 入力し 4 、ターゲット ( イ士事 ) を達成するための UNIX コ マンドを記します。 たとえは、ⅵを使っていくっかのファイルを編集する 仕事があるとしましよう。ターゲット名は ( イ士事の内容に 沿ったもののほうが分かりやすいので ) 、 edit とします。 この場合、 Makefi1e は、次のように言当します。 % cat Makefi1e edit : vi Main. tex chapl . tex chap2. tex % make vi Main. tex chapl . tex chap2. tex make コマンドを実行すると、ターゲットを処理する ためのコマンド行が画面に表示され、コマンド実行が開 始されます。そして、コマンド実行 ( 例では (i) カ鮗る と make カ鮗了します。 Makefi1e 中に仕事とそれを処理するためのコマンド をし、 make を実行すると、ある決まった仕事を ( コ マンドやその対象ファイルを間違えることなく ) 確実に実 施できます。ただ、この機能だけであればシェル・プロ グラムの利用となんら変わりはないような気がします。 では、次はどうでしようか ? Makefi1e 中には、ター ゲットと UNIX コマンドの塊を複己できます。具体 的には、次のような形式で Makefi1e を作成します。 UNIX コマンド ターケットル : UNIX コマンド UNIX コマンド 缸 X コマンド ターケット 3 : ターケット 2 : UNIX MAGAZINE 1994.9 4 タフ・文字以外を用いると、実御にエラーとなるので愚してください。 IJN Ⅸへの招待⑩ この形式では、ターゲットの名前はそれぞれ異なった ものでなければなりません。これを用いれば、ある 1 つ のイ乍業に関連した複数の仕事を 1 つの Makefi1e 中に定 義できます。 たとえば、すこし量が多いレポートを作るので、レポー トは複数のファイルに分割して記述することにしましょ う。また、それらのファイルについては、以下の操作が 必要だと仮定します。 ・編集 清書 ・清書結果の印刷 ・電子メールでの提出 これらの仕事名 ( ターゲットの名前 ) を edit 、 latex 、 print 、 mail として、それを処理する UNIX コマンドは、 vi 、 jlatex 、 lpr 、 tar 十 compress 十 uuencode 十 mail を 使うことにしましよう。これらを M efile に言当する と、図 4 のようになります。 この図のように、複数の仕事を 1 つの Makefi1e 中 に定義した場合は、 make を実行すると最初のターゲッ ト ( 例では edit) かま行されることになっています ( その はかのターゲットは実行されません ) 。はかのターゲット を実行したい場合は、ユーサーが make コマンドの引数 でターゲットを指定します。たとえば、次のようになり ます。 % make latex % make print % make mai 1 この例では、それぞれターゲット latex 、 print 、 mail のみが実行されます。このような Makefi1e を作成し、 すべての関連竹業を make の実行のみて処理できるよう に準備しておけは、必要なファイルをうつかり編集し忘 れたり、メールし忘れたりなどのつまらないミスが減る でしよう。また、 make X X という簡単な入力のみで必要なコマンドかま行できます。 このようなことは、もちろんシェル・プログラムでも 可能です。しかし、シェル・プログラムて独立して実行 187

3. UNIX MAGAZINE 1994年9月号

LJN Ⅸへの招待 坂本文 make シェル・プロクラムと make 1 ファイル名のうち、、、 . " 以降の部分。たとえば、 a. txt では txt がサ 名の変更をおこなっています。どちらを使っても、目的 ド for—do—done と mv コマンドを使って、ファイル の言己斷彡式は若異なりますか ) Bourne シェルのコマン ファイルに手順を言当しています。いすれも ( ファイル ラムは shellprog 、 make は Makefi1e という名則の ムと make を用いておこなっています。シェル・プログ フィックス 1 を tex に変更するイ乍業を、シェル・プログラ リのすべての . txt ファイル (* . txt) を対象に、そのサ 図 1 を見てください。 こでは、カレントディレクト と入力します。 % make コマンド群を実行するには、たんに、 必要なコマンド群を決められた規則に従って言当します。 いは makefile) という名前のファイルを作成し、それに make では、カレントディレクトリに M efile ( ある れは make のもつ機能のほんの一部です ) 。 なシェル・プログラムに似た機能があります ( ただし、そ だけで一漣の作業か、おこなえます。 make にも、そのよう イルに言己し、そのファイル名 ( コマンド名 ) を入力する シェル・プログラムでは、いくつかのコマンドをファ なツール make をとりあげます。 していただけたでしようか ? 今回からは癶分一新、新た を紹介しましたが、その利便性や強力な機能を十分に理解 先月まで、数回にわたり Bourne シェル・プログラム 184 フィックスです。 の作業がおこなえるのが分かります。 この例は、シェル・プログラムと make カ祠じような 目的に利用できることを示すためのものです。 make 本来 の機能を紹介するには、あまりふさわしいものではありま せん。 次に、シェル・プログラムと make の違いをみていき ましよう。シェルは、ファイル ( シェル・プログラム ) に 記された内容を忠実に実行します。ところが make は、 Makefi1e に記述された内容すべてを実行するとはかぎ りません。 make は、ある判断基準をもち、それにもとづ いてファイルに記述されたコマンドを実行すべきかどう かを判断し、必要な場合にだけコマンドを実行します。 こが、シェル・プログラムと make の大きな相適点です。 例として、図 1 に示したファイル名の変更手続きを、次 のように孑長してみましよう。 1.. txt ファイルに対応する . tex ファイルがない場合 は、無条件に . txt ファイルの名前を . tex に変更す る。 2.. txt ファイルと . tex ファイルの双方がある場合は、 更新日時を上は交する。 3.2 において、 . txt ファイルが . tex ファイルよりも更 新日時カ噺しければ、 . txt ファイルを . tex ファイル という名前に変更する (. tex ファイルのはうが更薪日 時カ斤しければ、名前を変更しない ) 。 図 2 は、この機能を実現したシェル・プログラム re- name とその実行の様子です。ファイル名を変更するた めのコマンドはもちろんのこと、 . tex ファイルの存チ ェックや . txt と . tex の更新日時のうち、どちらカ斤し いかの判定などもプログラム中に記述しなければなりま UNIX MAGAZINE 1994.9

4. UNIX MAGAZINE 1994年9月号

図 7 make 実行のオ好 % make Main. dvi Main . aux % ls —t jlatex Main Vi Main . tex % make Main . dvi Makefi1e % ls Main . dvi . t e x 'Main. dvi' is up tO date. 'Main. dvi' is up tO date. Main. 10g Main . tex UN Ⅸへの招待⑩ Makefi1e というメッセージが表小さ (ⅵや latex などの ) コ マンドが実行される様子はありません。 Main. dvi は、 Main. tex から生成されるファイルです。したがって、 Main. tex を再編集しないかぎり、生成しなおす必要は ありません。 make は、 (Makefi1e の記述から ) このこ とを判断して、「 Main. dvi は最新の状態になっています よ」といっているのです。これが、ターゲットどうし = ファイルどうしの更新日時を上交して、必要な場合だけコ マンドを実行するという make の強力な機能の 1 つなの もうすこし具ー勺に説明しましよう。 make は、 ( コロ ンの左側の ) ターゲット (A とします ) に里した ( コロ ンの右イ則の ) ターゲット (B とします ) が、ファイルとし て存在していなければたんにそれを 1 つの仕事の定義と 解釈し、ターゲット B で定義された UNIX コマンドを 実行したあとで、ターゲット A で定義された UNIX コ マンドを実行します。しかし、ターゲット B がファイル として存在していれは、次のように make の動きが変わ ります。 ・ターゲット A がファイルとして存在していなければ、 無条件にターゲット A で定義されている UNIX コマ ンドを実行する。 ・ターゲット A がファイルとして存在してい川ま、ター ゲット A とターゲット B のファイルの更新日時を比 較する。 ◇ターゲット A のはうカ噺しい場合は、ターゲット A UNIX MAGAZINE 1994.9 で定義されている UNIX コマンドは実行しない。 ◇ターゲット B のはうカ斤しい場合は、ターゲット A で定義されている UNIX コマンドを実行する。 make はこのように、ターゲットどうしのファイルの 更新日時を上交して、コマンドを実行するかどうかを判 断する機能をもっています。この機能をうまく利用した Makefi1e を作成すると、必要な場合のみコマンドが実 行されるようになります。つまり、 A というファイルか ら B というファイルが生成されると仮定すると、 A か更 新された場合のみ B を作りなおせばよく、 A か史新され ないのに B を作りなおす必要はありません。この場合は、 B を生成するコマンド というぐあいに Makefi1e を言己主すればよいわけです。 ファイル作成規則 最後に、 make のファイル作成規則について簡単に触 れておきます。 UNIX では、たとえば C のソースプログ ラムには、 X X . c というファイル名を付けます。 cc —c X X . c このソースプログラムを、 というコマンドを用いてコンパイルすると、次の名前をも つオプジェクト・ファイルか生成されます。 191

5. UNIX MAGAZINE 1994年9月号

UN Ⅸへの招待⑩ X X . 0 make は、ファイル名のサフィックスをもとに以下の点 ルが作成されるというわけです。 は、 . 。というサフィックスをもっオプジェクト・ファイ . c というサフィックスをもつ C のソースファイルから これを、、、サフィックスによるファイル作成規則 ' イル ) を作成できるか。 ・どのようなコマンドを使用すれはターゲット ( = んであるか。 ・ターゲットに関連したターゲット ( = ファイル ) はな を判断する機能をもっています。 ' と呼 ファ 192 cc —c X X . c す。また、 x x . 。を、 ロンの右側のターゲット ( 例では aya. c) が省略できま ています。そのため、ターゲット aya. 。の定義では、コ ファイルが x x . c ファイルから作成されることを知っ とても簡単な MakefiIe ですね。 make は、 x x . 。 aya. 0, is up tO date . % make aya . 0 aya . C % ls —t aya. * —C aya . C C C % make aya. C % ls aya* aya. 0 : % cat Makefi1e 成してみましよう。 ト・ファイル aya. 。を作成するための MakefiIe を作 例として、 C のソースファイル aya. c からオプジェク ンの右側 ) を省略することも可能です。 ちいち定義せすにすみ、里したターゲットの定義 ( コロ サーはターゲットを達成するための UNIX コマンドをい る、ということになります。この機能を用いると、ユー ような UNIX コマンドを使って生成されるかを知ってい ファイルが、どのサフィックスをもつファイルからどの びます。言い換えれば、 make はあるサフィックスをもつ というコマンドを用いて作成する、ということも知ってい るので、ターゲットを達成するための UNIX コマンドも 省略できます。実際に実行してみると、 cc -c コマンドが ちゃんと実行されています。また、 aya. c を編集せすに 即座に make を実行すると、 aya ・ 0, is up tO date . というメッセージを出力し、 aya. 0 の再コンパイルをし ないので、更新日時の上交もきちんとおこなわれているこ とか不忍できます。 make が知っているサフィックスとファイル作成規則 は、プログラム開発関連のものだけです。そのはかのも の、たとえば . tex から . dvi が作成されることなど については、何も知りません。しかし、ユーサーがそれ を (Makefi1e に決まった形式を用いて定義することに よって ) make に教えることが可能です ( 図 3 に示した Makefi1e では、これをおこなっています ) 。このガ去を 勉強すれば、ファイル名のサフィックスをうまく利用し て、プログラム開発以外でも make を強力なツールとし て活用できます。ただしこの定義ガ去を理解するには、た くさんの知識を必要とするので、これについては稿をあら ためて別の機会に紹介するつもりです。 まとめ 今回は、 make について次の点を紹介しました。 ・ターゲットの定義 ・ターゲット ( = ファイル ) の更新日日 ) 上交 ・サフィックスによるファイル作成規則 これらは、 make の基本機能であり、しつかり理解し ておいてください。今後の説明の進行上必須の知識とな ります。次回は、 Makefi1e の言己斷彡式に関する言料田や、 make コマンドそのものの使い方などについて触れる予定 です。まだまだ猛暑カきそうです。暑さに負けぬよう、 お互い頑張りましよう。 ( さかもと・あや ) UNIX MAGAZINE 1994.9

6. UNIX MAGAZINE 1994年9月号

リスト 1 キャプション TÆ体の変更 \10ng\def\@makecaption#1#2{% \vskip 10 \p@ % \setbox\@tempboxa\hbox{#l : # 2 } % \setbox\@tempboxa\hbox{{\bf#l}\ \ # 2 } % % ←変更後 \ifdim \wd\@tempboxa >\hsize # 1 : #2\par \else 連載スタイルファイル活用法ー 7 オリジナルの定義 変更後 オリジナルの定義 \hbox to\hsize{\hfil\box\@tempboxa\hfil}% \fi} リスト 2 長いキャプションの里 1 \10ng\def\@makecaption#1#2{% 2 3 4 5 6 7 8 9 10 \vskip 10 \ p@ \setbox\@tempboxa\hbox{{\bf # 1 } \ \ } % \@tempdima\hsize\advance\@tempdima—\wd\@tempboxa \setbox\@tempboxa\hbox{{\bf # 1 } \ \ # 2 } \ifdim \wd\@tempboxa く \ 五 size \hfil {\bf#l}\ \ #2\hfi1\par \else \hbox to\hsize{\hfil {\bf # 1 } \ \ \parbox [t] \@tempdima{#2}\hfi1}% \fi} article スタイルでは、図表の番号は文書の知貭から順 に振られます。これを、たとえば節 (\section) ごとに リセットして 1 から始めたいときは、 \@addtoreset{figure}{section} とします。表の場合も、 \@addtoreset{table}{section} と設定します。 キャプションの 2 行目以降をインデントしたい い TEX では、キャプションが本文の 1 行の幅より短い ときは中央揃えになり、長いときは単純に次行に折り返さ れます。後者の場合、文字列の部分のインデント ( 字下げ 幅 ) を揃えたいことがあります ( 土木学会の関連ファイル がそうです ) 。リスト 2 のように定義すれば、図表番号を ポールド体にし、キャプションか複数行にわたるときはイ ンデントします 1 。 3 ~ 5 行目で ( 図表番号を除く ) キャプションの幅を計 算し、 6 行目でそれか現在行の幅 (\hsize) より短いか長 いかを調べています。短いときはキャプション全体をセン タリングし ( 7 行目 ) 、長いときは \parbox を使って行を 折り返します ( 9 行目 ) 。後者の場合、 2 行目以降は図表 番号のぶんだけ字下げして出力されます。この例は、キャ 1 これは渡辺稲夋さん ( 東北た学 ) のアイテアによるものてす。 UNIX MAGAZINE 1994.9 プションの幅を設定する機能はありません。したがって、 キャプションはつねに現在行の幅を基準に組まれます。 これに対して、 hangcaption ・ sty では、 \caption- width コマンドでキャプションの幅を成疋することがで きます。デフォルトでは通常の \ capti 。 n と同しく現在 行の幅カ準になりますが、たとえば、 \captionwidth=60mm と旦言すれは、キャプションの最大長は 60mm になりま す。使い方は、 \caption の代わりに \hangcaption と するだけです似前のバージョンの \isucaption も使 えます ) 。 キャプションのなかて硬えないコマンド \caption コマンドの引数はいわゆる、動く引数 " (moving argument) なので、そのままでは文字サイズ の変更コマンドなどは使えません。そのコマンドの前に \protect を付けてください。 キャプションのなかで強制改行したい \caption の引数では、 \ \ を使った強制改行ができま せん。そこで、 \usebox を使って \parcaption とい うコマンドを定義してみました ( リスト 3 ) 。使い方は、 \caption の代わりに \parcaption とするだけです。た とえば、 \begin{figure} \parcaption{ たとえ短いキャプションでも \ \ 123

7. UNIX MAGAZINE 1994年9月号

で提供される。このとき (c) のように言己し FSinfo を使 うと、 (d) のマウントマッフ。が生成される。 Link FiIesystem Link Filesystem には、すでにローカルにマウントさ れているパーティションのサプディレクトリを、シンポ リック・リンクを使用して AMD の管理する名前空間に 統合する機能がある。これも、コンフィギュレーション・ ファイルで言当できる。 リスト 10 の (c) の最後の行を見てほしい uucp ー > /usr/spool/uucppublic という指定がある。サプリンク時の = の代わりに と記述すると、 Link Filesystem が使用される。 (d) の 最後の行からも分かるように、 Link Filesystem を用い て /home/uucp をアクセスした場合は、 /home/uucp が /usr/spool/tmcppublic に対するシンポリック・リン 連載 . / UN Ⅸ Communication Notes—O クとなるマッフ。が生成される。 コマンド行オプション fsinfo コマンドのオプションは、 る。 ごく単純なものであ コマンドの引数には、コンフィギュレーション・ファ イルを指定する。通常は、関係するファイルを指定する。 オプションには、下記のものがある。 ・ -e 市ツ exports ファイルを作成して指定されたディレクトリ dir にイ褓内する。生成される exports ファイルは、ター ゲットホストのホスト名と同名のファイルになる。たと fsinfo —e exportfs/ えば、 UNIX MAGAZINE 1994.9 と指定すると、 exports ・ indians のようなファイルが生成 fsinfo —e exports . まう。これを逆用して、 け忘れると、カレントディレクトリにファイルが生成されてし ディレクトリ名の末尾の、 / " を忘れないこと。これを付 注意 4 ディレクトリ exportfs に褓内される。 と指定した場合、生成された exports ファイルはサプ される。以下の一 f 、 -m 窈旨定についても同様の注意が必要で ・ -f 市ツ ある。 できる。筆者の環境では、次のようにしている。 FSinfo は、すこし工夫を加えればいっそう便利に利用 FSinfo の作業環境 グに利用するとよい。 ンフィギュレーション・ファイルを当する際のテンヾッ fsinfo の処理について、より詳しい↑帯長を出力する。コ れた名前をターゲットホストとして処理する。 る。こ窈旨定がないと、関数 gethostname(2) で得ら ファイルを生成するターゲットホスト名をここて指定す ・—h ん os れ ame イルには、 automount point の名前が付けられる。 たファイルをディレクトリ市ゴ褓内する。このファ AMD て利用できるマップファイルを生成し、生成し ・ -m 市ツ ル名は、ターゲットホストのホスト名と同じである。 fstab を生成し、ディレクトリ市ゴ褓内する。ファイ か容易になる。 このようなプログラムを作っておけば、コマンドの起動 ・シェル・プログラム mydoit ( リスト 11 ) を用意する。 一括して言当する。 ・マウントマップについては、ファイル automount に ルを用意し、それらに各ホストに関する記述をしてお ・サプディレクトリ config にホスト名と同名のファイ ディレクトリにそれそれ生成されるようにしている。 exportfs に、マウントマッフは generic というサプ しめ用意しておく。 fstab は fstabs に、 exports は 生成されるファイルをオ褓内するディレクトリをあらか など ) を使ってコンフィギュレーション・ファイルを記 fsinfo コマンドでは、 C のプリプロセッサ (/bin/cpp より進んだ使い方 述している。したがって、 43

8. UNIX MAGAZINE 1994年9月号

連載 /NET WORTH—O た SMTP に対するゲートウェイ機能がある。しかし、 れらの機能を利用するには、送信側と受信側に同しメール プログラムが必要になる。 Macintosh では、 BinHex と StuffIt がよく使われる。 BinHex では、 Macintosh フ ァイルの属性と 2 つのパート ( リソースとデータフォー ク ) を付けたうえで ASCII 形式に変換できる。そして、 StuffTt でアーカイプ・圧縮するのだ。 Macintosh ユー ザーのあいだで人気のある Eudora というソフトウェア には、インターネット・メール ( ンヾイナリファイルを自動 的にイ寸加する機能がある。しかし、この場合も送信側と受 信側がともに Eudora を利用していなけれはならない。 アーカイフ・ファイルの処理 複数のテキストファイルを 1 つのメールメッセージに まとめる場合、シェルアーカイプ (shar) ファイルを作 る。 shar ファイルは、ソースコードやヘッダファイル、 ドキュメントなどを 1 つのテキストファイルにするため に、 USENET のソース・アーカイプサイトをはじめ、さ まざまなところて利用されている。 comp ・ sources のアー カイプサイトには、 shar ファイルを作成するための PDS か置かれている。これを利用すれば、全世界のどこへでも ソースファイルをメールメッセージとして送ることができ る。受け取った側では、そのメッセージをいったんファイ ルに保存する。そして、 shar には無関係な部分 ( ファイ ルの 1 行目から先頭に # ! /bin/sh と書かれた行の 1 行前まで ) を削り、シェル (sh) コマンドに入力として 与えて復元する。あるいは、オリジナルのファイルを取り 出すようなシェル・スクリプトを使ってもよい。 複数のファイルを 1 つにまとめるために、 UNIX の tar や cpi 。コマンドを利用することもできる。 tar や cpio で 作ったファイルを compress コマンドで孫宿し、 uuen- code で ASCII 形式に変換すればメールで送れるように なる。受け取った側では、ちょうどこれと逆ク作をして オリジナルのファイル群を復兀する。 送るメールの大きさが 64KB を超えた場合は、いくつ かの小さなファイルに分割しなければならない。 UNIX の split コマンドを使えは、 xaa 、 xab 、 .. のように、重複 のない一 - 里のファイル名にして分割してくれる。メールを 受け取った側では、これらすべてのファイルを正しい名前 172 で保存し、メッセージの前後に挿入されている余分な行を 削除して、 cat コマンドで 1 つのファイルに ; 叫吉する。フ ァイルが宿されている場合は、もとに戻す必要がある。 tar や cpio でまとめたファイルが含まれていたら、適切 なツールを用いて展開すれは、もとのファイル群を得るこ とかできる。 こまでみてきたように、現在の電子メールシステムで もバイナリファイルや大きなファイルを扱うことはでき る。しかし、その手法はおー辛にも優れているとは言えな い。多くの手作業をともなうし、そのための経験も必要で ある。誤ってファイルを消してしまったり、名前の変更 を間違えたり、あるいはすべてのファイルを消してしまう ようなミスも犯しやすい。 UNIX を利用し始めたはかりの ューサーやこれから使おうと思っている人は、こういった ことが原因となって、 UNIX はわけの分からない暗号の ようなコマンドを憶えているグル ( guru ) やハッカー、も しくはエンジニアのためのものだというイメージを抱いて しまうのである。 音声・画像技術の出現により、現在のメールシステムは 意味をなさなくなってしまった。巨大なマルチメディア・ ファイルを扱い、音声を聞いたり画象を見るためには、な んらかの別のイ督はみが必要である。 コンテント Message MIME のプロトコルは、これらの問題への対応を容易 にする手段を提供し、将来おこなわれるかもしれない拡張 にも備えている。 RFC822 [ 2 ] は、、封筒 " の形式 ( メール メッセージのヘッ夘を定義しているが、 MIME はメッ セージの本体の構造を対象にしたものだ。 MIME は、コンテントタイプ ( 内容の種別 ) とい う概念にもとづいている。主要なコンテントタイフ として、 text 、 multipart 、 message 、 image 、 audio 、 video 、 application の 7 つか事前に定義されている。各 ンヾラメータ / 値 " によってさらにサプタイプ タイプは、 にう嶽頁される。これらの情報は、メールメッセージのヘッ ダと本体に言己される。後者は、新しいへッダと捉えるこ とかて、きる。 MIME の文法では、 MIME のメッセージであること とコンテントタイプ、標純勺なインターネット・メールで UNIX MAGAZINE 1994.9

9. UNIX MAGAZINE 1994年9月号

工ラーなどの操作 低水準入出力を用いるシステムコールは、これら以外 にもたくさん存在しますが、そのすべてについて紹介す ることは誌面的にも時間的にも無理があります。これら については、これからさき機会を作って紹介してゆくつ もりです。今回は、システムコールを実行してエラーが 起きたときに、、なぜ工ラーか起こったのか " を判定する ガ去を紹介しましよう。 システムコールを実行してエラーが発生した場合、そ の理由を示す値が外部変数の errno に格納されます。 たとえば、ファイルをオープンするときに対象となるフ ァイルがなかった場合、 errno には ENOENT ( この値は errno. 五ヘッダファイルで定義されています ) という値 かオ褓内されます。システムコールに失敗してエラーメッ セージを出力するときには、この値を参考にしてエラー per て or ( 文字列 ) 数は、 もう 1 つ便利な関数に、 perror があります。この関 メッセージを作ることができるのです。 とで errno の値に対応したエラーメッセージを出力し た文字列を出力し、 ' ( コロン ) と空白を出力したあ という形式で使います。この関数を実行すると、指定し ます。 次の例を見てください。 % cat perror. c #include く fcntl . h> #include く e て r 取 0 . h> #define FILE-NAME "/aaa/bbb/ccc" main() open(FILE_NAME, O—RDONLY , perror (FILE—NAME) ; exit(O) ; % “ /perror 0666 ) ; /aaa/bbb/ccc : NO such file or directory この例では、存在しないファイル /aaa/bbb/ccc を オープンしようとしています。もちろんこの open シ ステムコールは失敗し、このときのエラーメッセージを perror 関数を使って出力しています。出力されたメッ セージは、皆さん見慣れたものではありませんか ? UNIX MAGAZINE 1994.9 IJN Ⅸ流プログラミング 47 UNIX の多くのコマンドが、この関数を使ってエラー メッセージを出力しています。ためしに cat コマンドで 同し ( 存在しない ) ファイルを出力させてみると、次の ようなメッセージが得られます。 % cat /aaa/bbb/ccc cat : /aaa/bbb/ccc : NO such file or directory コマンド名 (cat) が先頭に付いてはいるものの、メ ッセージはさきほどの例と同しものが出力されています (csh などを使うと、コマンド名が付かすにまったく同 じ出力が得られます ) 。なんとなく、自分で書いたプロ グラムが、 UNIX のコマンドと同しレベルになったよ うで嬉しくなりませんか ? このライプラリで出力される文字列は、外部変数の sys-errlist という配列に格納されています。 perror 関数は、 sys-errlist [errno] の値を出力しているに あえすは、 select システムコールからとりあげるつもり テムコールに関して、もうすこし解説を続けます。とり 次回以降は、ファイル・ディスクリプタを用いるシス 扱うにはここでとりあげたもので十分でしよう。 たもの以外にもたくさんありますが、普通のファイルを 数について解説しました。システムコールは今回紹介し セージを出力するための、 errno 外部変数と perror 関 コールでエラーか起こったときにそれを判定したりメッ read のシステムコールを紹介しました。また、システム 今回は、低水準入出力として open 、 close 、 write 、 います ) 。 の機構を利用して日本語のエラーメッセージを出力して しものを使うようになります ( システムによっては、 き、この値を変更すれはすべてのエラーメッセージが同 工ラーメッセージの出力に perror を用いると決めてお すぎません。特定のメッセージを変更したい場合には、 です。 183 ( いまいすみ・たかし東京工業大学 )

10. UNIX MAGAZINE 1994年9月号

は作成し、あれば中身を消して書込み専用でオープンし ます。 open システムコーノレと creat システムコーノレの区す 値は、ファイルがオープンできた場合にはオープンした ファイル・ディスクリプタ (int 型 ) を返します。一方、 オープンできなかったときは一 1 を返します。工ラーを 検出するには、返された値が一 1 かを調べてもよいので すが、ファイル・ディスクリプタの正しい値は 0 以上な ので、 0 と上交することも可能です。多くのプログラム では、 0 との上交をおこなっているようです。 open システムコーノレや creat システムコールでは、 ファイルを作成する場合にモード引数を指定します。た だし、この値がそのまま使われるのではなく、下位 12 ビットの値が umask システムコールで設定されてい る値と計算されて、モードの値となります。 C シェルの 組込みコマンドの umask を用いたときも umask シス テムコールか 1 平ばれます。 モードとして指定した値のそれぞれのビットのうち、 umask の値に設定されているビットは 0 になります。 たとえは、モードが 0666 で、 umask が 027 ならば ( それぞれの値は 8 進数で示しています ) 、実際のファイ ルには 0640 というモードが使われます。次のように、 8 進数の値を 2 進数で表現すると理解しやすいでしよう。 また、スティッキー・ピットは 0 になり、作成しよう 0640 027 0666 000110100000 000000010111 000110110110 されるので、明示的におこなわなければいけないもので スクリプタは、 exit を実行するときに自動的にクローズ でクローズします。オープンされているファイル・ディ たファイル・ディスクリプタは、 close システムコール る fclose と同様に、 open システムコールでオープンし システムコールも紹介しておきましよう。 fopen に対す open システムコールをとりあげたついでに、 close オーナーは、プロセスの実効ューザー ID となります。 の実効グループ ID となります。作成されるファイルの ィレクトリのグループとなり、そうでなけれはプロセス クトリに sgid ビットが設定されている場合には、親デ トされたファイルシステムや作成するファイルのディレ 作成するファイルのグループは、 BSD 形式でマウン には、 sgid ピットも 0 となります。 とするプロセスがファイルのグループに含まれない場合 178 はありません。しかし、数多くのファイルをオープンす るプログラムなどの場合は、ファイル・ディスクリプタ の数が足りなくなることも考えられるので、不要になっ たファイル・ディスクリプタはクローズするようにして ください。 ファイルへの書込み これまでにも何度か簡単に紹介してきましたが、ファ イル・ディスクリプタを用いる書込みには write システ ムコールを使います。このシステムコールの引数につい ては、 7 月号でも説明しましたが復習しておきましよう。 write ( , わ可 , れわい e ) には、書き込むファイル・ディスクリプタを指定し ます。わ可には、書き込む領域の先頭アドレスを指定し ます。最後の nbyte には、書き込む領域のバイト数を指 定します。このシステムコールが返す値は、実際に書き 込んだ文字数です。もし書き込めなかった場合には一 1 が返されます。 7 月号では、 6 可には書き込む文字列の先頭アドレス を指定すると説明しましたが、実際には文字列でなくて も計算機のメモリ中に本褓内できる値ならば、なんでも書 き出すことができます。たとえば、 write(fd, & Ⅱ , sizeof (n) ) とすれば、 fd で指定されるファイル・ディスクリプタ に対して、変数Ⅱの現在の内容を書き出すことが可能 です。 図 1 の例を見てください。これは、 write システム コールの動作をテストしたものです。このプログラム では、 n という int 型の変数に 1234567890 という 値を代入し、それを write システムコールを用いて wtest . out というファイルに書き出しています。この とき、 od コマンドを使って書き出されたファイルの内 容の 16 進ダンプをとっています。一方、プログラムの なかでは、その変数のために割り当てられているバイト を前から順に 16 進数として出力しています。 この図から、 wtest コマンドと od コマンドの出力 が、同じ値を示していることが分かるでしようか。作成 された wtest . out ファイルを cat コマンドで見ても、 1234567890 という文字列は出力されません。これは、 この値か言 t 算機のメモリ中では、 UNIX MAGAZINE 1994.9