UNIX環境での高度なプログラミングを読みました Stevens著、8章。
私は6つのexec関数すべてを読んで理解しています。
私が気づいたことの1つは、すべてのexec関数で次のことです。
- 最初の引数はファイル名/パス名です(exec関数によって異なります)。
- 2番目の引数は
main()
で取得するargv[0]です。 、これはファイル名そのものです。
したがって、ここでは、関数でファイル名を2回渡す必要があります。
理由はありますか(最初の引数のパス名からファイル名を取得できないなど)?
承認された回答:
したがって、ここでは、関数でファイル名を2回渡す必要があります。
それらは、1つを観察することで気付くものとまったく同じではありません。 そのうちのargv[0]
として使用されます 価値。これは、実行可能ファイルのベース名と同じである必要はありません。多くの/ほとんどのものはそれを無視し、あなたはそこに好きなものを入れることができます。
1つ目は、実行可能ファイルへの実際のパスであり、明らかに必要です。 2つ目は、表面上はそれを呼び出すために使用された名前としてプロセスに渡されますが、例:
execl("/bin/ls", "banana", "-l", NULL);
/bin/ls
を想定して、正常に動作します 正しいパスです。
ただし、一部のアプリケーションはargv[0]
を使用します 。通常、これらには$PATH
に1つ以上のシンボリックリンクがあります;これは圧縮ユーティリティでは一般的です(代わりにシェルラッパーを使用する場合もあります)。 xz
をお持ちの場合 インストール済み、stat $(which xzcat)
xz
へのリンクであることを示しています 、およびman xzcat
man xz
と同じです これは、「xzcatはxz –decompress –stdoutと同等です」と説明しています。 xzがどのように呼び出されたかを知る方法は、argv[0]
をチェックすることです。 、これらを同等にします:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);