上記のコマンド実行方法と以下のコードの違いは何ですか?
#include
int main ( )
{
int return_value;
return_value = system ( "ls /" );
return return_value;
}
上記のコマンド実行方法と以下のコードの違いは何ですか?
#include
int main ( )
{
int return_value;
return_value = system ( "ls /" );
return return_value;
}
回答:
system("ls /")
はsh
プロセスを生成し、引数-c
とを与えますls /
。したがって、プログラムの実行とsh -c "ls /"
シェルでの入力の主な違いは、最初のケースでは、プログラムを含むプロセスもあるということです。したがって、ls
実行中にプロセスツリーをキャプチャできる場合、次のようなものが表示されます。
init───konsole───bash───myprog───sh───ls
の代わりに
init───konsole───bash───sh───ls
exec
関数ファミリのいずれかを使用した場合、sh
完全に使用することを避け、プログラムをls
ユーティリティで置き換えることができます。その場合、次のように表示されます。
init───konsole───bash───ls
プログラムは次のようになります。
int main(int argc, char** argv) {
return execlp("ls", "ls", "/");
}
オプションbash
を介して実行されるコマンド-c
が単純なコマンドである場合、多くのシェル(を含む)がこれを自動的に行います。それでも、シェルを単にできるプロセスに置き換える目的でシェルを生成するポイントはほとんどありませんexec
。
との間には、ファイルを読み取り用に開くために必要なもの以外はほとんど違いがsh -c "ls -l"
ありませんsh ls-l.sh
。
exec
置き換えますexec
。exec
(示されたプログラムを見つけることができないように)作動するのを防止エラーが発生した場合の呼のみを返し。system
戻り値とはまったく異なります。
init───konsole───bash───myprog───ls