0

このコードクリップはAPUEから入手しました。

if (dup2(clfd, STDOUT_FILENO) != STDOUT_FILENO ||
          dup2(clfd, STDERR_FILENO) != STDERR_FILENO) {
            syslog(LOG_ERR, "ruptimed: unexpected error");
            exit(1);
        }

これにより、すべての出力、stderr、およびstdoutがリモートソケットにリダイレクトされます。リモートソケットは、clfdを介して書き込み可能です。

しかし、それはどのように機能するでしょうか?2つのFDを1つのFDにリダイレクトしています。

4

1 に答える 1

1

しかし、それはどのように機能するでしょうか?2つのFDを1つのFDにリダイレクトしています

問題ありません。標準は言う:

int dup2(int fildes, int fildes2);

このdup2()関数は、ファイル記述子がファイル記述子fildes2と同じ開いているファイル記述を参照するようにしますfildes。fildes2がすでに有効な開いているファイル記述子である場合は、最初に閉じます。

同じ宛先が違法であることを参照する複数の記述子については、どの時点でも言及されていません。

カーネルは、プロセスからの複数のファイル記述子を、システム全体で開いているファイルテーブルの同じエントリにポイントするだけです。

于 2012-08-07T08:48:26.980 に答える