システムコール - みる会図書館


検索対象: UNIX MAGAZINE 1995年7月号
117件見つかりました。

1. UNIX MAGAZINE 1995年7月号

には、なけれはファイルを作成するフラグの指定も忘れ ないでください。この場合には、内容が空のファイルが 作られます。 open システムコールは、 1994 年 9 月号で紹介しまし た。オープンしたいファイルを文字列で、オープンする モード ( 読出しや書込みなど ) を記号定数で指定します。 open システムコールがエラー ( ー 1 ) を返した場合は、実 効ューザー ID や実効グループ ID が示す現在の権限で はオープンできないことが分かります。 open システム コールがエラーを返すときには、外部変数の errno に その理由かオ内されるので、オープンできなかった理由 も確認できます。 読出しや書込みができるかどうかを検査する場合、オ ープンしてすぐにクローズできるので問題とはなりませ んが、実行できるかどうかの検査はちょっと厄介です。 検査のために exec などを利用すると、本当に実行が始 まってしまいます。実行できるかどうかを検査するうま い方法が思いつきません。誰かよいガ去を知っている人 がいたら、ぜひ教えてもらいたいものです。 どうしてもこれを検査したけれは、目的のファイルに 対して stat システムコールを実行し、そのモードの値 から自分に対して実行許可が与えられているかを調べる 方法があります。この場合、ファイルの所有者とプロセ スの実効ューザー ID を上交したり、自分カ嘱すすべて のグループとファイルのグループを上交する必要も生し ます。これらの処理はできないことはありませんが、必 要になったときに実行して exec が失敗したかどうかを 調べるほうが簡単です 1 。 プロセス実行ユーサーの権限 setuid や setgid メカニズムを利用していると、実際 にプロセスを実行しているユーサーに権限があるかどう かを調べたくなることもあります。さきほど紹介した方 法では、プロセスの権限で検査がおこなわれてしまうの で、こうした目的には使えません。 たとえは、スーパーユーザーに setuid されたプログ ラムでは、ファイルシステム上のどんなファイルでも処 理が可能です。ーヨ殳のユーザーがこのプログラムを実行 した場合に、 setuid されていないときに利用できるか 1 これは、次に述べる access システムコールや、次回紹介する予定の システムコールを用いるとある程度は検査できます。 160 どうかを調べるのは非常に困難です。しかし UNIX に は、専用のシステムコールか準備されているので、これ を使って簡単に調べることができます。 プロセスを実行したユーザーが処理可能かどうかを検 査するには、 access システムコールを使います。この システムコールは、通常の判断で用いられる実効ューザ ー ID や実効グループ ID ではなく、プロセスを起動し たユーサー ID やグループにもとづいて検査をおこない ます。そのため、 setuid されたプログラムなどで実際に 利用しているユーザーに権限があるかどうかを調べるに は、とても便利なシステムコールです。 access システムコーノレは、 access()€ス名 , モード ) という形式で用います。パス名には、権限を検査したい ファイルやディレクトリを文字列で指定します。モード には、検査したい権限を示す記号定数を指定します。記 号定数には、読出しの権限を検査する R-OK 、書込み の権限を検査する W-OK 、実行や検索の権限を検査す る X-OK か準備されています。また、パス名に含まれ るディレクトリの検索権限があり、なおかっファイルが あるかどうかを調べる F-OK というものもあります。 このシステムコールを実行すると、プロセスを実行し たユーザー ID (getuid システムコールで返されるもの ) と、それを実行したユーザーが所属するグループにもと づいて権限か検査されます。指定された権限があれば 0 が、権限がない、あるいはエラーの場合には一 1 が返さ れます。ー 1 カ亟された場合には、外部変数の errno に 工ラーの内容を示す値かオ褓内されます。 access システムコールを使うときに注意しなければ ならないのは、ファイルやディレクトリに対して付けら れたモードだけか検査の対象になる点です。これは、読 出しや書込みの検査では問題となりませんが、実行の権 限を検査する場合には間題となることもあります。とい うのも、あるファイルに実行権限が与えられていたとし ても、本当に実行できるかどうかは実際に exec してみ ないと分からないからです。 たとえば、オプジェクト・ファイルを強引に chm 。 d コマンドで実行可能にしてあるような場合は、 access で は実行できるという判断を下します。けれども、実際に exec で実行してみると、ファイルのフォーマット・エ ラーとなり実行できません。 UNIX MAGAZINE 1995.7

