Linux Cのstdout
とSTDOUT_FILENO
の違いに疑問を感じていました。
いくつかの検索作業の後、次の結論を導き出します。それを確認し、間違いを修正するのを手伝ってもらえますか?ありがとう
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バッファーがあります。
それが彼らの違いについての私の理解です。コメントや修正は大歓迎です。
stdout
は、標準出力ストリームを提供するFILE*
「定数」です。したがって、明らかにfprintf(stdout, "x=%d\n", x);
はprintf("x=%d\n", x);
と同じ動作をします。 stdout
、fprintf
などの<stdio.h>
関数にはfputs
を使用します。
STDOUT_FILENO
は整数ファイル記述子(実際には整数1)です。 write
syscallに使用できます。
2つの間の関係はSTDOUT_FILENO == fileno(stdout)
です
(fclose(stdout);
のような奇妙なことをした後、またはfclose(stdin)
の後のfreopen
を除いて、ほとんどすべきではない!( this 、コメント( JFSebastian )
通常、FILE*
の方が好まれます。なぜなら、それらはバッファリングされているからです(したがって、通常はうまく機能します)。場合によっては、fflush
を呼び出してバッファをフラッシュすることもできます。
syscalls のファイル記述子番号を使用できます write(2) ( stdio
ライブラリで使用されます)、または poll(2) 。しかし、syscallsの使用は扱いにくいです。効率は非常に優れています(ただし、コーディングは困難です)が、ほとんどの場合、stdio
ライブラリで十分です(さらに移植性があります)。
(もちろん、stdio関数の場合は#include <stdio.h>
、write
などのシステムコールの場合は#include <unistd.h>
およびその他のヘッダーを使用する必要があります。また、stdio関数はsyscallで実装されるため、fprintf
はwrite
)。