このページは大阪弁化フィルタによって翻訳生成されたんですわ。

翻訳前ページへ


シェルからプログラムを起動したとき何が起こるか?

5. シェルからプログラムを起動したとき何が起こるか?

シェルとは、ユーザが打ち込んやコマンドを解釈する Unix のインタープリタ や。これがシェルと呼ばれるんは、オペレーティングシステムのカーネルを 包み込んで、これをユーザから隠す働きをしてんねんさかいや(訳注:木の実の 比喩なんやし、シェル (shell) とは殻を意味し、中核となる実(ここではカーネル) を包み込んどることから、その名前がおます)。シェルとカーネル とが別々のプログラムとなってて、両者が一連のシステムコール経由で 通信するゆう仕組みは、Unix の重要な特徴となっとりまんねん。こないな風に 両者を分離するっちうことで、様々なシェルプログラムの実装が可能となり、 ユーザの好みに合わせていろいろなインターフェイスを選べるようになっとりまんねん。

通常のシェルでは、ユーザがログインすると、(特にカスタマイズをしておらへん 限り) '$' ちうプロンプトが表示されはります。ここではシェルの構文や、画面を 見ていればだいたい分かるような事柄には触れしまへん。むしろ、こないな表示の 背景で何が起こっとるんかを、コンピュータの視点から解説したろおもて思とります。

ブートが終了した後でまだ何らプログラムを実行しておらへん時点における コンピュータちうんは、一連のプロセス全体がやなあかん仕事を待っとる状態である と考えることができまんねん。あらゆるプロセスがイベント (event) を待っとるわけや。ここでイベントとは、ユーザがキーを 押すとかマウスを動かすとかいったことや。せやなかったら、マシンがネットワーク に接続されとるやったら、そのネットワーク越しに送られてくるデータパケット の着信やらなんやらもイベントにあたるんや。

カーネルもそないなプロセスのひとつや。せやけど、カーネルは特殊なプロセス でもおます。カーネルプロセス以外のユーザプロセス (user process) をいつ実行すべきか制御を行うのがカーネルプロセスなんやし、マシンの ハードウェアに直接アクセスできんのも通常はカーネルプロセスだけやからや。 実際、ユーザプロセスが、キーボードの入力を読み込んやり、スクリーンに何ぞを 表示したり、ディスクに対して読み書きしたり等、メモリとのやりとり以外の ずぅぇえええぇぇええんぶの処理をする際には、カーネルに対してリクエストを送らななりま せん。こないなリクエストは、システムコール (system call) と呼ばれとりまんねん。

通常、I/O ポートへのアクセスはずぅぇえええぇぇええんぶカーネルを通じて行われるさかい、 カーネルはそないな処理をスケジューリングしたり、相互の干渉を防止したり する機能を持っとりまんねん。そやけど、少数の特別なユーザプロセスは、カーネルを 通さんと処理する権限を与えられとりまんねん。たいていの場合、そら I/O ポート へ直接アクセスできるゆう権限や。X サーバ (こら、大部分の Unix マシン 上で、スクリーンへの画像表示に関する他のプログラムからのリクエストを 受け取ちう、処理してんプログラムのことや) が、その典型的な例や。せやけどダンさん、 今のトコ、まだ X サーバが立ち上がるトコまで話が進んでいまへん。 まや、文字端末上で、シェルプロンプトを見とる状態や。

シェルは、単なるユーザプロセスなんやし、何ら特別な権限を与えられとるわけ やおまへん。シェルはキーストロークを待っており、(カーネル経由で) キーボードの I/O ポートを監視してるんや。カーネルはキーストロークを 認識すると、それをそのまんまスクリーン上に表示しまっせ。カーネルは 'Enter" キーが押されたことを認識すると、そのキーが押されるまでに入力された テキスト行をシェルに渡しまっせ。シェルは、それらのキーストロークを コマンドとして解釈したろおもてまんねん。

例あげたろか、たとえばやなあ、Unix のディレクトリ表示コマンドを起動するために、'ls' ちう 文字をタイプして、Enter を押したとしまっせ。シェルは、あらかじめ組み込まれて おるルールに従ってそれを解釈し、ユーザが '/bin/ls' ファイルにある実行コマンドを起動したがっとるのやと理解しまっせ。 シェルはシステムコールを発して、カーネルに /bin/ls を新規の子プロセス (child process) として 起動するとともに、その子プロセスに対してカーネル経由でスクリーンと キーボードへのアクセス権限を与えるよう要求しまっせ。ほんで、シェルは スリープ状態に入り、ls コマンドが終了するんを待ちまんねん。

/bin/ls コマンドが終了する際、コマンドは、 exit システムコールを発行して、処理が終了した ことをカーネルに伝えまんねん。すると、カーネルが、スリープしとったシェルを 目覚めさせて、シェルが実行を再開できるようになりよったことを伝えまんねん。 シェルは、もっかいプロンプトを発し、次の入力がなされるのを待ちまんねん。

とはいえ、上記の 'ls' が実行されとる最中に、他のプロセスを進行させる ことも可能や(どエライ長いディレクトリのリストを表示したろおもて してんとしまひょ)。例あげたろか、たとえばやなあ、'ls' の実行中に、別の仮想コンソールに 切り替えて、ログインし、ゲームの Quake で遊び始めることができまんねん。 せやなかったら、インターネットに接続してん状態やとしたら、 ls の実行中に、読者のマシンがメールの送受信を するっちうことも可能や。