75

stdoutLinuxCとの違いを考えていましたSTDOUT_FILENO

いくつかの検索作業の後、私は次の結論を導き出します。確認して間違いを修正するのを手伝ってもらえますか?ありがとう

  • stdoutC言語の標準I/Oストリームに属します。タイプがFILE*で、stdio.hで定義されているタイプ

  • STDOUT_FILENO、int型を持ち、で定義されunistd.hます。LINUXシステムのファイル記述子です。ではunistd.h、次のように説明されています。

The following symbolic constants shall be defined for file streams:

STDERR_FILENO
    File number of stderr; 2.
STDIN_FILENO
    File number of stdin; 0.
STDOUT_FILENO
    File number of stdout; 1.

したがって、私の意見では、STDOUT_FILENOシステムレベルの呼び出しに属し、ある程度はシステムAPIのようになります。STDOUT_FILENOシステム内の任意のデバイスを記述するために使用できます。

stdoutより高いレベル(ユーザーレベル?)に配置され、実際にはの詳細をカプセル化しますSTDOUT_FILENOstdoutI/Oバッファがあります。

それは彼らの違いについての私の理解です。コメントや訂正をいただければ幸いです。

4

1 に答える 1

98

stdoutFILE*、標準のアウトアウトストリームを提供する「定数」です。したがって、明らかに;fprintf(stdout, "x=%d\n", x);と同じ動作をします。などの機能printf("x=%d\n", x);に使用stdoutします。<stdio.h>fprintffputs

STDOUT_FILENO整数ファイル記述子(実際には整数1)です。システムコールに使用できwriteます。

2つの関係はSTDOUT_FILENO == fileno(stdout)

(のような奇妙なことをした後fclose(stdout);、またはおそらくいくつかのfreopen後にfclose(stdin)、ほとんど絶対にやるべきではないことを除いて!JFSebastianによってコメントされているように、これを参照してください)

それらはバッファリングされているので、通常はそれらを好みますFILE*(したがって、通常はうまく機能します)。場合によっては、fflushバッファをフラッシュするために呼び出すことができます。

write(2)(ライブラリで使用される)やpoll(2)などのシステムコールにファイル記述子番号を使用できます。しかし、syscallsの使用は不器用です。それはあなたに非常に良い効率を与えるかもしれません(しかしそれはコーディングするのが難しいです)、しかし非常にしばしばライブラリは十分に良いです(そしてより移植性があります)。stdiostdio

(もちろん#include <stdio.h>、stdio関数、および#include <unistd.h>-およびその他のヘッダー-のようなsyscallを使用する必要がありますwrite。また、stdio関数はsyscallで実装されているため、fprintfを呼び出すことができますwrite)。

于 2012-10-15T19:32:29.623 に答える