GNU/Linux >> Linux の 問題 >  >> Linux

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

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);

Linux
  1. Bashスクリプトがエイリアスを認識しないのはなぜですか?

  2. ファイルをペンドライブにコピーしているときにPCがフリーズするのはなぜですか?

  3. Linux –システムにRootfsファイルシステムが存在しないのはなぜですか?

  1. ファイルの内容をコマンドラインパラメータとして渡す方法は?

  2. オペレーティング システムにファイル サイズの制限があるのはなぜですか?

  3. 名前がハイフンで始まるファイルの名前を変更できません

  1. バッシュ‘?

  2. Mate-terminalの複数のインスタンスが同じPidを持っているのはなぜですか?

  3. man ページで pvremove の強制が重複しているのはなぜですか?