为什么stdout在gnu coreutils中不等于1?

时间:2014-02-05 18:24:30

标签: c stdout libc gnu-coreutils

测试平台是32位x64 Linux,coreutils 8.5。

base64 的源代码中, fwrite 将使用 stdout 输出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. 当我像这样修改base64的代码时:

    int main (int argc, char **argv)
    {
    
      printf("%p \n", stdout);
      int opt;
      FILE *input_fh;
      const char *infile;
      .....
    
  3. 输出仍然是 0xb772da20 ,这对我来说很奇怪,因为这是base64.c的第一行。

    我在coreutils的lib文件夹中grep

    grep stdout *.h
    

    我没有看到stdout的任何预定义。

    有没有人可以帮我解释为什么stdout会被定义为“0xb772da20”,而不是1,而不是0?

1 个答案:

答案 0 :(得分:4)

根据stdout(3)stdout是一个指针(指向某个FILE不透明结构),因为它是一个文件流。它不是文件描述符。它的文件描述符是 STDOUT_FILENO确实是1。

在我的Gnu libc Linux系统上,我接近/usr/include/stdio.h的第169行:

/* 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相关问题。