2014-02-05 6 views
1

Тестовая платформа - 32 бит x64 Linux, coreutils 8.5.Почему stdout не равен 1 в gnu coreutils?

В исходном коде base64, FWRITE будет использовать стандартный вывод для вывода строки в кодировке Base64

  1. Когда я использую ltrace для печати всех вызов LibC, мы можем видеть, что STDOUT равно 0xb772da20

    __libc_start_main(0x8048eb0, 2, 0xbf892f74, 0x804cb50, 0x804cbc0 <unfinished ...> 
    
    strrchr("base64", '/')               = NULL 
    setlocale(6, "")                = "en_US.UTF-8" 
    bindtextdomain("coreutils", "/usr/share/locale")        =  "/usr/share/locale" 
    textdomain("coreutils")              = "coreutils" 
    __cxa_atexit(0x804a3b0, 0, 0, 0xbf892f74, 2)         = 0 
    getopt_long(2, 0xbf892f74, "diw:", 0x0804d1a0, NULL)       = -1 
    fopen64("testbase64", "rb")             = 0x8591878 
    fileno(0x8591878)                = 3 
    posix_fadvise64(3, 0, 0, 0, 0)             = 0 
    fread_unlocked(0xbf89225c, 1, 3072, 0x8591878)         = 900 
    fwrite_unlocked("Ly8gcXVpY2tTb3J0LmMKI2luY2x1ZGUg"..., 1, 76, 0xb772da20)  = 76 
    
  2. Когда я изменить код базы 64, как это:

    int main (int argc, char **argv) 
    { 
    
        printf("%p \n", stdout); 
        int opt; 
        FILE *input_fh; 
        const char *infile; 
        ..... 
    

Выход еще 0xb772da20, это странно для меня, как это первая линия base64.c.

Я Grep в Lib папку Coreutils

grep stdout *.h 

, и я не вижу никаких предопределить в стандартный вывод.

Может ли кто-нибудь помочь мне решить, почему stdout будет определяться как «0xb772da20», а не 1, а не 0?

+0

related: http://stackoverflow.com/questions/21451895/why-stdout-cant-be-subestровано – box

+1

Чтобы напечатать значение указателя, наведите его на 'void *'. Обычно это не имеет значения, но «void *» и другие типы указателей не гарантируют того же представления или передаются так же, как и аргументы. 'printf ("% p \ n ", (void *) stdout);' –

ответ

4

В соответствии с stdout(3), stdout является указателем (на некоторую 10 непрозрачную структуру), поскольку это поток файлов. Это не файловый дескриптор. Его дескриптор файла STDOUT_FILENO, который на самом деле является 1.

В моей системе Gnu Libc Linux, у меня есть около линии 169 из /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 

До этого (строка 48) есть

typedef struct _IO_FILE FILE; 

См. Также this answer связанный с этим вопрос.

+0

Спасибо, Базиле! – computereasy

 Смежные вопросы

  • Нет связанных вопросов^_^