連載 /UNIX Communication Notes—O リスト 8 SU9.1rtl リスト 9 suguru UNIX Filesystem を啝したマウントマップ」 host==indians;type:=ufs;dev:=/dev/sdOg; sublink: ネットワーク竟てできるマウントマップ host ! =indians;type:=nfs;rhost :=indians;\ rfs : =/home/indians ; sublink : =suguru \ =suguru host==indians ; type : =ufs ; dev : =/dev/sdOg ; sublink : =suguru suguru host==indians ; type : =link ; fs : =/home/indians ; sublink : =suguru リスト 10 SymboIic Link Filesystem の利用例 ならない。値に fs :=${autodir}/${rhost}/root を設定 しておくと、マウントに失敗することがない。 UNIX Filesystem (ufs) 通常のローカルのファイルシステムのマウントを、 AMD か管理する場合に利用する。オプションには、 54 クに刻長している ) 。 トワークに刻長したものだった (NFS はファイルアクセスをネットワー かま装されていた RVD は NFS とは異なり、テンヾイスアクセスをネッ 部↑静工学科に在籍していた当時、 IBM RT/PC ( AOS4.3 ) に RVD 4 RVD は月内でははとんどイ叫つれていなかったが、和、が : 邸友た学工学 アンマウントを実行するプログラムを指定する。 ・ unmount マウントを実行するプログラムを指定する。 ・ mount program では、以下のオプションカ甘旨定できる。 mount というコマンドを使っていた 4 は、ファイルシステムのマウントに rvdmount と rvdun- ば、 MIT か開発した RVD (Remote Virtual Disk) で うなファイルシステムを想定して作られている。たとえ マウントとアンマウントに特別なコマンドを使用するよ Program FiIesystem (program) きるマップになる。 にすると、ネットワーク環竟で NIS などを使って共有で さらにリスト 6 に示し列とあわせて、リスト 9 のよう マウントマップを言当すれはよい。 の suguru にマウントしたい場合は、リスト 8 のような サプディレクトリ suguru を automount point 以下 がある。たとえば、計算機 indians で、 /dev/sdOg の マウントするプロックテンヾイス・ファイル たとえば、 mount オプションとして、 mount : ="/etc/xxmount xxmount fileserver ${path}" と指定し、さらに ${path} が /mnt/xx だったとすると、 ファイルシステムのマウントでは、 # xxmount fileserver /mnt/xx かま行されるのと同じ結果になる。 注意 8 上の例のコマンドク旨定は、最初に実行するコマンドの絶 対パスを指定し、それ以後に矼 gv [ 0 ] を含む形式で指定してい る。これは、 AMD か直接フ。ログラムを起動づ - ることを未し ている。したがって、シェル・プログラムを指定する場合、そ のプログラムのう巨寬こ # ! を用いてどのシェルを起動けるかを指 定しないと、マウントに失敗する。 SymboIic Link FiIesystem (link) ${fs}/${sublink} によって指定されるファイルへの シンポリック・リンクを返すファイルシステムである。 のファイルシステムでは、 fs オプションを指定しなけれ はならない。 たとえば、リスト 10 のようなマップを記述し、その automount point が / f00 だったとする。この場合、 /foo/suguru に対してアクセスが発生すると、 /foo/ suguru に /home/indian s/suguru を孑旨すシンポリッ ク・リンクのファイルが作られる。 ある意味で ufs とよく似た処理がおこなわれているが、 両者の最大の違いはマウントを実行しないことである。つ まり、ファイルシステムの指定が ufs の場合は、 AMD によってそのファイルシステムのマウント、アンマウント か管理されるが、 li ではシンポリック・リンクが生成さ れるだけで、マウントまて含めた管理はおこなわれない。 このファイルシステムは、ローカルのシステムですでに マウントされているファイルシステムの名前空間を利用す UNIX MAGAZINE 1994.7
図 1 ls と wc のあいだのパイプ P ls DZ—X 流プログラミング WC すは、このパイプについて説明しましよう。 シェノレで、 ls / ー wc ー 1 などと実行することがよくあります。これは、 ls コマン ( パイプ ) でつないでいます。 ドと wc コマンドを一 このとき、それぞれのコマンドとパイプの関係は、図 1 のようになっています。 図中で P で示したのがパイプです。 ls コマンドの標 準出力がパイプに送らオ L 、 wc コマンドではパイプの中 身を標準入力として読み込みます。全体としてみると、 パイプは FIFO のバッフアとして動作しています。 パイプに関しては、この連載の最初のころ ( 1991 年 1 月号 ) でも 1 度説明しました。また、シェルを利用す るうえでの基本的なことなので、皆さんはもうご存じで しよう。シェルからパイフを利用するときにたいせつな ことは、標準出力への出力がパイプにオ褓内されて、その パイプから読み出す際には標準入力から読み込めるとい う点です。パイプの機能については、これ以上説明しま せん。以降は、パイプをどのようにして実現するかにつ いてお話しします。 pipe システムコーノレ UNIX でパイプを実現しているのは、 pipe というシ ステムコールです。このシステムコールは、 UNIX の 則回は、 system と popen ライプラリ関数について カーネルのなかにパイプを作り、その入口や出口を返し 説明しました。どちらも引数に指定したコマンドを実行 ます。 するもので、 p 叩 en 関数はコマンドをフィルタとして利 リスト 1 を見てください。これは、パイプを使った簡 用できます。ただし、フィルタとはいっても入力か出力 単なプログラム例です。このプログラムを実行すると、 のどちらか一方だけにしか使えません。 先頭に定義されている Hello, World" という文字列が 今回は、起動するコマンドの入出力に関して、複雑な 出力されます。実際にはパイプを作成してそこに文字列 処理をおこなう方法を紹介します。 を書き込み、パイプから読み出した値を画面に出力して / ヾイプ います。 フログラムをもうすこし細かく見ていきましよう。最 初に pipe システムコールを呼び出して、パイプを作成 前回もすこし説明しましたが、シェルのパイプと同し しています。 pipe システムコールの戻り値は整数で、成 機能をはたすものを、 C 言語のプログラムで作ることが 功した場合には 0 が、失敗した場合には一 1 が返されま できます。パイプか利用できると、中間ファイルを用い す。引数に指定しているのは fd という整数の配列のア なくてもコマンドの出力を別のコマンドに渡せます。ま 45 今泉貴史 178 UNIX MAGAZINE 1994.7
emacs 入門 C—u M—x コマンド を実行すると、読込み操作の前にファイルコード系を間い 合わせるコマンドの一覧です。 V バッフア内部コード ぐ理解していないとなかなか難しいものです。そこで、 し、 こで説明してきた方法や設定は、コード系を、、正し て、さまざまな問題点とその解決方法を示しました。しか 複数の言語が混在するファイルの保存と読込みに つい 扱えるわけでもありません。たとえば、バッフア内部コー ト JIS コード系のように、ほかのコマンドやプログラムで ISO や JIS の規格に準拠したものではありませんし、シフ ド系です。日本語 EUC 系や JUNET コード系のように、 が、ノヾッフア内部コードは MuIe の世界だけで有効なコー こで、誤解が生しないようにひと言断わっておきます なり、バッフアの内容を正確に保存できます。 ァイルへ書き出せば、コード系の違いによる曖昧さがなく のように識別子を付けています。このデータをそのままフ ・識別子十文字コード の 1 文字ごとに アで複数の言語の文字を扱えるように、アスキー文字以外 を管理するときに使うコード系です。 MuIe は同じバッフ バッフア内部コードは、名前のとおりバッフア中で文字 内部コードで保存することです。 正確にファイルに書き出すための最後の手段は、バッファ 複数の言語が交ざったバッフアを、言語の種類によらす パッフア内部コードの保存と読込み を紹介しましよう。 ・バッフア内部コード 読み込むためのコード系、 フアの内容をそのままファイルに保存し、しかもそのまま コード系に関する知識がいっさいなくても、とにかくバッ 158 % grep 文字列ファイル % cat ファイル ドで書き出したファイルは、 表 2 ファイルコードを問い合わせるコマンドの一覧 find—file find—alternate-file find—file-other—windov find-file-read-only insert—file などのコマンドで、通常のテキストファイルとして扱うこ とができません。 それでは、いよいよバッフア内部コード系で保存する方 法を紹介しましよう。といっても、これまでのやり方とく らべてとくに変わった操作や設定が必要なわけではありま せん。ファイルに書き出すときのコード系を、 *internal* に指定するだけです。あとは通常の操作でファイルに保存 してください。たとえば、図 1 のように日本語と中国語の 混在するバッフアがあったとします。このバッフアをバッ フア内部コードで保存するには、 ・ set-file-coding-system コマンドでファイノレコードを 設定してから保存する ・コマンド引数でコード系を指定する という 2 種類の方法があります。 save-buffer コマンドの場合は、、、コマンド引数でコー ド系を指定する〃方法が使えないので、 M—x set—file—coding—system Fi1e—coding¯system : *internal* M—x save—buffer を実行します。ファイルコードが * ⅲ ternal * のときには、 バッフアのモード行の左側のコード系の表示が、、 = 〃にな るので、これを確認してからバッフアの内容を保存してく ださい。 write-file あるいは append-file コマンドだと、コマン ドの前に C-u を入力することによりコード系を訊ねるよ うにできます。たとえは、 C—u M—x write—file を実行すると、ファイル名を間い合わせるプロンプト、 Fi1e : UNIX MAGAZINE 1994.7
リスト 3 パイプバッフアを溢れさせるプログラム #include く memory. 五 > #include く stdio . h> main() int char int fd[2] ; buf [ 1024 ] ; if (pipe(fd) く 0 ) { fprintf(stderr, exit(l); memset (buf , , 1024 ) ; i = 0 ; for ( ; "Can't create pipe\n") ; printf ("writing %dK bytes . fflush(stdout) ; write(fd[l] , buf , 1024 ) ; printf ( ” done\n") ; exit(O); 182 4 こでは、 sps コマンドの 1 オプションを使って調べてみました。 際にはソケットを使って寒見されています。 3 pipe システムコーノレのマニュアルに記述があるように、ノ、イプは実 ら読み込んで書き込むための空き領域を作ったり、読み になったプロセスをふたたひ川乍させるには、パイプか うとするとプロックされてしまいます。このような状態 に書き込もうとしたり、バッフアが空のときに読み込も しかし、パイプの場合には、バッフアがいつばいのとき はプロセスがプロックされるようなことはありません。 通常のファイルに対する書込みや読込みでは、ふつう る状態です。 ます。これは、パイプからの読込みでプロックされてい みをおこなおうとした段階でプロセスが休目大態になり コマンドで確認してみます。この場合には、最初に読込 込みがなくて読込みだけをおこなうものを実行して ps うなるでしよう。さきほどとよく似たプログラムで、書 逆に、パイプに何もない状態で読込みをおこなうとど した。このプロセスは、などで削除してください。 れで、パイプがいつばいになったときの状態は分かりま パイフ。への書込みで止まっていることが分かります。 するコマンド 4 を使って調べてみると、このプロセスは からないだろうと思いますが、 ps より詳しい情報を出力 が分かります 3 。ソケットなどと突然いわれてもよく分 プロセスがソケットに関するイベントを待っていること ps コマンドに 1 オプションを付けて調べてみると、 なっています。 コマンドで確認してみると、このプロセスは休目大態に 十十 ) ; 込むデータをパイプに書き込んでやる必要があります。 ところが、テストに用いたプログラム ( リスト 3 ) では、 1 つのプロセスでパイプの処理をおこなっているため、 プロセスカワ・ロックされてしまうとほかの操作はできま せん。これはあくまでテスト用のプログラムであり、実 際には 1 つのプロセスでパイプを使うことはないとは思 いますが、もし使う場合には、バッフアを溢れさせたり 空にしないように注意してください。 ファイルのリダイレクト パイプの真価が発揮されるのは、 1 つのプロセスでは なく fork して複数のプロセスに分かれたときです。例 として、 というパイプを実行するようなプログラムを作ってみま しよう。 こで 1 っ問題があります。パイプで実行されるコマ ンド ()s や (c) は、標準入力から入力を読み込み、標準 出力へ出力しています。これらはファイル・ディスクリ プタでいえば、それぞれ 0 と 1 になります。ところが、 pipe システムコールで作られるパイプは、適当なファイ ル・ディスクリプタに割り当てられるためにコマンドが 標準入力から読み込もうとしても、パイプのデータを読 み込むことはできません。パイプを標準入出力として扱 うことができるように、 dup というシステムコールを UNIX MAGAZINE 1994.7
スタイルファイル活用法ー 5 図 3 連載 罫線でアクセントをつけた例 本日の会議案内 丸〇大学特別選抜入学判定会議ー特別選抜検討委員会 本日午後△時より、ロ館第 7 ・聳義室において、表記委員会の重要会議を開催します。なお、ご出席にあたって は、一ド記の点にご留意ください。 1. ▽◎に関する資料 ( 取扱い注意 ) をご持参ください 2. またも退屈な聳義になりそうです \newtheorem で作成する定理型環境に似ていますが、 デフォルトではアルゴリズムを行番号付きで表示します。 \lf 、 \Then 、 \E1se など、さまざまなコマンドが用意さ れています。 オプション・スタイルに指定し、 \begin{a1gorithm}{ALGORITHMNAME} \end{algorithm} として利用します。簡単な例を示します。 \begin{a1gorithm}{Samp1e} \\\lf secnumdepth $ > $ $ ー 1 $ \Then \>\\step part counter \tcomment{6}{part カウンタ } \\add toc line \tcomment{6}{ 目次の出力 } \ く \\\E1se\> \\add unnumbered line\ く \\\End\If \end{algorithm} と入力すると、 Algorithm 1 Sample 1 2 3 4 5 6 if secnumdepth > ー 1 then step part counter > 〃 0 カウンタ add toc line > 目次の出力 add unnumbered line end if と出力されます。行番号を出力したくないときは、任意 の場所で \unnumberedalgo コマンドを指定します ( コ メント部分には \unnumberalgo と書いてありますが、 UNIX MAGAZINE 1994.7 これは言直です ) 。 \numberedalgo コマンドを指定する と、ふたたび行番号カ咐くようになります。上刎列にある \tcomment コマンドは、第 1 引数て指定したぶんのタブ スペースを空けてコメントを書くためのコマンドです。 の引数に指定した数が大きくなるほど、スペースは小さく なります ( 0 以下の直を指定すると予されます ) 。この ほか、文字のサイズやフォントを変更するコマンドなどが 用意されています。詳細は、スタイルファイルのう頁に書 かれているコメントを参照してください。 罫線でアクセントをつけたい rIbX はレイアウトをするためのツールではないので、 見栄えにあまりこだわるのは考えものですが、お知らせな どでは罫線を使って人目を惹くようなデザインにしたいこ とがあります。ここでは、 TUG (TVfX Users Group) が 発行している and TUG NEWS 」 [ 5 ] に掲載され ていたマクロの応用例を紹介しておきます ( 図 3 ) 。 これは、次の、 announce' 竟を使ったものです。 \def\REYru1e{\hbox to 2cm{% \leaders\hrule height 2pt\hfi11}} \newbox\REYbox \def\announce#l{% \setbox\REYbox=\hbox{% \REYru1e\quad{\LARGE\bf # 1 } % \quad\raise2pt\REYru1e}% \gdef\REYbigru1e{\hbox to\wd\REYbox{% \leaders\hrule height 2pt\hfi11}}% \vspace{lem}% \center1ine{\raise2pt\REYru1e\quad{% \LARGE\bf #1}\quad\raise2pt\REYru1e}} \def\endannounce{\par\centerline{% \REYbigru1e}} 127
emacs 入門 図に外部プロセスを起動するプログラム例 (defun cat-file ( ) (interactive) (call—process nil t "telephone")) よびサービスのプロセスコードの設定例です。メールのフ 図 11 は、 mule ーⅲ it. el に記述されているプログラムお 確立するときなどです。 ホストで動いていて、空いているサーバーを捜して通信を ば、かな漢字変換サーバーが正規表現で表現できる複数の らば、正規表現はかなり役立ってくれるでしよう。たとえ 奇跡的にも秩序あるサービス名やホスト名を付けているな 表現で指定することができます。もし、あなたのサイトが service-coding-system もサービス名とホスト名を正規 define-program-coding-system と同しく、 define- 図ロコード系が一致していない場合の cat-file の実行結果 2 ト罍 ( EEO : 新 $ 7 $ ? $ - く $ ,. 対 $ ( $ ? $ 3 引ヨ新 $ ”軋 $ ? は ; E , v 新 0 $ $ 7 ゞ F い " 4V $ ( く + J , を ECC トåV9f 2 7 $ F $ 7 ゞ軋 $ ? ! # $ s ! "<. 0 : 40 ” ! 2 正くし 840 新 CV 正 $ 7 ゞ $ ? $ , 5 $ $ は、対 $ は $ : 引 $ i $ $ ! ' ' 2q く日 $ X 9T $ + $ ・ EEOC $ ト 0 $ 「 9T $ ー Mh $ 9 く F い , B$EFW<.I # - 爿 E : ーー新イ 4 引朝寸 i t 下し n m そ n 士引 ) ーー自Ⅱー ロセスコードを設定する例では、プログラム名に、、 mail 〃 を含めばプロセスコードが設定されるので、 1 れ ail xmail rmail metamail sendmail サーピスに対して設定されているプロセスコードが cons 上の形式で呼び出すと、指定したプログラム、あるいは (find—process—coding¯system パッフアプログラムサ (find—process—coding—system パッフアプログラム ) V プロセスコードの設定例 の形式で返されます。 ' ( 入力コード系出力コード系 ) ペア、 最後に、フロセスコードを設定した場合の動作の例を紹 168 ァイルの内容の挿入とほば同じ動作をおこないます。 その結果をカレントバッフアに書き込みます。つまり、フ レントディレクトリのファイル telephone を cat して、 ログラムの例です。このサンプルプログラム cat-file はカ 介しましよう。図 12 は、外部プロセスを起動する簡単なプ 、ゝなどはすべて同しプロセスコードが同時に指定されます。 て設定したプロセスコードを知るには、 find-process- 系を調べる関数もあります。プログラムやサービスに対し コード系を設定する関数があるなら、設定済みのコード coding-system 関数を使います。 ービス ) 作しない例を示しましよう。次の設疋、 系と cat コマンドの出力のコード系です。最初に正しく動 このとき注意しなければならないのが、プロセスコード プロセスの入力コード系 : cat コマンドの出力 : * junet* * euc¯japan* で、 cat-file プログラムを実行した場合には、 cat コマンド の出力と MuIe 側の入力のコード系が一致していないた め、図 13 のようにバッフアには予期しない文字列が現れ てしまいます。 図 13 の例では cat コマンドが出力するコード系が、コ マンドの動作というよりもファイルのコード系に依存し ますが、通常はコマンドの出力するコード系がだいたい決 まっているはずです。 たとえば、かならす日本語 EUC 系で出力するコマンド UNIX MAGAZINE 1994.7
連載 スタイルファイル活用法 岩熊哲夫 / 古川徹生 本文乍成について 2 前回に続き、本文を入力するときに役立ついくつかの手 法を紹介します。 verbatim 竟の変更 複数行にわたる \verb ご存しのように、 \verb は複数行にまたがって使用す ることはできません。コマンドの糸寸パスを示すような場 合、これでは更です。これらの文字列を適切な箇所で折 り返せるようにするスタイルファイルが path. sty です。 使い方は簡単で、オプション・スタイルに指定して、 \verb の代わりに \path とするだけです。たとえば、 インクルード・ファイルには、 \pathl/usr/10ca1/X11R5/ inc1ude/X11/Xaw/MenuButton. 五一を使う。 は、 インクルード・ファイルには、 /usr/10ca1/X11R5/inc1ude /X11/Xaw/MenuButton. h を使う。 と出力されます。 \tt を指定して \slash を使えば、 / の前後で改行しや すくなります [ 1 ] 。しかし、 \ pat では / だけでなく、 などの記号の前後でも改行できます。さらに、 \discretionaries 十 % ! . 十 と指定すれは、これらの記号だけが対象になります。 120 {\large\bf{}first} line should begin As described in The \TeX{}b00k , that \begin{alltt} とえは、 るため、環竟のなかでも。 I kX のコマンドかイ吏えます。た ますが、 \ と { } は通常の rIbX の特殊記号として扱われ 環境のなかでは文字がタイプライタ体 (\tt) で出力され alltt. sty があります。ファイル名が示すように、 alltt これに対処するためのスタイルファイルとして、 中で書体や文字の大きさを変更することはできません。 verbatim 環竟では \ も文字として出力されるので、途 verbatim のなかでコマンドをイ吏う という行を捜し、 255 を 127 に変更すれは利用できます。 \ifnum \c@unter く 255 ないことがあります。その場合は、 path. sty の、 しているため、それより旧いバージョンの rIbX では使え path. sty は Version 3.0 以降での利用を前提に 本文の入力に関するヒント 2 with a {\it{}filename} . \end{alltt} とすると、 As described in The , first line should begin with a filename. that のように出力されます。コマンドの直後の空白も出力され るため、上の例に示したように { } などでエスケープする 必喫があります。 UNIX MAGAZINE 1994.7
LJN Ⅸへの招待⑩ 図 2 ankein コマンドのマニュアル % man ankein 【名前】 【入力形式】 anke in anke in 【機能説明】 アンケートへの回答を入力 [—f conffile] [-D dir] ankein は、アンケートへの回答を入力するための、対話形式のコマンドです。 アンケートにおける設問と回答の選択肢は、カレントディレクトリのファイル a Ⅱ keco Ⅱ f から読み込まれます。入力結果は、カレントディレクトリの下のディ レクトリ AnkeData のファイルに書き込まれます ( ディレクトリが存在しない場 合は、新たに作成されます ) 。 ankeconf は、 a Ⅱ keco Ⅱ f ( 5 ) で定められた形式 で記述されていなければなりません。 【オプション】 【関連コマンド】 —f conffile —D dir ankeconf の代わりとなるファイルを指定します。 AnkeData の代わりとなるディレクトリ名を指定します。 ankein(l) , anketotal(l) , anke2tex(1) , ankeconf ( 5 ) はすみます。 14 ~ 21 行目は、オプション角斤の部分です。 getopt を使って指定されたオプションを分解し、それを位置パ ラメータに代入します ( 16 行目 ) 。また、 getopt の実行 後その終了ステータスをみて不正なオプションカ甘旨定さ れなかったかどうかを調べています ( 17 行目 ) 。不正なオ フションカ甘旨定された場合は、 Usage メッセージを出し てプログラムを終了します ( 19 行目 ) 。 24 ~ 37 行目は、オプション処理です。 ankein を次の ように実行すると、 ankein —f conffile 位置パラメータには、 —D ankedata —f conffile —D ankedata という、 5 つの値が代入されます。 24 行目の f 。 r コマン ドでは、これらの値を順に、 case ( 26 行目 ) で判定しま す。 -D であればその次の位置パラメータの値 ( $ 2 ) を変 数 DIR に、 -f であればその次の位置パラメータの値を変 数 CONF に代入します。変数 D 工 R と CONF には、あらか しめ省田のディレクトリやファイルの名前が代入され 190 ていますが、 28 行目や 31 行目が実行されるとユーザー の指定したファイル名に変わります。この代入か終了し たあとで、 shift コマンドでイ立置パラメータの値を 2 つシ フトします。すると、 : 麪頁 2 つの ( $ 1 と $ 2 ) の値がな くなり、次のオプションの判定か可能になります。 39 ~ 68 行目 ( リスト 4 ) では、プログラムで使うファ イルやディレクトリが実際に存在しているかどうかを調 べています。使用するファイルやディレクトリがきちん と存在していなければ、プログラムが正しく動作しないの で、このような検査はとてもたいせつです。 40 行目は、回答結果を書き込むディレクトリの存を 調べています。存在していれば何もしません ( 42 行目 ) 。 存していない場合は、それを作成しなければなりません ( ディレクトリがないと、ファイルが作成できません ) 。そ こで 43 行目では、ます同名のファイルが存在していない かを詩ヾます ( 存在していれは、その名前は使えません ) 。 ファイルがあれは、ディレクトリか作成できない旨のメッ セージを出してコマンドを終了します ( 45 ~ 46 行目 ) 。な けれは、ディレクトリを作成します ( 48 行目 ) 。 52 ~ 61 行目は、一ファイルを作るディレクトリがあ るかを調べています。実際の処理は、 DIR (AnkeDir) と UNIX MAGAZINE 1994.7
IJN Ⅸ流プログラ リスト 2 パイプを使ったプログラム (fdopen を用いた例 ) ミング 45 #include く stdio . h> #define TEST_STR ” He110 , Wor1 main() int char int FILE fdC2] ; buf [BUFSIZ] ; len; *in, *out; if (pipe(fd) く 0 ) { fprintf (stderr, "Can 't create pipe\n") ; exit(l); if ((in = fdopen(fd[O] , " て " ) ) = = NULL Ⅱ (out = fdopen(fd[l] , "w")) = = NULL) { fprintf(stderr, "Can't set stream I/O for fds\n") ; exit(O); fputs (buf , stdout) ; fgets(buf , BUFSIZ—I , fflush(out) ; fprintf (out , "%s\n" , TEST—STR) ; exit(l); fpr ⅲ tf 関数などを用いて書込みをおこなっても、ファ イルポインタカ甘旨すバッフアに書き込まれただけで、実 際にはパイプに渡っていないこともあります。一連の書 込みか終ったときには、 fflush ライプラリ関数を用いて、 ファイルホインタカ甘旨しているバッフアの内容を、実際 にパイプに書き込むようにしてください。 fflush 関数に ついても、 read や write と同様に次回に詳しくとりあ げるつもりです。それまでは、、おましない " と思って、 fprintf などで書き込んだあとに fflush 関数を実行する ようにしてください。 リスト 2 は、リスト 1 のプログラムを fd 叩 en を用い て書き換えたものです。とくに、後半の処理が見慣れた ものになったのではないでしようか。 パイプの大きさ 話をパイプに戻しましよう。パイプはデータを石呆す るための FIFO として働くと述べましたが、このバッ フアの大きさはどのくらいなのでしよう。 man コマン ドなどで調べてみると、マシンによって異なりますが、 4KB や 8KB のものが多いようです 1 400 字詰め原稿用紙全部のマス目を埋めても 800 バイ 1 man コマンドで分からない場合には、 sysconf や pathconf のマニュアルや、 /usr/include/limit. h 、 /usr/include/sys/ param. h の PIPE-BUF に関する部分を参照してください。 UNIX MAGAZINE 1994.7 トですから、 4KB ならは・ 5 枚以 - ヒの分量になります ( ち この記事の原稿は先頭からここまでで約 8KB なみに ほどです ) 。これだけの量があれば、バッフアが溢れる ことはないかというと、そうでもありません。書き込む コマンドが cat コマンドのようにたんに書き込むだけの 単純なもので、パイプの出力を受け取る ( つまり読み込 む ) コマンドが複雑な処理をおこなうコマンドの場合を 考えてみてください。読み込む側の速度が遅くなれば、 書き込む側の処理が速すぎてバッフアを溢れさせてしま うことも考えられます。 パイプに書き込んでいる最中に、バッフアカ隘れてし まったらどうなるのでしようか ? 実験してみましよう。 リスト 3 のプログラムは、パイプを作成して IKB すっ 書き込みます。 このプログラムを実行すると、 % a. out writing writing writing writing 5K bytes. writing 4K bytes. 3K bytes. 2K bytes. IK bytes. done done done done となり、 4KB を書き込んだあと、 5KB 目を書き込もう もうとしたところで停止することもあるでしよう。 2 これはパイプのバッフアの大きさに依存するため、 9KB 目を書き込 としたところでプログラムが停止してしまいます 2 。 ps 181
0000015 に続けて、コード系の入力を促すプロンプトか表示される ので、 UNIX MAGAZINE 1994.7 ルを日本語用コード変換コマンド nkf にかけてしまった yamato さんは、バッフア内部コードで書き込んだファイ 何か起きたか、賢明な読者の皆さんはお気づきですね。 yamato: うん、そういえは・・ たんやないか ? kanri : もしかして、 Mule のモード行の表示か たっ だらファイルか壊れてた。 したけどやつばり読めない。もう 1 度 MuIe で読み込ん yamato : more で読めなかったから nkf で EUC に変換 kanri : どのコマンドで読んでみたんや ? めないの。 yamato : Mule で編集してファイルに書いたんだけど読 シフト JIS と EUC が交ざってんのかなぁ ? kanri : うーん、たしかにぐちゃぐちゃに見えるなあ・・ yamato : うん、このファイル、はら見てみて。 kanri : そんな話聞いたことないで。どないしてん。 ことがあるんしゃない ? yamato : ねえねえ、 Mule って日本語のファイルを壊す つもりて操作するとひどい目に遭ってしまいます。 バイナリファイルにしか見えません。日本語のファイルの ファイルのように見えますが、普通のコマンドにとっては 十分注意を払ってください。 Mule で読み込めば日本語の バッフア内部コードで書き出したファイルの扱いには、 とも違うようです。 フ・シーケンスが含まれていないので、 JUNET コード系 存したときとはたしかに違っていますね。また、エスケー 保存した図 1 のファイルの内容です。日本語 EUC 系で保 コマンドて市寉認しておきましよう。図 5 は、 *internal* で 保存した結果が正しい内容になっているかどうかを、 od のように指定します。 Coding¯system : *internal* 図 5 バッフア内部コードで保存したファイルのダンプ % od -xc mixed—lang. internal d091 b9fa 91d6 fc92 cbdc 92C6 0000000 222 306 374 222 313 334 221 326 320 221 271 372 です。バッフア内部コードは、アスキー文字以外の 1 文字 emacs 入門 ,/へし / N \ Ⅱ 0a00 のです。もちろん、 nkf コマンドは Mule のバッフア内部 コードなんて知りませんから、自分の信したコード変換を おこなった挙句、日本語ではないものを出力したのです。 ara ! : へえー、そんな事故もあるんだね。 kanri : 何かの拍子に間違ってファイルコードを変更した んやろな。 ara ! : でもまあ、 nkf だともとのファイルが残るから、も う 1 度 Mule で読み込めば大丈夫ゃん。 kanri : ふっふっふつ、それがやな・・ ara ! : ん、まさかまた ! ? kanri : そう、そのとおり ! nkf で作ったファイルをご丁 寧にもとのファイルに mv したんや。 ara! : さっすが☆☆☆さん ! kanri : おいおい、いまごろ名前を伏せ字にしても、もうば れとうがな。 リーティンク・キャラクタ Nemacs も MuIe も複数のコード系を読み書きするこ とができますが、どちらも内部の処理は内部コードを使っ ておこなっています。 Nemacs は、日本語 EUC 系を内部コードとして使って います。そのわけは Nemacs は日本語にしか対応してい ないため、プログラムによる処理が簡単な EUC 系が内部 コードとして採用されたのでした。 一方、 MuIe はさまざまな国の言語に対応しなくてはな らないので、 EUC 系を内部コードとして採用することは できません。 ISO 2022 の規格にならってエスケープ・シー ケンスを含む内部コード系にすれば、正確に多国語を表現 できますが、文字処理をするときにエスケープ・シーケン スを含むコード系は扱いが難しくて大変です。 そこで、 MuIe では独自のコード系を内部表現に使うこ ・バッフア内部コード とにしました。これが、 159