2. UNIX MAGAZINE 1995年7月号

テムコールを使ったときに、親子いすれかの判定のため に利用しました。 2 度ともシステムコールの使い方につ いて詳しく説明しなかったので、 ここで紹介することに します。 プロセス ID を取得するには、 getpid システムコー ルを用います。このシステムコールに引数はなく、戻り 値としてプロセス ID を返します。ふつう、プロセス ID の型は int 型です。システムによっては pid ー t という特 別な型が用意されているものもあるようですが、この場 合にも int 型の値として扱うことが可能です。 詳しく説明するといっておきながら至極簡単なもので すが、使い方は本当にこれだけなのです。プロセス ID は、システムコールと同様シェル・スクリプトでも簡単 に得られる値です。シェル・スクリプトでは、 $ $ と書く だけで取得できます。 もう 1 つ、簡単に得られる値を紹介しておきましょ う。さきほど、プロセスにはかならず親プロセスが存在 すると説明しました。今度は、この親プロセスのプロセ ス ID を取得する方法です。こちらも、 1994 年 5 月号 ですでに紹介しました。 親プロセスのプロセス ID を得るには、 getppid シス テムコールを用います。このシステムコールは、 getpid システムコールと同様に引数をもたす、戻り値として親 プロセスのプロセス ID を返します。ここで返される値 の型も getpid システムコールと同オ兼、 int か pid-t 型 となります。 ユーサー ID とグループ ID UNIX マシンを使う場合、ログイン名が必要です。ロ グイン名を登録する際に、同時にユーサー ID と呼はれ るものも登録します。 UNIX では、通常はこのユーザー ID を用いてユーザーを認識しています。 しつは、プロセスにもユーサー ID が付きます。これ は、プロセスを実行したユーサーを認識するためのもの です。プロセスを実行したユーザーのユーザー ID が、 そのプロセスのユーザー ID となります。プロセスのユ ーザー ID を取得する方法は、 1995 年 4 月号で紹介し ています。 プロセスのユーサー ID を取得するには、 getuid シ ステムコールを用います。このシステムコールには引数 はなく、戻り値としてユーサー ID を返します。返され UNIX MAGAZINE 1995.7 LJN Ⅸ流プログラミング 57 るユーザー ID の型は int 型ですが、 uid-t という特別 な型を準備しているシステムもあります。しかし、この 場合も int 型の値として扱えます。 ューザー ID と同様、プロセスにはグループ ID も 付けられています。こちらも、そのプロセスを起動した ューサーのグループ ID カワ。ロセスのグループ ID とな ります。プロセスがファイルを作成する場合には、プロ セスのユーザー ID やグループ ID にもとづきファイル の所有者やグループか轂定されます。 プロセスのグループ ID を取得するには、 getgid シ ステムコールを利用します。このシステムコールには引 数はなく、戻り値としてグループ ID を返します。グル ープ ID の型は int 型が返されますが、 gid-t という特 別な型を準備しているシステムもあります。しかし、 の場合も int 型の値として扱うことが可能です。 実効ユーサー ID プロセスは、そのプロセスを実行したユーザーのユー ザー ID やグループ ID をもっています。プロセスは、 基本的にはこれらの値に見合った権限で実行されます。 つまり、あるプロセスでファイルの操作が可能かどうか は、そのプロセスを実行したユーザーがファイルを操作 できるかにかかっています。 ューサーがファイルを操作できるかどうかは、対象と なるファイルのモードに依存します。ファイルのモード については、 1994 年 11 月号で説明しました。 ls-l コ マンドを実行したときに、行頭に表示される 10 文字か ら先頭 1 文字を除いた後続の 9 文字がファイルのモー ドを表します。 3 文字すっ 3 つのプロックに分かれてい て、ファイルの所有者、ファイルのグループ、そのほか のユーサーに対する許可の状態を示します。たとえば、 となっている場合は、所有者は読出し、書込み、実行の いすれも可能です。グループに属すューザーは、読出し と実行だけが、そのほかのユーザーは、実行のみが可能 です。 しかし、これらのイ描矍機能だけではうまくいかない場 面もあります。たとえは、 p swd コマンドを実行する 場合を考えてみてください。 passwd コマンドでは、ユ ーサーのパスワードが格納された /etc/passwd ファイ ルを変更する必要があります。しかし、一ヨ殳のユーザー 157

3. UNIX MAGAZINE 1995年7月号

