-2

クラス プロジェクトの一部として、C で独自のシェルを構築しようとしています。execv を使用し、独自のパスを実装する必要があります。理解を深めるために、次の質問があります。

パスのリストはデフォルトでは空ですが、任意のサイズに拡張できます。この変数を制御するには、組み込みコマンドを実装する必要があります。

path [+|- /some/dir]
  • path(引数なし) リスト内のすべてのエントリをコロンで区切って表示します (例: "/bin:/usr/bin")。

  • path + /some/dir指定されたパス名をパス リストに追加します。

  • path - /some/dir指定されたパス名をパス リストから削除します。

私は割り当てを読み違え、これまで execvp を使用してきました。独自のパス変数を作成する方法と、実行されたコマンドごとに、そのディレクトリを検索してパスに追加する方法を教えてください。または、私が見ることができる execv を使用して書かれた単純なシェルはありますか?

http://linuxgazette.net/111/ramankutty.htmlを見ましたが、検索が少し複雑すぎることがわかり、彼は execve を使用しています。

これまでのところ、最初は null の char *mypath 変数があります。ただし、ユーザーはパス + some/dir またはパス - /some/dir を使用して追加または削除できます。execv の構文は execv("/some/dir", argv) です。実行可能ファイルのパスを検索して execv に渡すにはどうすればよいですか?たとえば mypath=/bin/ls ; execv(mypath, argv) を渡すと機能しません...では、execv にパスを渡すにはどうすればよいですか?

4

1 に答える 1

1

使用することになっている理由excevは、環境のパスを考慮していないためだと思いますが、呼び出しでは関数へのフルパスを提供する必要があります。

これはクラスのプロジェクトなので、コードを書くことになっています。コードを書くことは、インターネットからコピーして貼り付けるよりも、物事のやり方を学ぶ方法であるため、問題を解決するためのコードを書くつもりはありません。代わりに解決策を説明します。

path + some/dirおよびメカニズムによって調整されたパス エントリのリストを保持する必要があるpath - some/dirため、これらのコマンドはもちろんシェル内で処理する必要があり、パス エントリのリストに追加/削除する必要があります。

次に何かを実行するとき、たとえば「mycommand」と入力すると、パス エントリのリストをスキャンし、パス エントリで指定されたディレクトリに「mycommand」という名前のファイルがあるかどうかを確認する必要があります。実行されます (ディレクトリエントリに実行ビットが設定されています)。execvその場合、現在のパス エントリと「mycommand」を連結した文字列を呼び出します。(たとえば、連結された文字列を生成し、stat関数を使用してファイルに関する情報を取得できます)

エラーがないかチェックし、問題があれば報告してください。

インターネット上で他人のシェルを見つけようとしないでください。それはあなたが学ぶ方法ではありません.クラスの演習から実際に学ばなければ、学校を卒業しても成功する可能性はほとんどありません-そしてそれが最終的にあなたが学校に行く理由ですよね?

于 2014-09-13T18:46:36.063 に答える