- ベストアンサー
Linuxでの別プロセス起動について
- コマンド置換を使用した場合に、シェル自体が子プロセスとして立ち上がる場合とそうでない場合があります。
- パイプを使用した場合には子プロセスとして処理が実行されることは認識しているのですが、コマンド置換の場合も子プロセスとして実行されるのが普通なのでしょうか?
- パターン1のように処理が1行だけの場合には子プロセスとして立ち上がらない理由は何でしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
単純に fork + execve で実行できる物と、そうでないものの違いでしょう。 >パターン1のように処理が1行だけの場合には子プロセスとして立ち上がらない理由は何でしょうか? オーバーヘッドを減らすための最適化です。 リダイレクトを使っても子bashが起動されます。
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10358)
No1です。 >fork + execveで実行できないものとはどのようなものでしょうか? 誤解を招いたようですね。 >単純に 「fork + execve で実行できる物と、そうでないもの」の違いでしょう。 ではなく、 >「単純に fork + execve で実行できる物」と、「そうでないもの」の違いでしょう。 です。 単純なというのは、「各種置換を行った後の文字列を、単語に切り分けて、forkしてexecveを呼ぶ」という意味で使いました。 「そうでないもの」というのは、リダイレクト処理が必要な物、単一コマンドで無く複合コマンドや、リストやパイプな物、その他シェルの機能(一部)を使う物など。
お礼
回答の文章を少し勘違いをして読み違えていたようです。 単純に実行可能なものと、パイプなどを伴う複雑なものという意味だったのですね。
- kmee
- ベストアンサー率55% (1857/3366)
子プロセスと、子シェルを混同してませんか? 単コマンドでは、そのコマンドだけ実行すればいいので、子プロセスとしてそのコマンドを実行する。子シェルは実行する必要がない。 複合コマンドでは、その制御のために子プロセスとしてシェルを実行してその中でコマンドを実行します
お礼
ご回答ありがとうございます。 子シェルも一つのプロセスなので、子プロセスであると言えると思います。 混同しているわけではないのですが、子シェルが立ち上がる場合と、そうでない場合の違いが分からなかったので質問させて頂きました。 単一コマンドの場合は無駄な子シェルが実行される必要がないために、直接子プロセスとしてコマンドが実行されるということで理解できました。 No.1の方がご回答下さったように「最適化」ということですね。
お礼
ご回答ありがとうございます。 fork + execveで実行できないものとはどのようなものでしょうか? 子プロセスは基本的にfork + execveの組み合わせで実行するものと認識しています。 >オーバーヘッドを減らすための最適化です。 間にサブシェルが立ち上がらないのは最適化のため、ということで理解できました。