イス値カ斫られます。 ナイス値は一 20 ~ 19 までです。ここで問題が出てき ます。これまで、システムコールがエラーとなったとき には、かならす一 1 を返していました。実際、 getprior- ity システムコールもエラー時に一 1 を返します。しか し、ナイス値が一 1 だった場合には、その見分けがつき ません。 この対策として、エラーの不頁を表す外部変数 errno を積極的に利用します。 getpriority システムコールを 呼び出す直前に、 errno の値を 0 に設定しておきます。 getpriority システムコールでは、エラーが起きなけれ ば errno の値は変更されないので、 getpriority システ ムコールが一 1 を返し、なおかっ errno の値が 0 であ ればナイス値は一 1 だと分かります。 ナイス値を設定するのも簡単です。これには、 set- priority システムコーノレを用います。このシステムコ はしいのは、 ス値には、設定したい値を指定します。 システムコールと同様なものを指定します。最後のナイ という形式で使います。対象 1 と対象 2 は、 setpriority( 対象 1 , 対象 2 , ナイス値 ) ールは、 こで注意して getpriority からない場合は、 which コマンドで調べてください。 C ドとして実現されています。どちらを使っているのか分 ファイルとして、もう 1 つは C シェルの組込みコマン マンドは UNIX 上に複数あります。 1 つは、コマンドの るには、 nice コマンドを利用します。じつは、 nice コ ちなみに、コマンドを実行するときにナイス値を上げ ら喜ばれるかもしれません。 るようにナイス値を上げてプロセスを実行すると他人か 負荷の高いプロセスを起動する場合には、親切な人とな があります。言 1 ・算機の資源を喰い尽くしてしまうような 英語の、、 nice" には魅力があるとか親切なという意味 は優先順位を上げるような設定はおこなえません。 順位が下がります。 UNIX では、ス→ヾーユーサー以外 という制限があることです。ナイス値が大きいはど優先 設定できない ーヨ殳ューザーは、現在のナイス値よりも大きな値しか ・負の数のナイス値は、スーパーユーザーしか設定でき 162 シェル以外のシェルを使っている場合は、組込みの nice コマンドの有無はそのシェルに依存します。それぞれの シェルのマニュアルを参照してください。以下、 C シェ ルとファイルの nice コマンドについて解説します。 C シェルを使っている場合は、その組込みコマンドの nice を用います。このとき、 nice コマンド とすればナイス値が 4 上がります。引数に、十数字 " を 指定すると、指定した数字ぶんだけナイス値を上げるこ とができます。スーパーユーサーだけがナイス値を下げ られますが、その場合は引数に、、一数字 " を指定します。 ファイルのⅲ ce コマンドを使う場合は、 C シェルと オプションの解釈に若干の違いがあります。オプション を指定しなければ、 nice コマンドは 10 か指定された ものとみなします。オプションに正の数を指定する場合 UNIX MAGAZINE 1995.7 ☆ ( いまいすみ・たかし東京工業大学 ) setuid メカニズムを紹介できることを祈って・・ てしつくり調べてみようと思っています。来月号では、 変わっているという情報もあり、これから 1 カ月かけ setuid メカニズムは、 4.4BSD でセマンティックスが カニズムは有効です。 し、スコアファイルを保存する場合などにも setuid メ いるかもしれません。しかし、ゲームプログラムを作成 ンドを用いたので、自分とは関係ないと思っている人が カニズムの解説の例に / etc / passwd ファイルや ps コマ て、もうすこし詳しく説明するつもりです。これらのメ 次回は、今回の setmd や setgid のメカニズムに関し システムコールも紹介しました。 ムコールの access や、ナイス値を変更する setpriority す。ファイル操作がおこなえるかどうかを調べるシステ グループ ID 、ナイス値を得るためのシステムコールで スのユーザー ID 、グループ ID 、実効ューザー ID 、実効 ority などを紹介しました。これらはそれぞれ、プロセ ノレとして、 getuid 、 getgid 、 geteuid 、 getegid 、 getpri- 今回は、プロセスのもつ情報を取得するシステムコー されていません。 ます。もちろん、この指定はスーパーユーザーにしか許 の数を指定する場合には、 ー数字 " という記法を用い と指定すると、ナイス値として 12 か設定されます。負 は、、一数字 " という記法を用います。たとえば、一 12

4. UNIX MAGAZINE 1995年7月号

