1. ホーム
  2. c

[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。

2022-02-04 17:42:12

質問

この2日間で execlp() のシステムコールを使っているのですが、まだここにいます。さっそくですが、問題です。

man page のexeclpはシステムコールを次のように宣言しています。 int execlp(const char *file, const char *arg, ...); を記述してください。 execl(), execlp(), execle() 関数の const char arg とそれに続く省略記号は arg0, arg1, ..., argn と考えることができる。

それなのに、教科書にはこんな風にシステムコールが呼び出されているのを見かけます。 execlp(“/bin/sh”, ..., “ls -l /bin/??”, ...); ("..." は学生である私たちが考えることです)。しかし、このシステムコールは man page のシステムコールの

超困惑しています。どんな助けでも感謝します。

どのように解決するのですか?

このプロトタイプは

  int execlp(const char *file, const char *arg, ...);

execlp ìは可変引数関数であると書いてあります。それは2つの const char * . 残りの引数は、もしあれば、実行したいプログラムに渡すための追加引数である - も。 char * - これらはすべてCの文字列です(最後の引数はNULLポインタでなければなりません)

そのため file 引数は実行される実行ファイルのパス名です。 arg として表示させたい文字列です。 argv[0] を実行ファイルに追加します。規約では argv[0] は単なる実行ファイルの名前であり、通常、これは file .

... が実行ファイルに与える追加引数になっています。

これをコマンドライン/シェルから実行するとします。

$ ls

それは execlp("ls", "ls", (char *)NULL); または、以下のように実行すると

$ ls -l /

それは execlp("ls", "ls", "-l", "/", (char *)NULL);

で、次に execlp("/bin/sh", ..., "ls -l /bin/??", ...);

ここでは、シェル、/bin/sh に移動して、シェルに実行するコマンドを与えています。このコマンドは "ls -l /bin/??"です。コマンドライン/シェルから手動で実行することができます。

 $ ls -l /bin/??

さて、シェルを起動してコマンドを実行させるにはどうしたらいいのでしょうか?シェルのドキュメント/マニュアルページを開き、それを読むのです。

実行したいのは

$ /bin/sh -c "ls -l /bin/??"

これは次のようになります。

  execlp("/bin/sh","/bin/sh", "-c", "ls -l /bin/??", (char *)NULL);

余談ですが この /bin/?? はパターンマッチングを行っています。このパターンマッチングはシェルによって行われ、/bin/以下のすべてのファイルを2文字で展開します。もし、単純に

  execlp("ls","ls", "-l", "/bin/??", (char *)NULL);

おそらく何も起こらないだろう(実際にその名前のファイルがなければ)。 /bin/?? を解釈して展開するシェルは存在しないので、/bin/?