25

私は、dup、dup2、dup3 が「ファイル記述子 oldfd のコピーを作成する」ことを知っています(man ページから)。でも消化できない。

私が知っているように、ファイル記述子はファイルの場所とその方向(入力/出力)を追跡するための単なる数字です。する方が簡単ではないでしょうか

fd=fd2;

ファイル記述子を複製したいときはいつですか?

そして何か他のもの..

dup() は、番号が最も小さい未使用の記述子を新しい記述子に使用します。

それは、 stdinstdout、またはstderrのいずれかをclose()したと仮定すると、値としても取ることができるということですか?

4

8 に答える 8

20

少し実験した後、2番目の質問について自分自身に答えたかっただけです。

答えはイエスです。stdin、stdout、または stderr が閉じている場合、作成するファイル記述子は値 0、1、2 を取ることができます。

例:

close(1);     //closing stdout
newfd=dup(1); //newfd takes value of least available fd number

これがファイル記述子で発生する場所:

0 stdin     .--------------.     0 stdin     .--------------.     0 stdin
1 stdout   =|   close(1)   :=>   2 stderr   =| newfd=dup(1) :=>   1 newfd
2 stderr    '--------------'                 '--------------'     2 stderr
于 2011-10-24T14:49:28.523 に答える
14

ファイル記述子は単なる数字ではありません。また、さまざまな半隠し状態 (開いているかどうか、参照するファイルの説明、およびいくつかのフラグ) も保持します。dupはこの情報を複製するので、たとえば 2 つの記述子を個別に閉じることができます。fd=fd2ではない。

于 2011-10-22T18:54:37.147 に答える
7

シェル プログラムを書いていて、実行したいプログラムの stdin と stdout をリダイレクトしたいとしましょう。次のようになります。

fdin = open(infile, O_RDONLY);
fdout = open(outfile, O_WRONLY);
// Check for errors, send messages to stdout.
...
int pid = fork(0);
if(pid == 0) {
    close(0);
    dup(fdin);
    close(fdin);
    close(1);
    dup(fdout);
    close(fdout);
    execvp(program, argv);
}
// Parent process cleans up, maybe waits for child.
...

dup2() は、それを行うためのもう少し便利な方法です。close() dup() は次のように置き換えることができます。

dup2(fdin, 0);
dup2(fdout, 1);

これを行う理由は、エラーを stdout (または stderr) に報告して、エラーを閉じて子プロセスで新しいファイルを開くことができないようにするためです。第二に、いずれかの open() 呼び出しがエラーを返した場合に fork を実行するのは無駄です。

于 2011-10-22T18:30:27.773 に答える
7

dup() で最も重要なことは、新しいファイル記述子で使用できる最小の整数を返すことです。これがリダイレクトの基本です。

int fd_redirect_to = open("file", O_CREAT);
close(1); /* stdout */
int fd_to_redirect = dup(fd_redirect_to); /* magically returns 1: stdout */
close(fd_redirect_to); /* we don't need this */

この後、ファイル記述子 1 (stdout) に書き込まれたものはすべて、魔法のように「ファイル」に入ります。

于 2013-08-03T08:04:31.447 に答える
2

このページを参照してください。stdoutはdup(1)...としてエイリアスできます。

于 2011-10-22T18:19:19.787 に答える
1

「標準出力の複製」についてのヒントです。

一部の Unix システム (ただし、GNU/Linux は除く)

fd = open("/dev/fd/1", O_WRONLY);

それは以下と同等です:

fd = dup(1);
于 2016-10-03T17:52:12.583 に答える