また、ディレクトリの場合は、 access で書込みの権限 を調べると、そのディレクトリにファイルを作ることが できれば 0 が返されます。しかし、 open システムコー ルでそのディレクトリを書込み用にオープンしようとす ると、エラーとなってしまいます。 access システムコールは、さきほども説明したよう に対象とするファイルのモードを利用します。したがっ て、ファイルを作成できるかどうかを検査するのはなか なか面倒です。すでにファイルがあれば、そのファイル のモードを調べれば書込み可能かどうかが分かります。 しかし、まだファイルがない (errno に ENOENT が 格納されている ) 場合には、目的のファイルの親ディレ クトリの読出し、書込み、実行の許可を調べなければな りません。その結果、すべての値が OK ならば、ファイ ルを作成可能と判断できるのです。 ナイス値 ナイス (nice) という概念をご存しでしようか。 UNIX では、すべてのプロセスがもっている値で、カーネルが 実行するプロセスの優先順位を決定するために用いられ る値の 1 つです。このナイス値もシステムコールを使っ て取得できます。 ナイス値の取得には、 getpriority システムコール を利用します。これは、次のような形式で使います。 getpriority( 対象 1 , 対象 2 ) このシステムコールの戻り値が、取得したい対象のナ イス値です。対象 1 には、プロセス、プロセスグルー プ 2 、ユーザーのどれに関するものかを記号定数で指定 します。指定する記号定数は、関係する対象に応して、 プロセスは PRIO-PROCESS 、プロセスグループは PRIO- PGRP 、ユーザーは PRIO-USER です。対象 2 には、実際に取得したい物を指定します。たとえは、 対象 1 が PRIO-PROCESS であれは、対象 2 には調 べたいプロセス ID を指定します。 どんな対象 1 に対しても対象 2 に 0 を指定した場合 は、、、現在のもの " を意味します。つまり、 getpriority (PRIO—PROCESS , 0 ) とすると、このシステムコールを実行したプロセスのナ 2 プロセスグループについてはまだお話ししていません。ここではそう いうものがあるという知識にとどめておいてください。 SC 翡 A COM 「」 T P 塁 S 「 ECT 一 計算機創造の軌跡 チャールズ・イームス / レイ・イームズ共著 和田英一監訳山本敦子訳定価 3 、 900 円 貴重な映像で綴るコンピュータ創世のドラマ いかにしてコンピュータは生まれたのか ? コンピュータの 出現をもたらした人類の英知と創造力を、初期 ( 1890 年ー 1940 年代 ) の貴重な映像 点以上を使い解説する。計算機の誕生、発展と密接 にかかわる社会背景と、それにたすさわった多くの人々・変型、ー 84 。↑ジ の顔をそこに見ることがてきる 0 チャールズ・バペイジアラン・ M ・チューリングジョン・フォン・ノイマン ぐム - んな第ごん戸已 . み、 昼 . をム”ローはこ“。を ? “、ぁ アラン・ M ・チューリングの手書ノート ※表示価格は税込。 株式会社アスキー 〒 151-24 東京都渋谷区代々木 4-33-10 トーシンピル 株式会社アスキー出版営業部電話 ( 03 ) 5351-8194 ブックカタログをこ希望の際は、小社・出版営業部まで 官製はがきにてお申し込みください。 ヘルマン・ホレリス 161 UNIX MAGAZINE 1995.7

5. UNIX MAGAZINE 1995年7月号

