54

stdinCとSTDIN_FILENOCの実際の違いは何ですか?

4

5 に答える 5

59

インターフェイス。他の誰もが言っているように、stdinこれはFILE *標準cライブラリで定義されているとおりです。、、、などfreadの高レベルのインターフェイスのいくつかを使用できます。一方、は単なるファイル記述子です(ほぼ確実に0)。これは、やなどを介してわずかに低いレベルのインターフェイスを使用します。fwritefprintfSTDIN_FILENOreadwrite

于 2013-02-27T02:54:29.677 に答える
22

stdinの標準以外から入力を取得するために使用されるデフォルトのFILEポインタです。

STDIN_FILENOはデフォルトの標準入力ファイル記述子番号であり、です0。これは基本的に、一般的な使用のために定義されたディレクティブです。

于 2013-02-27T02:16:22.113 に答える
11

から/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;
}
于 2017-10-09T02:51:46.167 に答える
1

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; 
} 
于 2019-11-10T17:47:49.193 に答える
0

Linuxヘッダー#include"unistd.h"のSTDIN_FILENOは、Linuxパイプを使用している場合、パイプのstdinを表す0の単なるマクロです。

于 2021-06-30T14:26:52.200 に答える