web-dev-qa-db-ja.com

Cで独自の基本的なUNIXシェルを実装するにはどうすればよいですか?

私はプロセスとスレッド管理の初心者です。私のシェルはPATH環境変数を理解する必要があります。設定および変更できます。インタラクティブモードとバッチモードの2つの方法で実行されます。 Shellは、ls; ps; wc file; calのような複数のジョブを実行できます。信号にも手を汚したい。したがって、^ K、^ cも処理する必要があります。

Exec、fork、pipeを使用する必要があることはわかっていますが、開始できません。

23
Alex Xander

すべてのUNIXシェルはオープンソースです。そのため、コードを読むことから始めるとよいでしょう。

この件に関する優れたスターター記事を探している場合は、Linux Gazetteの Writing Your Own Shell を試してください。

もう1つの良い出発点は、 mini-Shell のソースコードを確認することです。

14
Supertux

あなたのメインループは:

  • 行を読み取る(単純なシェルの場合はfgets(3)を使用し、豪華なシェルの場合はreadline(3)を使用します)
  • コマンドを解析する
  • パイプラインをフォークして実行する

コマンドを解析するには、2つの一般的な選択肢があります。再帰的降下パーサーを作成するか、yacc(1)を使用して生成します。 yaccを使用して最初のパーサーを作成する方がはるかに簡単ですが、デバッグが完全に行き詰まり、コンテキストフリーにしたい場合があります。私は再帰的な降下を好みますが、世界中の他のほぼすべての人がyaccの使用を好みます。 (技術的にはbison。)宿題のシェルのようにシェルが本当にシンプルな場合、yaccはやり過ぎかもしれません。

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

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

8
DigitalRoss

メインシステムコールについて説明しているUnixの本の多くは、シェルを実装して、さまざまな呼び出しを使用する方法と理由を説明しています。 StevensとRochkindはそのような本です。

4