プロセスが実行される場合、そのプロセスにはかならす プロセス ID が付けられます。また、それぞれのプロセ スには、かならず親プロセスか存在します。プロセス間 の親子関係を結んでいくと、 UNIX のファイルシステム と同様な冓造か構築されます。このイ哥冓造を、、プロセ スツリー " と呼びます。 ファイルシステムの場合は、ルートディレクトリの親 ディレクトリはルートディレクトリ自身です。これは、 : オ冓造の根の部分なので仕方がありません。プロセスの 場合も同様で、プロセス IDO 番のプロセスが冓造の 根となります。つまり、プロセス IDO 番の親プロセス はそのプロセス自身です。 UNIX には、 swapper と pagedaemon という 2 つの特別なプロセスがあります ( システムによっては、 pagedaemon はありません ) 。これらは、カーネルプロ セスと呼ばれるもので、カーネルの内部で動作します。 プロセス ID はそれぞれ 0 と 2 で、どちらも親プロセス は 0 です。すなわち、 swapper の親は swapper 自身と なります。 もう 1 つ、特別なプロセスに init があります。 れも、システムにより実行されます。プロセス ID は 1 で、親プロセスは 0(swapper) です。 init プロセス は、システム起動時の設定 (/etc/rc など ) を実行した り、ユーザーか端末からログインできるように端末の数 だけ getty コマンドを実行したりします。親のいなく なったプロセスを養子にもらい、親のいないプロセスが 存在しないようにする役目も負っています。 プロセス ID 前回は、 C 言語のソースプログラムをコンノヾイルする 前にコメントなどの処理をおこなう cpp について紹介 しました。 cpp を上手に使えば、さまざまなマシンに依 あるプロセスに与えられたプロセス ID は、そのプロ 存する部分を別々に記述できます。同じソースプログラ セスが生きているあいだは、ほかのプロセスに割り当て ムを、多くのマシンで使えるようにできるのです。 られません。したがって、システムのなかに同じプロセ ス ID をもつプロセスが存在することはありえません。 3 回はどシステムコールから離れた話をしてきました この点に着目し、以前にプロセス ID を用いて一時ファ が、ふたたびシステムコールの話題に戻ります。ここで イルを作成したことがあります ( 1992 年 7 月号 ) 。プ とりあげるのは、プロセスがもっさまざまな情報を取得 ロセス ID を利用してファイル名を決める方法ならば、 するためのシステムコールです。 プロセスが異なればファイル名が競合することはありま プロセスツリー せん。 プロセス ID の取得方法は、この連載ではすでに 2 度 登場しました。最初の 1992 年 7 月号では一時ファイル プロセスがもつ情報としてまっ先に思い浮かぶのは、 の名前を構成するために、 1994 年 5 月号では fork シス プロセス ID ではないでしようか。 UNIX でなんらかの 2Z—X 流プログラミング 57 今泉貴史 156 UNIX MAGAZINE 1995.7

6. UNIX MAGAZINE 1995年7月号

も、 1001 のユーザーに対する権限がなければ処理でき ません。 実効グループ ID setuid メカニズムと同様、実彳丁時にグループ ID を特 定のグループに変更してしまう setgid メカニズムもあ ります。こちらの場合は、 chmod コマンドで、 chmod g + s ファイル名 とすると、指定したファイルに setgid メカニズムが設 定されます。こうして指定したファイルを実行すると、 ファイルのグルーフ。の権限が与えられます。 この機構を用いた有名なコマンドに、 ps があります。 ps コマンドでは、現在カーネルが実行中のプロセスの状 態を調べるために、システムに備えられているメモリの 状態を表す /dev/mem 、カーネルがもっ仮想メモリの状 態を表す /dev/kmem などの特殊なファイルを読み込む 必要があります。これらのファイルには実行中のプロセ スのメモリイメージかオ各納されているので、ファイルを 読むことができればほかのユーザーが何をしているかが 分かってしまいます。そこで、これらのファイルの所有 者はスーパーユーザーとし、 kmem という特別なグルー プに属す人だけカ売み出せるようになっています。 所有者をスーパーユーサーにしておき、 setuid メカ ニズムを利用して ps コマンドを動かすこともできます。 しかし、この設定ではコマンドの実行権限をスーパーユ ーサーにしてしまうので、ファイルを読むためにだけ用 いるのは危険です。変更する権限は与えたくないが、読 出しだけはできるようにしたい場合には、 setgid メカニ ズムを用いるのがよいでしよう。 ー殳的には、ファイルの所有者は、読出しだけでなく 書込みも可能になっていないと、さまざまな処理をおこ なうときに不都合が生します。ファイルの所有者に se- tuid するようにしてしまうと、何かの弾みでファイル を書換えることができてしまうかもしれません。重要な ファイルのモードを、 としておき、プログラムからファイルを読み込むときに は setgid を利用するようにすれば、この問題は解決し ます。所有者は書込みも可能で、 setgid されたプログラ UNIX MAGAZINE 1995.7 LJN Ⅸ流プログラミング 57 ムからはファイルを読み込むことができます。はかのプ ログラムからは、ファイルの読込みはできません。 もうお分かりだと思いますが、この setgid を用いた プログラムを実行しているときに、有効になるグループ ID が実効グループ ID です。これは、ユーザー ID と 実効ューザー ID の関係とよく似ていますね。プロセス の実効グループ ID を取得するには、 getegid システ ムコールを用います。このシステムコールには引数はな く、戻り値としてグループ ID を返します。 setuid メカニズムを用いたときには、実効ューザー ID の権限ですべての処理がおこなわれます。 setgid メ カニズムを使用すると、指定されているグループがユー ザーが所属するグループに加えられるとみなせるので す。 setuid にくらべると、 setgid のはうか理解しやす いかもしれません。ューサーの所属するグループが、無 効になることはありません。 setuid メカニズムではユー サーが所有していたファイルが見えなくなることがあり ますが、 setgid ではそのようなことは起こりません。 これは、ユーザーが複数のグループに所属できる場合 には正しいのですが、 1 度に 1 つのグループにしか所属 できない旧い SystemV のようなシステムの場合には、 setuid メカニズムと同様な状況、つまり、もともとは読 むことができたファイルを読めなくなるという状況も起 こりえます。 ファイルに対する許可の検査 setuid や setgid メカニズムを紹介したので、ここて ファイルを利用できるかどうかを、簡単に検査するガ去 も紹介しておきましよう。 setuid や setgid メカニズムを使っていると、プロセ スカ離の権限で動いているかを特定できす、あるファイ ルに対して処理が可能かどうかが分からなくなることが あります。このような場合は、実際にファイルをオープ ンして調べるのがもっとも簡単です。たとえば、 setuid メカニズムを用いたプログラムのなかで、あるファイル を読み出せるかどうかを知りたければ、実際にそのファ イルを読出し専用でオープンしてみるのです。書込みに ついて調べる場合も同様ですが、 write システムコール などで実際に書き込んでしまわないように注意してくだ ファイルがないときに書き込めるかどうかを検査する 159

