exec関数でファイル名を2回渡す必要があるのはなぜですか?

exec関数でファイル名を2回渡す必要があるのはなぜですか?

私は読んだUNIX環境の高度なプログラミング著者:Stevens、第8。私は6つのexec関数をすべて読んで理解します。

私が注目したことの1つは、すべてのexec関数で次のようなことです。

  • 最初のパラメータはファイル名/パス名です(exec関数によって異なります)。
  • 2番目のパラメータは、main()ファイル名自体のargv [0]です。

したがって、ここでは関数にファイル名を2回渡す必要があります。

何らかの理由があります(最初のパラメータのパス名からファイル名を取得できないなど)。

ベストアンサー1

したがって、ここでは関数にファイル名を2回渡す必要があります。

彼らはあなたが観察することに気づいたものとまったく一致しません一つそのうちの1つが値として使用されますargv[0]。これは実行可能ファイルのデフォルト名と同じである必要はありません。多くの/ほとんどのものがこれを無視するので、そこに欲しいものを入れることができます。

最初のものは明らかに必要な実行可能ファイルの実際のパスです。 2番目は、表面的には呼び出すために使用された名前でプロセスに渡されますが、たとえば次のようになります。

execl("/bin/ls", "banana", "-l", NULL);

/bin/ls正しいパスだと仮定すると正常に動作します。

ただし、一部のアプリケーションはを使用しますargv[0]。通常、これらのアプリケーションには$PATH。これは圧縮ユーティリティで一般的です(代わりにシェルラッパーを使用する場合もあります)。xzインストールした場合は、そのstat $(which xzcat)リンクが表示され、xz「xzcatはxz --decompress --stdoutと同じです」と説明したものと同じですman xzcatman xzxz を調べて呼び出し方法を確認してargv[0]同じにすることができます。

execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);

おすすめ記事