2013-02-27 79 views
27

Sự khác biệt thực tế, nếu có, giữa stdinSTDIN_FILENO trong C?Sự khác nhau giữa stdin và STDIN_FILENO là gì?

+1

[Thảo luận thú vị về chủ đề] (http://www.rtems.com/ml/rtems-users/2011/march/msg00101.html). Có lẽ bạn cũng nên hỏi tại sao 'fileno (stdin)' khác với 'STDIN_FILENO'. – user7116

+0

@ user7116 Liên kết của bạn không may đã chết. –

+0

Liên kết này hoạt động http://www.rtems.org/ml/rtems-users/2011/march/thrd1.html#00101 – pixelbeat

Trả lời

27

Giao diện. Giống như mọi người khác đã nói, stdinFILE * như được định nghĩa bởi thư viện chuẩn c. Bạn có thể sử dụng một số giao diện cấp cao hơn như fread, fwritefprintf. Mặt khác, STDIN_FILENO chỉ là một bộ mô tả tập tin (gần như chắc chắn là 0). Điều này sử dụng giao diện cấp thấp hơn một chút thông qua số lượt thích là readwrite.

+11

Không có câu trả lời nào đề cập đến 'STDIN_FILENO' là một macro được định nghĩa trong ''. Ít nhất là cho một hệ thống tuân thủ POSIX, nó không chỉ "gần như chắc chắn 0 "; nó được yêu cầu phải được định nghĩa là 0. Tương tự,' ST DOUT_FILENO' là 1 và 'STDERR_FILENO' là 2. –

+0

@KeithThompson cảm ơn, đang tìm kiếm điều này! – KGCybeX

12

stdin là một con trỏ FILE mặc định dùng để lấy đầu vào từ không ai khác hơn tiêu chuẩn trong.

STDIN_FILENO là mặc định tiêu chuẩn tập tin đầu vào số mô tả đó là 0. Về bản chất nó là một chỉ thị được định nghĩa để sử dụng chung.

1

Từ /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 

Từ /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. */ 

Ex, stdin (_IO_FILE quy định tại /usr/include/libio.h) là một cấu trúc dữ liệu. STDIN_FILENO là một hằng số vĩ mô, trỏ đến một bộ mô tả tập tin được sử dụng bởi hạt nhân.

#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; 
} 
Các vấn đề liên quan