7. UNIX MAGAZINE 1995年7月号

UNIX REVIEW 誌提携 UNiX" CONTENTS 連載 日本語 So 「 is 2.4 fo 「 X86 ( 2 ) 33 PC UNIX , 特集 MAGAZINE 53 UNIX Communication Notes SNMP(4) 59 インターネットの利用と仕組み Windows NT の導入 パッチとカーネ再構築 66 BSD/OS 93 転ばぬ先のセキュリティ UN Ⅸのアカウンティング 78 Daemons & Dragons 情報のみつけ方 73 NET WORTH autoconf ( 1 ) 141 UN Ⅸ知恵袋 プリンタの接続方法 121 lnside DVI → PS Resou rce Kit と Registry 1 15 Windows NT リンクとライプラリ ( 3 ) 105 プログラマー入門 PGP ( 1 ) ・表紙・目次デサイン . Aud 「 ey the Design ユーザーとコマンドの情報 163 UN Ⅸへの招待 プロセスの情報を得るシステムコール 156 UN Ⅸ流プログラミング 岡山聖彦、脣山喜章 中村 山口 吉村 修、杉浦一徳 英 M. Steven Baker Dinah McNutt 五十嵐久和 荒井美千子 山本和彦 今泉貴史 高山健三

8. UNIX MAGAZINE 1995年7月号

