exit 関数からの関数の実行 さきほど、ユーサーが関数を登録しておくと、 exit 関 数を実行したときにその関数が実行されると書きまし た。さて、実際にはどのようにすればよいのでしよう か。 exit 関数に関数を登録する方法はシステムごとに すこし異なりますが、基本的な考え方は同じです。 こでは、 SunOS の on-exit という関数を使ってみま しよう。これは、 exit 関数に関数を登録するためのも ので、 int on—exit (procp, arg) void (*procp) ( ) ; caddr—t arg ; のように使います。このとき、 pr 。 cp は登録する関数、 arg はその関数を呼び出すときに渡す引数です。この関 数が実際に呼び出されるときは、 (*procp) (status , arg) , となり、 status には exit 関数に与えられた引数がそ のまま渡されます。また、矼 g はさきはどの関数を登録 するときに付けた引数です。 実際の例を見てみましよう。 #include く stdio . 五> #include く sys/types. 五 > VOid exit_func(status , arg) LJN Ⅸ流プログラミング 22 この例では、 main 関数は何も実行していません。 exit-func という関数を exit 関数の実行時に実行する ものとして登録し、実際に exit 関数を実行して終了し ているだけです。このプログラムをコンパイルして実行 すると、次のような出力が得られます。 status=O arg= 0 NULL は stdio. h のなかで ( c 五矼 * ) 0 と定義され ているので、 arg は 0 となっています。つまり、 exit 関数のなかで、 exit—func ( 0 , NULL) ; という呼出しがおこなわれたわけです。 さて、この登録する関数はどのように使えばよいの 、では、一時ファイルの削除などがで でしようか。こ きます。たとえば、 tmp-filename という外部変数に 時ファイルの名前かオ褓内されている場合、 exit—func (status , arg) int status; c addr—t arg ; unlink(tmp—filename) ; という関数を作成しておき、この関数を。 n - exit 関数を 利用して登録すれば、プログラムの終了時にかならす一 時ファイルを削除することができます。より上手な使い 方として、一時ファイルを作成するときは、かならすそ のファイルを削除するための関数を on-exit 関数を使っ て登録するという利用法があります。つまり、次のよう にするわけです。 int status ; caddr—t arg ; fprintf (stderr , fprintf (stderr , int main() on—exit (exit exit(O) ; func , " status=%d\n" , status) ; "arg=%d\n" , (int) arg) ; NULL ) ; void un1 ink FILE create -tmpfile (status , arg) int status ; caddr—t arg; unlink( ( c 矼 *)arg) ; -tmpfile (name) char char UNIX MAGAZINE 1992.8 *name ; *buf ・ 135
DZ—X 流プログラミング プログラムの終了方法 プログラムを終了させるには、 main 関数の終了、ま たは exit 関数の利用という 2 種類の方法があります。 しかし、しつはこの 2 つは同し終了方法なのです。とい うのも、 main 関数を終了 (return 文を実行 ) すると、 自動的に exit 関数が呼び出されるからです。つまり、 どちらの場合も結果的には、 exit 関数を呼び出してプ ログラムを終了しているのです。 このとき exit 関数に渡される引数には、 main 関数 の戻り値が使われます。したがって main 関数で、 return 0 ; とすれは、そこに、 exit(O) ; と記述したのと同じ効果が得られます。この exit 関数 は、プログラム中のどこからでも自由に呼び出すことが でき、いつでもプログラムを終了させられるようになっ ています。いわば、この exit 関数は戻ることのない関 数なのです。 exit 関数が呼び出されたときに、どのようなことが おこなわれるのかをみてみましよう。 exit 関数はライ プラリ関数で、マニュアルではセクション 3 に収めら れています。 SunOS の C や ANSI C の exit 関数は、 ユーサーによって登録された関数があれは、それを実行 しますにれについては後述します ) 。そのあとで標準 入出力ライプラリの後始末をおこない、最後に -exit シ ステムコールを呼び出します。 前回もちょっと触れましたが、 exit 関数が標準入出 カライプラリの後始末をしてくれるおかげで、終了時 にファイルのクローズを忘れるなどということがない のですね。また . -exit システムコーノレは、 open シス テムコールによりオープンされているファイル・ディス クリプタをクローズします。 このように、正規に終了するプログラムでは、ファ イルのクローズを忘れてもシステム側できちんと処理 してくれていたのです。 22 今泉貴史 前回は、プログラムのなかで一時ファイルを作成し、 それを利用する方法についてお話ししました。また、プ ログラムか了してしまったときに一時ファイルを残さ ない方法も説明しました。 しかしこれらは、いすれもコマンドが正常に実行で きた場合を前提にしています。コマンドが正常に実行 できないときは、予想外のところでコマンドが終了す る可能生がありますし、ユーサーが強制的に終了する こともあります。 そこで、今回はこれらの場合にも対処できるように コマンドを終了する前の後始末についてお話ししまし 134 UNIX MAGAZINE 1992.8
(char *)malloc(strlen(name) buf strcpy (buf , name) ; on—exit (unlink—tmpfile , buf) ; return fopen(buf , "w") ; 136 のワークステーション、 GCC などで利用できます。 1 ANSI C に対応している C コンパイラーー IBM RS6000 や HP 準備しているものなので正規の終了方法ともいえます abort 関数が準備されています。これは、システムが exit 関数以外にプログラムを終了する方法として、 正常ではない終了に対処するための方法を考えてみま などを使って後始末をすることができました。今度は、 プログラムが正常に終了したときには、 on-exit 関数 abort 関数を利用した場合 確保できるようになるでしよう。 C が普及すれは、ほかのマシンとのあいだで互換性が atexit は ANSI で定義されているので、今後 ANSI 義されています。 最低 32 個までは関数が登録できなければならないと定 に引数は渡されません。こちらの場合は、 ANSI C で 指定できす、また登録された関数か呼び出されるとき を使って登録する場合は登録する関数に対する引数は 法などは on-exit とはとんど同しですが、 atexit 関数 ANSI c には atexit という関数 1 もあります。使用方 また、今回は on-exit という関数を使っていますが、 のときとは逆になります。 たものを最初に実行します。つまり、実行の順序は登録 なります ) 。複数の関数を登録した場合、最後に登録し が、ある程度までは設定できます ( システムによって異 の数に限度があり、 on-exit 関数の呼出しに失敗します 録する関数はいくつあってもかまいません。実際にはそ この例からも分かるように、 on-exit 関数を使って登 そのファイルが削除されます。 登録されていますから、プログラムの終了時にかならす ための関数 unlink-tmpfile がファイル名を引数として プンすると、 on-exit 関数を用いてファイルを削除する 数を使っています。この関数を使ってファイルをオー この例では、一時ファイルを作成するために専用の関 が、 exit 関数がおこなうような後始末をしないとい う点では正規の終了方法ではありません 2 。そのため、 exit 関数が実行するような処理を自分自身でおこなわ なけれはなりません。もっとも簡単なのは、 exit 関数 や on-exit 関数によって登録される関数が実行する処 理を施したあとで abort 関数を呼び出すような、独自 の abort 関数を定義してしまう方法です。たとえば、 次のようにします。 my-abort ( ) int for (i for (i abort() ; 0 ; i く tmpfile—max; i + + ) unlink(tmpfile—array[i] ) ; 0 ; i く fp—max; i + + ) fclose(fp—array Ci] ) ; この例では、 my-abort で tmpfile-array という 配列にオ褓内されているファイル名のファイルを削除し、 fp-array という配列に格納されているファイルポイン タをクローズしたあとで、 abort 関数を呼び出してい ます。この関数を使うには、一時ファイルを作成した ら tmpfile-array に加えて tmpfile—max をインク リメントする必要がありますし、ファイルをオープン するたびに fp-array に登録し、 fpnax をインクリメ ントする必要があります。 これらもたしかに面倒な作業ですが、本当に問題に なるのは、すでに abort 関数を使って書かれているプ ログラムには対応できないという点です。そのような場 合は、 C のプリプロセッサを用いて対応します。 次のような C のプリプロセッサ (C コンパイラ ) に 対する命令を使うと、 abort という文字列 ( もしくは関 数呼出し ) を my-abort という文字列 ( または関数呼 出いに変えることができます。 —Dabort=my—abort my-abort 関数を定義したファイル以外のソースファ イルはこの方法でコンパイルし、 my-abort 関数を定義 2 、後始末をするかどうかが定義されていない " というほうが正確で しよう。そのため、機種ごとにファイルの扱いなどが異なることがあ ります。また、通常は core ファイルを作成するので、これを利用し てプログラムのデバッグなどがおこなえます。 UNIX MAGAZINE 1992.8
システムコールがはかの出力を上書きしないことが保証 される。 その代わり、ファイル内容の更新は不可能になる。 lseek でポインタの位置を動かしても、 write システム コールを発行するたびにファイルの末尾に移動してしま うからである。 ■シェルスクリプトからの追加出力 C 言語でプログラムを書く場合にはこれだけ分かれ ば十分だが、シェルスクリプトから追加出力をしたい という要求には応えられない。そこで、さらに詳しく O-APPEND の周辺を調べてみることにしよう。 O-APPEND を指定しない open で得られたファイル・ ディスクリプタに、あとで 0 ー APPEND 属生を与えるよう な操作をするには、 fcntl システムコールを利用する。 ます、現在のフラグの状況を得る。 f1ags=fcnt1(fd,F_GETL,O) ; O-APPEND を与えるには、 fcnt1(fd,F_SETL, flags ー 逆に取り去るには、 fcnt1(fd,F_SETL, flags & O_APPEND) ; -O_APPEND) ; とすればよい。これは、しつはカーネル中のファイル構 造体のなかのフラグビットの操作である。 結果として、同しファイル構造体を共有しているほか のプロセスの read/write などの呼出しにも ( 変更され たフラグビットを参照して動作するので ) 景グ礬がおよぶ。 また、 fcntl をおこなったプロセスが fd を close して も、 exit してもそのままである。さらに、景界受けた ファイル構造体を使用しているプロセスが fork した場 合は、子プロセスもそれを共有する。 したがって、次のような fcntl をおこなうだけの小さ なプログラムを作り、シェルスクリプトのなかからそれ を呼び出せば、シェルの標準出力を追加モードに変える ことができる。また、そオ人降のシェルから fork 、 exec されるプロセスの標準出力も、リダイレクションでほか に切り替えないかぎり追加モードになる。 UNIX MAGAZINE 1992.8 #include く sys/file. 五> main() int flags ; if((flags=fcntl(l ,F—GETFL,O) ) = perror("F_GETFL") ;exit(l) ; flagsl =O—APPEND ; (void)fcnt1(1,F_SETFL,f1ags) ; exit ( 0 ) ; ルスクリプト echol に、 o-append の呼出しを追加し コマンド名を o-append としよう。さきほどのシェ done こうして再び、 e ChO ーⅡ do o—append # ! /bin/sh た ech02 を作る。 o-append 1 > & 2 標準ェラー出力を追加モードにしたければ、 かる。 を実行すると、今度は。 utf が 20 バイトあることカ吩 ec 02 0 1 2 3 4 5 6 7 > > outf ech02 A B C D E F G H 工 J > > outf & \ echo —n XX >outf 4 1 、 > 、 & 、 2 のあいだに空白を入れてはならない。 (o—append ; echo XXXX ) > > logfile という部分を考える。これも確実に追加したければ、 command > > logfile 2>>err10g あるいは、 echo XXXX > > logfile でリダイレクトする部分、たとえは、 シェルスクリプトのなかから、ファイルを指定して > > クリプタ 1 に接続する指令である。 ディスクリプタ 2 を、 o-append のファイル・ディス とすればよい。 1 > & 24 は、シェルにとってのファイル・ 97
signal 関数 マニュアルを見ると、 signal 関数は次のように使う ことになっています。 #include く signal. 五 > void (*signal(sig, func)) ( ) void (*func) ( ) ; いつも思うのですが、 C 言語の型は関数を扱うもの になると分かりにくくなります。ます、引数のはうか ら見てみましよう。 sig という引数は、処理をしたいシグナルを指定し ます。型は指定されていませんが、これは int 型の引数 です。 signal. h というへッダファイルに、表 1 に挙げ たシグナルの名前に対応する int 型の値が定義されてい ます。通常は、表 1 に示した名前を使います。 次の引数 func は、 sig として指定したシグナルが 発生したときに処理をおこなう関数 ( シグナルハンド ラ ) を指定するものです。この関数は void 型、つまり 戻り値をもちません。この関数は引数をとることもでき ますが、シグナルに関する知識がないと使いこなせない でしよう。引数を使いたいときは、 sig Ⅱ al 関数のマニュ アルなどを参照してください。 最後に signal 関数自身ですが、これは func と同し 型の値を返します。つまり、 v 。 id 型を返すような関数 へのポインタを返すのです。 signal 関数は、そのシグ ナルに対して以前設定されていた関数を返します。この 値をとっておけは、シグナルの処理カ坏要になったとき に以前のハンドラに戻すことができます。だからこそ、 signal 関数は関数へのポインタを返すようになってい たのです。 さて、シグナルハンドラを実際に設定してみましょ 、では、例として、、ユーサーカワ。ログラムの実行 中に割込み文字を送った場合、本当に終了してよいかど うかを確認するメッセージを出力し、その値を確認して から終了する " というプログラムを作ってみます。 #include く stdio . > #include く signal . h> 138 void main ( ) VOid s i g—hand ( ) ; signa1(SIGINT, sig—hand) ; printf ("start\n") ; exit(O) ; printf("end\n") ; s1eep(10); sig-hand ( ) int if (c = = c = getchar() ; fflush(stderr) ; fprintf (stderr , "\nReaIIy? : printf ( "interrupt\n" ) ; exit(l); UNIX MAGAZINE 1992.8 さきほどの各シグナルについて、デフォルトのシグ ログラムを終了するように設定されていたためです。 まいます。これは、デフォルトのシグナルハンドラカワ。 と、プログラムは割込みキーの入力によって終了してし 利用しました。このシグナルハンドラを登録していない ムが終了しないようにするためにシグナルハンドラを 今回は、ユーサーか割込みキーを押してもプログラ 既定義のシグナルハンドラ んと後始末をすることができます。 ザーか割込みキーでプログラムを終了した場合もきち ルの削除などのプログラムの後始末をしておけば、ユー もうお分かりですね。シグナルハンドラで一時ファイ 終了します。 ジを出力し、ユーサーからの入力が y か Y なら本当に ドラでは、本当に終了してよいかどうかを問うメッセー 間侍ってプログラムを終了します。一方、シグナルハン 録したあと、プログラムが開始したことを示し、 10 秒 ル ) に対して sig21and というシグナルハンドラを登 ( ューサーカ轄リ込みキーを押したときに発生するシグナ プログラム本体は簡単なもので、シグナル SIGINT
連載 Little Language— set cmd=$l match= ' ' foreach p ($path) die "Usage : lms [ ー 1 ] [—p PAGER] command\n" ・ sub usage { ; # 1ms : Let Me See # ! /usr/local/bin/perl リスト 3 lms の perl 版 endif exec $pager $match else echo $match if ($?listonly) then end endi f set match=" $match $p/$cmd" ()f $p/$cmd & & -x $p/$cmd) then h 土 le ($ARGV[$ ロ $OPt-P = $ 1 ; shift; た一 ( m 。て引 lesslvil emacs)/) { require("getopts . pl " ) ; &Getopts( 'lp: ' ) Ⅱ &usage; $cmd = shift Ⅱ &usage; for $path (split(/:/, $ENV{'PATH'})) { '$path/$cmd" ・ next unless —x $p; $count 十十 ; system('file' next ; push(@found, (p) ; die "nothing hit in path\n" unless $count ; if (@found) { print ("@found\n") , exit 0 if $opt_l; $pager = $opt-p Ⅱ $ENV{ 'PAGER' } Ⅱ 'more ' UNIX MAGAZINE 1992.8 93
図 1 から umer 毬ー . kyutæh. 8. 」 P s u IKDA Comrmts, & ges 心 , fixes も槌 GNUS の実行 載」 S V 日、、 3.14.1 tews 能 ~ 、 fcr 引 Emacs If ゝ 0 」 any tra カ厄ⅲ物 this セ w モ , が let 能 know I ⅲⅡ fix y 供「・・ーⅲせを「・く t q:Exit C—c T 鴪 : 砂」 n fO 4:Obit. listserv. ibn—æts 図 2 ニュースグループ・リスト 〕 Select n. F 価第 d p:Bækwa•d 105 4 : 6 : 1 : 3 : 18 : 3 : 31 : 52 ・ 12. 2 : bit. listserv 引 t. cor ーー 0 お r 旧 引セ . music.qt. b は . listserv. 即ⅲn7 bit. listserv. sos-data b け . listserv.notabene a は . b ⅱ・ⅱ . p に日 s. f ⅲ日 - art. dig はは ed b は . listserv. rexxlist bit. listserv. vpiej—l b け . OS. g 0 引 : bit. ⅱ sts 部マ . 引 ov 「 :. g s. 羆 tiny 引 t. & ー、 t. b ー fO ⅸ s 和・ cadence こⅸ .8 一 b は . Ⅱ sts v ・」日 S27 biz. dec. turbochmrel 3 : a は . h 日引 引 : bit. listserv. 加引ib7 b は . llstserv. vmesa-l 新聞を広げる SPC:Select n ・ F a 団 p ・ 8ækwmd q:EHit C—c TAd : mn lnfo それではニュースを読んでみましよう。 ? : Th i s ゆ Emacs ?:This help GNUS を使うには次のようにします。 % emacs —f gnus あるいは Emacs だけ起動しておき、 M—x gnus そのなかから、 とします 4 。すると画面は図 1 のようになるはすです。同 UNIX MAGAZINE 1992.8 4 M-x とは、 ESC キーに続いて x を打っことです。 ループには、 4 個の記事か溜まっています。 です。たとえば bit. listserv. ibm-nets というニュースグ にすらりと並んだ各行か現在購読できるニュースグループ します。これで記事力売める状態になりました。この画面 ような画面を、ニュースグループ・リスト " と呼ぶことに しばらくすると、画面は図 2 のようになります。この ニュースグループごとに読んた記事か第当求されます。 グループ ( ニュース記事をジャンル別に分けたもの ) と、 重加勺に作られます。このファイルは、購読できるニュース 時にホームディレクトリに . news て c というファイルが自 気楽に LJN Ⅸ、かっこよく X このニュースグループー覧のなかから読みたいものをみ つけて、記事を読みます。たとえば、 fj. unix というニュー スグループの記事を読みたいときは、その行までカーソル ニュースグループ・リスト画面 まま使えると思ってください。 てください 6 。それ以外は基本的に Emacs の機能がその このほかのコマンドは、慣れてきたらいろいろ試していっ れません。とりあえす便利なコマンドを挙げておきます。 かにもたくさんのコマンドがありますが、とても紹介しき こで GNUS 関係のコマンドをまとめておきます。ほ けで記事を読めるようになります。 たいときは、スペースキーあるいは n を押します。これだ キー (DeIete) のどちらかを押します 5 。次の記事を読み 見たいときは、バックスペース (c-h) あるいはデリート 画面を見るにもスペースキーを押します。逆に前の画面を 長い記事は 1 画面に入らないことがありますが、次の リスト " と呼ぶことにします。 ない記事が順番に読めます。この画面を、、サプジェクト・ スキーを押します。すると、そのグループでまた読んでい p 、Ⅱです。読みたいニュースグループまできたら、スペー を移動させます。カーソルの移動は、 c-p 、 c-n あるいは バックスペース、あるいはデリートキーに続いて、 B を入力すれば一が Emacs のヘルフ饑能である程度のことは分かるようになっています。 5 環竟によって違います。 現在購読中のニュースグループだけを表示する。 1 (List) 新しい記事を取ってくる。 g (get) ニュースに記事を投稿する。 a (post) ていたニュースグループを再ひ読めるようにする。 そのニュースグループの購読をやめる。購読をやめ U (Unsubscribe) すべてのニュースグループを表示する。 L (List-all) する。記事が多すぎて読む気にならないときに有効。 そのニュースグループの記事をすべて読んだことに c (Catch-up) 6 表示されます。 35
LJN Ⅸ流プロクラ 表 1 シグナル一覧 ミング 22 したファイルだけは、この一 D という命令を付けすにコ ンパイルしてリンクします。 make コマンドを使ってプ ログラムを作成する場合、通常の c ファイルから。ファ イルを作成するときは、 cc —c —Dabort=my—abort ほかの引数 ... $ く という規則を使い、 my-abort 関数を定義するファイル に関しては、 cc —c ほかの引数 ... $ く という規則を使って実現します。 シグナル こまでに、プログラムの終了方法として exit 関数 を使うものと abort 関数を使うものを紹介しました。 では、これ以外にプログラムの終了方法はないのでしょ う力、 ? プログラムを使う立場で考えてみましよう。プログ ラムの実行中に、、あ、しまった " と思ったときにはど うしますか ? キーや DEL キーを入力して実行を終了 させたり、キーを入力して実行を中断してから kill コマンドを使ってコマンドを停止させたことはありま せんか ? これが、シグナルを送ってプログラムを終了 させる方法です。 ます、、、シグナルを送る " という言葉の意味から説明 しましよう。これは、あるプログラムの実行中に *C キ ーや DEL キー、キーを押すこと、また ki Ⅱコマンド の引数としてあるプログラムのプロセス ID を指定して 実行することなどを指します。このとき、キーか胛され たり、プロセス ID を指定されたプログラムには、シグ ナルが送られるのです。 シグナルは日本語でいうと、、割込み " ですが、これま での exit 関数や abort 関数とは異なり、プログラム中 に明示的に書くことはなく、プログラムの実行中にい つどこから送られるのか分からないという特徴があり ます 3 。 0 による除算などのプログラムを実行したため に起こるシグナルもありますが、さきほどの例のよう にユーザーのキー入力によって起こるシグナルもあり ます。つまり、いつどこで発生するか分からないのが 3 プログラム中に書いておくこともできます。 UNIX MAGAZINE 1992.8 SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGABRT (SIGIOT) SIGEMT SIGFPE SIGKILL SIGBUS SIGSEGV SIGSYS SIGPIPE SIGALRM SIGTERM SIGURG SIGSTOP SIGTSTP SIGCONT SIGCHLD (SIGCLD) SIGTTIN SIGTTOU SIGIO SIGXCPU SIGXFSZ SIGVTALRM SIGPROF SIGWINCH SIGLOST SIGUSRI SIGUSR2 ハングアップ・シグナル 割込みシグナル 中止シグナル 不正命令 トレース用トラップ 中断シグナル EMT 命令 数式上の例外 強制終了シグナル ノヾスエラー セグメンテーション違反 ューサー定義のシグナル 2 ューサー定義のシグナル 1 リソースが失われた ウインドウのサイズか畯更された プロファイル用のシグナル 実行時間でのアラームシグナル ファイルサイズの制限超過 CPU 時間の制限超過 能となった ディスクリプタに対する読み書きが可 末から書き込もうとしている バックグラウンドのプロセスが制御端 末から読み込もうとしている バックグラウンドのプロセスが制御端 子の状態か変わった 停止状態からの継続 キーポードからの停止シグナル 停止シグナル ソケット上の範囲外データ受信 ソフトウェア終了シグナル アラームシグナル 書込み 読取り手のないパイプやソケットへの システムコールへの不正な引数 シグナルともいえるでしよう。 UNIX で定義されてい るシグナルの一覧を表 1 に挙げておきます。 これらのシグナルの多くは、そのシグナルを受けた ときはプログラムを終了するように設定されています。 いつどこから送られるか分からないシグナルには、これ までの知識では対応できません。シグナルが送られたと き、デフォルトで決められている以外の動作をさせるに は、 signal 関数を使うのが簡単です。 137
図 15 kdraw の醯 図 kdraw [ し 1 ed を新 9 ] F ロ 0 Edit St ハ t 匠 0 Font KanJiFont レ h Pattern F 猷 018 図 17 kdraw 、ファイルのセープ Enter a name for th お drawi ng: .. /epsi/l gnus .eps i kdraw. ps kdrawl. eps i kdraw2 ◆ eps i kinputl.epsi k i nput2. eps i k 1 nput3. eps i k input4. eps i \ 工工〇ロ 0 ロ 0. 自 マウスでクリックするか、キーポードから T を入力する と文字が入力できるようになります。そこで Ctr1-Space を押してください 11 どうですか、さきほど紹介した kinpu2 のかな漢字変換ウインドウが出てきたでしよう。 あとはいつものとおりに漢字を入力できます ( 図 16 ) 。 漢字の入った絵か描けるようになりました。せつかく できた超大作てすから、ファイルにセープしておきましょ う。メニューの FiIe から、、 save As " を選んでください。 セープするファイル名を訊ねてくるので適当なファイル名 を指定します ( 図 17 ) 。ー殳に、 EPS 形式のファイルの 拡張子には . eps を付けることが多いようです。ほかの形 式のファイルと区別するためにもこのように拡張子で分け ておく一と、あとあと混乱が少なくてすみます。さあ、これ であなたの大作は、事故がないかぎり永遠のものとなるの です : ー ) この作品を紙に残しておきたいですね。 EPS 形式のフ ァイルは、 PostScript 対応のプリンタで出力できます。 また、この EPS 形式のファイルは I で取り込むこ ともできますが、詳しくはこのあと紹介します。 楽しい ( ? ) 原稿書き やがて図 15 のような画面が出てくるはすです。使い方 皆さんは、原稿やレポートをどうやって書いています はだいたい分かると思います。くどくどと説明するより か ? も、実際にさまざまなコマンドを試しながら憶えるほうが 私たちが大学に入学したばかりのころは、まだワークス 早いでしよう : テーションに接する機会がなく、手書きでレポートを書い 漢字の使い方ですが、 tgif 十と同様に、 kdraw の前に ていました。 PC を持っている友人たちのきれいなレポー kinput2 か起動されている必喫があります。すでに起動さ れている場合は、画面左のメニューのなかから Kanji を 11 筆者の竟では、通常の Shift-Space でなく Ctr1-Space でした 00 図 16 kdraw 、漢子の入力 図 kdraw ・ kdr “ 2. 引 File Edit Strwture Fmt Kan 、 jiFont 新い h % い价 F B Ali31 Op い 今日はとってもいい天気てすね おカで空がとっても青いよ。 一⑩て 一 \ 工工〇ロ 0 ロ 0 「 0 00 42 UNIX MAGAZINE 1992.8
連載 /IJNIX Communication N0tes リスト 3 shiftihave # ! /bin/sh # shift ihave PATH=$NEWSCTL/bin: $NEWSBIN : $NEWSPATH ${NEWSCONFIG—/usr/1ib/news/bin/config} # = ( ) く . $NEWSCONFIG-@く NEWSCONFIG>@> ( ) = e xport PATH umask $NEWSUMASK 110Ck = trap "rm —f $ 110Ck for sys do exit 0 " 0 1 2 15 # Move into his directory llock="$ltemp $lock" then if newslock $ltemp $lock echo $ $ >$ltemp llock="$ltemp 1temp="L. $ 10ck="LOCKbatch" # lock agaxnst batcher for this site continue cd $NEWSARTS/out ・ going/$sys . wehave Ⅱ \ else # didn't get the lock rm —f $ltemp # this site ・ is busy contlnue # try the next site fi if f i [ —s ihave . 0 ] then cat ihave. 0 > > togo cp /dev/null ihave. 0 —s ihave . 1 ] & & mv —s ihave . 2 ] & & mv [ -s ihave . 3 ] & & mv [ -s ihave . 4 ] & & mv rm —f $ltemp $lock # unlock this site ihave . 1 ihave . 2 ihave . 3 ihave . 4 ihave ihave ihave ihave . 0 . 1 . 2 . 3 spacefor はシェル・スクリプトで、真ん中あたりの case UNIX MAGAZINE 1992.8 空き i-node 数を決めています。名前と対応する乍は次 文で各重川ごとに、ファイルシステム、空きプロック数、 のとおりです。 ・ mcommg 受信した記事の耳対の決定。 ・ articles 受信してⅲ . coming に溜まった記事を処理するかどう かの基售。 ・ control NEWSCTL の上で大きなファイルを操作する場合に 使用たとえば、 addmissing は history のコピーを 作る余裕があるかを評ヾます。 ・ outbound 記事を他システムへ送信できるかを判断。 ・ archive 記事のアーカイビングをともなう expire を実行するか どうかを決定。 ファイル名、残量、残り i-node 数の設定を調べ、不都 合があれは変更します。とくに archive のところは実質的 には無効な設定力丿期値にあるので、変更か必要です。 outbound は sendbatches が動作時に使用しま す。 spacefor のデフォルトでは、ファイルシステムが /usr/spool/uucp で、必要なディスク残量は IOMB と なっています。このため、 /usr/spool/uucp のディス ク残量が IOMB を下回ると、バッチの送信だけでなく、 ihave/sendme の処理など sendbatches を介したすべて の重川乍がおこなわれなくなります。 outbound の残量不足は、 NEWSCTL/batchlog を 見れは分かります。 一方 incoming の設疋が過大だと、ディスクの余裕が あるのに受け取った記事バッチを捨ててしまいます。ただ し、それにさきだって以下のようなメールをシステム管理 者に送ってきます。 From : news Apparent1y—To : usenet lncoming news wiII be discarded due to space shortage unless more room becomes available within 15 min . 63