0

シェルを実行できるようにしたい

cat file.txt 

としても

ls -l

2番目の引数では常にテキストファイルになるため、これを行う方法がわかりませんが、2番目の引数catなどlsのコマンドではそうではないため、別の方法で実行する必要があります。両方のケースを適切に処理する方法がわかりません。

4

2 に答える 2

0

シェルは、最初のパラメーターに一致するバイナリを探し、後続のすべてのパラメーターを文字列として最初のプログラムに渡す必要があります。シェルは、パラメーターの意味を決定する責任はありません。シェルが実行するプログラムです。

シェルは fork() を呼び出す必要があります。次に、子プロセス (fork() の戻り値 == 0) で、さまざまな exec コマンドの 1 つを呼び出して、ユーザー指定のプログラムを実行します。その間、元のプロセスは fork された子が waitpid() で完了するのを待っています。

http://linux.die.net/man/3/exec

それらの多くは、文字ポインターの配列をパラメーターとして受け取ることがわかります。後続のパラメーターを exec されたバイナリに渡して、それ自体を読み込んで解析できるようにします。

于 2013-05-19T03:17:22.747 に答える
0

これを行う最善の方法の 1 つは、1 つ以上の区切り文字 (スペース、タブなど) に基づいて文字列を切り取り、結果の単語で配列を埋めることです。各単語を文字列の配列 ( "cat file.twt"=> "cat", "file.txt") に配置したら、exec* 関数 (例: execve) を呼び出すことができます。

実行のために、何をする必要があるかに応じて、次のものが必要になる場合があります。

  • exec* 関数 (execve、execlp など)
  • fork (シェルを作成しているため、プロセスを維持する必要があります)
  • ゾンビ プロセスを回避するための wait/waitpid
  • ファイル記述子で遊ぶ必要がある場合は dup*/pipe 。

そして最後に、シェルを作成しているので、各バイナリが引数として期待するものを気にする必要はありません。これはシェルの仕事ではないためです (少なくともこの時点では)。

于 2013-05-19T10:34:14.580 に答える