連載 / ・ Windows NT—O 違うものにしてみた。 Windows NT の try や except 、 finally などからなる例外処理欟冓は、オペレーティング・ システムの内部での利用を前提としているため、システム の API がすべてリターンコードではなく伊外を返す でもっとも役に立つ。もちろん、ここでのようにシステム の API のリターンコードを見て人為的に例外を起こすこ ともできる。 NULL ポインタのアクセスなどによっても 伊外が生しるし、伊外カ拠理されなかった場合には自動酌 にラヾッガカ起動されるので、プログラムを開発するうえ でも便利である。 もう 1 つの機能追加である非同期的な呼出しは、表示 を担当するサーバー側の事情 3 によるもので、 select を mciSendString では、文字列中に wait の指定ができ RPC 待ちする直前 0 乎び、データの有無を石忍してリタ る。これを省略すると再生終了などを待たすに即座に戻る ーンコードを返すというものである。本来なら、 recv ご はすだが、実行してみるとわすかながら wait が入ってし とにタイムアウトをチェックしてエラーを発生させるべき まう。そのままでは表小がぎくしやくするので、コマンド だが、この処理は省いてある。 1 つの RPC 呼出しは実際 を送るだけのスレッドを作り、 FIFO バッフアを介して には 1 回の send によっておこなわかっデータも単 親のスレッドからコマンドを送るようにしなければならな ーのバケットに収まるので、よほど特殊な状況でなければ かった。この FIFO バッフアは、セマフォによってイ矍 途中までデータが送られるという事態は発生しないからで されたメモリ領域である。このようなコードは W ⅲ d 。 ws ある。 NT では簡単に書けるが、 Windows 3.1 などでは不可能 だろう。 MCI 使用した CD-ROM には stop をかけるとノイズが入っ 画面に合わせた音声の出力も PC 側でおこなった。シ てしまう間題があり、 pause と resume との組合せで乗 ステムの処理能力をなるべく損ねたくなかったのと、サウ りきる必要があった。 CD-ROM ドライプの価格か下がっ ンドカードを買わすにすませるため、 CD-ROM ドライプ たため、丘ではあまり使われない CD-DA の性能矼 E から CD-DA で直接出力することにした。 CD メディア にはたいしてコストをかけなくなっているためであろう。 は Write Once のものを用意した。 Windows と Windows NT でサポートされている Registry MCI (Media ControI lnterface) では、 mciSendString("p1ay cdaudio from 1 to 2 " 会場でもっとも不安だったのは、ハードウェアのトラブ NULL,O,O); ルである。写真 1 のような狭い舞台裏にキロワット級のコ などとするだけで 1 トラック目のサウンドカ咄力される。 ンピュータカ並んでいるため温度と昇も懸念していたが、 CD のトラック情報などを入手しなければならない場合は 気が予想よりはるかに低かったこともあって問題はまっ もうすこし複雑な処理が必要だが、あらかしめ決められた たく生しなかった。しかし、膨大な数のプロジェクター CD から音を出すだけなら手間がかからない。 やスポットライトがあり、しかも工事用の T 具などに仮設 電源を利用したために電源断か起きた ( ひどいときは、 1 3 サーバー倶 ) プログラマーが、 SGI の UNIX (IRIX) のスレッド走カ 日に数回原か落ちるというありさまだった ) 。さいわい、 システムコール sproc を知らなかった筆者も名前を忘は L てしまい、日 こ戻るまて・ヾられなかったのでやむをえない。このように上罅類斤 ・丘のハードディスクは頑丈にできていてめったにクラッ しい皀のインターフェイスは UNIX の実装により千差万別で、日ごろ シュしない。アクセス中に落ちたと思われるケースもあっ からそのシステムに親しんでいないと使えない。 116 UNIX MAGAZINE 1995.7

9. UNIX MAGAZINE 1995年7月号

がこのファイルを変更できるようにしてしまうと、誰 でも勝手に他人のパスワードの変更が可能になってしま い、システムの運用上問題が生じます。ューザー自身に よるパスワードの変更は許しても、他人の変更は許可し ないようにしなくてはなりません。 このような場合は、 UNIX では決められたコマンド ( ここでは p swd ) を用いて変更をおこなうようにし ます。そのコマンドは、自分に関係する部分以外は変更 できないようにしておくのです。これならは、他人のパ スワードの変更は不可能です。しかし、 passwd はコマ ンドを起動したユーサーの権限で実行されるので、 /etc/ passwd の変更はできないはすです。しつは、 passwd には特別な仕掛けがしてあり、コマンドを実行したユー サーの権限ではなく、スーパーユーサーの権限で実行で きるようになっています。 passwd コマンドのモードを調べてみると、 となっています。通常は rwx となっているユーサーに対 する権限が、 rws となっているのに注目してください。 これは、、、あるユーサーが passwd を実行したときには、 passwd コマンドの所有者の権限を与える " という意味 です。つまり、 passwd コマンドの所有者はスーパーユ ーザーなので、ユーサーが passwd を実行するとスー パーユーサーの権限でおこなわれることになります。 うしておけば、 passwd からは /etc/passwd ファイルの 変更が可能で、そのほかのコマンドでは変えられないよ うになります。 この仕組みを、 setuid メカニズムと呼びます。 se- tuid メカニズムを使えば、ユーザーには権限のないファ イルの内容を見たり、変更したりすることができます。 これまで、プロセスには getuid システムコールで得 られるユーザー ID が付けられていて、そのユーザー ID の権限でプロセスの権限か决められると説明してきまし たが、これは正確ではありません。プロセスには、ユー ザー ID と実効ューザー ID という値が付けられていて、 実効ューザー ID の権限でプロセスの権限か决定される のです。 setuid メカニズムを用いると、この実効ュー ザー ID の変更が実行時におこなえます。実効ューザー ID は、有効ューザー ID や設定ユーザー ID とも呼ばれ ています。 プロセスの実効ューザー ID を取得するには、 ge- 158 teuid システムコーノレを用います。このシステムコーノレ に引数はなく、戻り値としてユーサー ID を返します。 次のプログラムをコンパイルして、実行してみてくだ main() #include く stdio . 五 > さい。 printf ( "%d %d\n" exit(O) ; / * NOTREACHED * / getuid() , geteuid()) ; このプログラムを実行すると、ユーザー ID が 2 度 表示されます。とくになんの設定もおこなわなければ、 プロセスの実効ューザー ID はそのプロセスのユーザー ID と同し値です。たとえば、ユーザー ID が 1001 番だ とすると、このプログラムの実行で、 1001 1001 という出力か得られます。 chmod コマンドを使って、このプログラムが setuid メカニズムを利用するように変更してみましよう。その ためには、次のように実行します ( プログラムの名前を geteuid とします ) 。 chmod Ⅱ + s geteuid geteuid を ls-l コマンドで調べると、 ドと同様に passwd コ・ ? ン となり、 setuid メカニズムを利用するように変更される はすです。この状態で上のプログラムを実行しても、出 力にはなんの変化もありません。これは、実効ューザー ID が自分から自分へ変更されているためです。 setuid メカニズムの効果を調べるには、自分以外の人にこのプ ログラムを実行してもらう必要があります。 ューサー ID が 1004 番の人がこのプログラムを実行 すると、 1004 1001 と表示されるはすです。これは、プログラムを実行して いるユーサーは 1004 という ID で、プログラム自身は 1001 というューザーの権限で実行されていることを示 しています。このような状態では、ユーザー ID が 1004 のユーザーが自分の権限で処理できるファイルであって UNIX MAGAZINE 1995.7

