3

教育目的のこの小さなコードに問題があります。それがどのように機能するのか理解できません。

#include <stdio.h>
#include <fcntl.h>

#define FNAME "info.txt"
#define STDIN 0
int main(){

   int fd;
   fd = open(FNAME, O_RDONLY);

   close(STDIN); //entry 0 on FDT is now free
   dup(fd); //fd duplicate is now stored at entry 0 
   execlp("more","more",0); 
}

このプログラムを起動すると、ターミナルにファイル「info.txt」の内容が出力されます。理由がわからない!「more」とSTDIN(キーボードまたはファイル)の間のリンクはどこにありますか?

引数なしでファイルのリダイレクトなしでもっと使用すると、ヘルプ画面が表示されるだけなのに、リダイレクトではファイルが入力として使用されるのはなぜですか?

4

1 に答える 1

4

dup常に利用可能な最小のファイル記述子番号を提供します。

デフォルトでは、すべてのプロセスに、、およびが0含ま1れます。ファイルを開くと、ファイル記述子の値が取得されます。その後、あなたは閉じました。その後に呼び出すと、の重複ファイル記述子として使用可能な最小値が得られるため、の重複ファイル記述子として取得されます。2stdinstdoutstderr3stdindup3stdin3

int main()
{
   int fd, fd2;
   fd = open(FNAME, O_RDONLY); //This will be 3

   fd2 = dup(fd); //This will be 4 because 4 is the lowest available value
   close(STDIN); //entry 0 on FDT is now free
   dup(fd); //fd duplicate is now stored at entry 0 
   execlp("more","more",0); 
}

そして、ここでファイルの内容を表示する理由は、moreコマンドを2つの方法で使用できることです。

  • より多くのファイル名
  • コマンド| もっと

filenameexecでは、コマンドのコマンドライン引数として何も指定していませんmore。したがって、pipestdinから読み取ることにより、モードで実行されます。

于 2013-02-01T18:21:57.190 に答える