0

最終的に並行性を利用するシェルを作成しようとしています。現在、動作するシェルパーサーがありますが、コマンドの実行方法を理解するのに問題があります。execexecvpなど)を少し見てみましたが、有望に見えますが、いくつか質問があります。

execはファイルの入出力リダイレクトを処理できますか?execを使用してパイプを設定できますか?

サブシェルについても疑問に思っています。サブシェルは何を返す必要がありますか。最後のステートメントの終了ステータス?サブシェルをパイプの一部にすることはできますか?

これらは本当にばかげた質問のように思えるかもしれませんが、私の経験不足に耐えてください。

4

2 に答える 2

1

execはファイルの入出力リダイレクトを処理できますか?

いいえ、open()anddup()またはdup2()(and close())でそれを行います。

execを使用してパイプを設定できますか?

いいえ、それはpipe()dup()またはdup2()多くの close()呼び出しで行います。

サブシェルについても疑問に思っています。サブシェルは何を返す必要がありますか、最後のステートメントの終了ステータスですか?

はい、それは通常の慣習です。

サブシェルをパイプの一部にすることはできますか?

はい。通常のシェルでは、次のように記述できます。

(cd /some/where; find . -name '*.png') | sed 's/xyz/prq/' > mapped.namelist

怖がりたい場合はposix_spawn()、そのサポート機能を調べてみてください。POSIX 2008サイトで「spawn」を検索し、怖がる準備をしてください。posix_spawn()実際には、マッピング作業とそのサポーターを使用して体系化するよりも、その場でマッピング作業を行う方が簡単だと思います。

于 2013-01-23T06:35:45.480 に答える
1

シェルの標準的な手法は、fork-execを使用することです。このモデルでは、アプリケーションを実行するために、シェルはforkを使用してそれ自体のコピーである新しいプロセスを作成し、次に exec バリアントの 1 つを使用して、独自のコード、データなどを実行可能ファイルで指定された情報に置き換えます。ディスク上。

このモデルの優れた点は、アドレス空間を変更する前に、シェルがファイル記述子 (exec によって破棄されない) を使用して少し余分な作業を実行できることです。そのため、リダイレクトを実装するために、ファイル記述子 0、1、および 2 (それぞれ stdin、stdout、および stderr) を変更して、コンソール I/O ではなく、別の開いているファイルを指すようにします。dup2を使用してこれらのファイル記述子の 1 つの意味を変更し、次に exec を使用して新しいプロセスを開始します。

于 2013-01-23T06:42:09.393 に答える