10. UNIX MAGAZINE 1995年7月号

UN Ⅸへの招待 図 7 man の実行 % man man MAN(I) ユーサ、コマンド 【名前】 (-k) あるいは関連ファイル名← f) によって選択する 1 行の要約を したマニュアル・べージの全内容を表示するか、または keyword man はマニュアルからの情報を表示します。 man は title で選択 【機能説明】 man [—M path] —f filename man [—M path] —k keyword [ [section] title man [ ー ] [-t] [-M path] [-T macro-package] 【形式】 ページのサーチ man ー参照マニュアル・ページの表示 , キーワードによる参照 MAN(I) 表示できます。 数字がマニュアルのセクション番号、ハイフン以降がその コマンドの機能の概要です。ューザーが使うコマンドは、 マニュアルのセクション 1 に記載されています。それ以 外のセクションは、システムコール、関数、管理コマンド などで、一殳ューサーカイ吏うコマンドとは分けられていま す。そこで、 % apropos キーワード ー grep ' ( 1 ) ' などとして、 apropos の出力のうち、、 ( 1 ) " だけに注目す れば、そのなかから目的のコマンドを探しだすことカてき ます ( 1 回の実行て探しだせなければ、キーワードを変更 して目的に合ったコマンドをみつけましよう ) 。 コマンド吏い方を調べる 最後に、コマンドの使い方やその機能詳細を調べる man コマンドを勉強しましよう。 man は、コマンドの 168 マンドのマニュアルを調べています。マニュアルには名前 図 7 に、 man の実列を示します。 man コマンド名 ます。 マニュアルを画面に出力するコマンドで、次のように使い こでは、 man コ ( コマンドの名前と機能の簡単な紹介 ) 、形式 ( コマンドの 入力形式 ) 、機能説明 ( コマンド機能の詳しい解測など カ己されています。 man の画面への出力は、ページャ more を使っておこ なわれます。つまり、 1 画面すっマニュアルが表示され るというわけです。ページャは、ほかのものにも変更で きます。そのためには、環竟変数 PAG 田を次のように設 定します。 setenv PAGER less こでは、 less を使うことにしました。なお、ページャ としてつねに less を使いたければ、一屬己の言を . cshrc ファイルに加えておきます。 今月は、ユーサーとコマンドに関する情報を得るガ去 をいくっか紹介しました。次回は、この続きとしてファ イルの情報を得る方法を勉強しましよう。なお、マニュ アル (man コマンド ) に関する言岩田は、拙著『たのしい UNIX ーー UNIX への招待ーー』でも説明しています。 ☆ 参考にしてください。ではまた。 ( さかもと・あや ) UNIX MAGAZINE 1995.7