stdin
CとSTDIN_FILENO
Cの実際の違いは何ですか?
5 に答える
インターフェイス。他の誰もが言っているように、stdin
これはFILE *
標準cライブラリで定義されているとおりです。、、、などfread
の高レベルのインターフェイスのいくつかを使用できます。一方、は単なるファイル記述子です(ほぼ確実に0)。これは、やなどを介してわずかに低いレベルのインターフェイスを使用します。fwrite
fprintf
STDIN_FILENO
read
write
stdin
の標準以外から入力を取得するために使用されるデフォルトのFILEポインタです。
STDIN_FILENO
はデフォルトの標準入力ファイル記述子番号であり、です0
。これは基本的に、一般的な使用のために定義されたディレクティブです。
から/usr/include/stdio.h
、
/* Standard streams. */
extern struct _IO_FILE *stdin; /* Standard input stream. */
extern struct _IO_FILE *stdout; /* Standard output stream. */
extern struct _IO_FILE *stderr; /* Standard error output stream. */
/* C89/C99 say they're macros. Make them happy. */
#define stdin stdin
#define stdout stdout
#define stderr stderr
から/usr/include/unistd.h
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
たとえば、stdin
(_IO_FILE
で定義されている/usr/include/libio.h
)は構造データです。STDIN_FILENO
はマクロ定数であり、カーネルが使用するファイル記述子を指します。
#include <stdio.h>
#include <unistd.h>
void
stdin_VS_STDIN_FILENO(void)
{
printf("stdin->_flags = %hd\n", stdin->_flags);
printf("STDIN_FILENO : %d\n", STDIN_FILENO);
}
int
main(void)
{
stdin_VS_STDIN_FILENO();
return 0;
}
stdin:1.ファイルポインタ(* FILE)2.ファイル記述子テーブルは、プロセスの作成時にそのアドレスを保持します。3./usr/include/stdio.hに存在します
STDIN_FILENO:1.これはマクロです2.ファイル記述子テーブルの配列インデックス(デフォルトは0)にすぎません。3./usr/include/unistd.hに存在します
次のコードを使用すると、より明確になります。
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("%d\t\t%p ----- ",STDIN_FILENO,stdin);
return 0;
}
Linuxヘッダー#include"unistd.h"のSTDIN_FILENOは、Linuxパイプを使用している場合、パイプのstdinを表す0の単なるマクロです。