2009-09-30 17 views
23

私はプロセスとスレッド管理の初心者です。私のシェルは、PATH環境変数を理解する必要があります。設定および変更が可能です。これは2つの方法で動作します - 対話式&バッチモード。シェルはls; ps; wcファイル; calのような複数のジョブを取ることができます。私は手を信号で汚いものにしたい。だから私は^ K、^ cも扱うべきです。私は自分の基本的なUNIXシェルをC言語でどうやって実装できますか?

私はexec、フォーク、パイプを使用する必要がありますが、始めることはできません。

+2

これは宿題の質問ですか?そうなら、適切にタグを付ける必要があります。 – Amok

+2

いいえそうではありません! –

答えて

14

すべてのUNIXシェルはオープンソースなので、コードを読むのが良いかもしれません。

件名に関する良いスターター記事をお探しの場合は、Linux GazetteからWriting Your Own Shellをお試しください。

もう一つの良い出発点は、ちょうどあなたの頭を丸くするために、その1つがmini-shellというソースコードを見ていることです。

8

あなたのメインループである:

  • ライン(空想のいずれかの、簡単なシェルのためfgets(3)readline(3)を使用)
  • コマンドを
  • フォークを解析してパイプラインを実行し読み取る

コマンドを解析するには、2つの一般的な選択肢があります。再帰的な降下構文解析プログラムを作成するか、yacc(1)を使用して生成します。 yaccを使って最初のパーサーを起動するのはずっと簡単ですが、完全にそれをデバッグすることができますし、本当にコンテキストフリーになりたいです。私は再帰的な降下を好むが、世界中の誰もがyaccを使うほうが好む。 (技術的には、bison。)シェルが宿題のように本当にシンプルなのなら、yaccは過剰なものかもしれません。

字句解析を行うには、独自のロールを使用するか、フレックスを使用することもできます。

スレッドを使用する必要はありません。

+3

いずれにしても 'readline()'を使用することをお勧めします。シェルを使用しなければならない限り、あなたの人生は無限に楽になります。しかし、yacc/bisonでうごめくための+1。良いツールですが、単純化するのは難しい作業です。 –

+0

yoyurシェルからプログラムを実行したいのであれば、パーサとレクサーは必要ありません。しかし、 "他の"ものをしたいのであれば、flex + yaccを使うことをお勧めします。* doあなた自身をロールアップしない* – aviraldg

+1

それを取得しています。しかし、私は手を信号で汚くしたい。だから私は^ K、^ cも扱うべきです。 –

4

メインシステムコールを記述するUnixの書籍の多くには、さまざまな呼び出しを使用する方法と理由を示すシェルも実装されています。スティーブンスとRochkindは、2冊のそのような本です。

関連する問題