1. ホーム
  2. c

[解決済み] stdoutとSTDOUT_FILENOの違いについて

2022-03-03 22:11:12

質問

との違いが気になりました。 stdoutSTDOUT_FILENO をLinux Cで作成しました。

検索作業の結果、以下のような結論になりました。この文章を確認し、間違いがあれば訂正していただけませんか?ありがとうございます。

  • stdout C言語の標準的な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_FILENO . stdout はI/Oバッファを持つ。

以上が、両者の違いについての私の理解です。何かコメントや訂正があれば、よろしくお願いします。

解決方法は?

stdoutFILE* 定数"標準の出力ストリームを与えます。ですから、明らかに fprintf(stdout, "x=%d\n", x); と同じ動作をします。 printf("x=%d\n", x); を使用します。 stdout に対して <stdio.h> のような関数があります。 fprintf , fputs などです。

STDOUT_FILENO は整数のファイル記述子(実際には整数1)です。これを write syscallを使用します。

という関係になっています。 STDOUT_FILENO == fileno(stdout)

(のような変なことをした後を除く)。 fclose(stdout); または、いくつかの freopen の後、いくつかの fclose(stdin) これは、ほとんどやってはいけないことです。参照 これ でコメントされているように J.F.Sebastian )

通常は FILE* なぜなら、これらはバッファリングされるからです(したがって、通常はうまく機能します)。時には fflush を使用してバッファをフラッシュします。

ファイルディスクリプタの番号を使って システムコール のように 書き込み(2) (で使用される)。 stdio ライブラリ)、または ポール(2) . しかし、システムコールを使うのは不格好です。非常に良い効率を得られるかもしれませんが(しかしそれはコード化するのが難しい)、非常に頻繁に stdio ライブラリで十分です(移植性も高い)。

(もちろん #include <stdio.h> はstdio関数に、そして #include <unistd.h> -のようなシステムコール用のヘッダです。 write . そして、stdio 関数はシステムコールで実装されます。 fprintf を呼び出すことができます。 write ).