【问题标题】:what does printf or any output function actually do? [duplicate]printf 或任何输出函数实际上是做什么的? [复制]
【发布时间】:2013-10-12 06:34:38
【问题描述】:

我想知道所有这些输出函数,它们基本上是做什么的? 因为我经历过很多次 printf 在遇到它时并不总是在屏幕上打印,而且我听说它会放入缓冲区或类似的东西。 因此,如果有人可以清楚地说明实际发生了什么。 如果也可以提供有关输入功能的相同信息,那将是很好的.. 你讲得越深,就会有很大帮助。 . 谢谢。

【问题讨论】:

    标签: c++ c outputstream


    【解决方案1】:

    大多数时候 printf 会做这样的事情:(没有缓冲部分和其他小东西)

    对于 %s 标志:

    void            my_putchar(char c)
    {
      write(1, &c, 1);
    }
    
    int             my_putstr(char *str) // printf("%s", "hello");
    {
      int           i;
    
      i = 0;
    
      while (str[i] != '\0')
        {
          my_putchar(str[i]);
          i = i + 1;
        }
    }
    

    对于 %d 标志

    void            my_put_nbr(int nb) // printf("%d", 100);
    {
      if (nb > 9)
        my_put_nbr(nb / 10);
      my_putchar(nb % 10 + '0');
    }
    

    【讨论】:

      【解决方案2】:

      Printf

      将 format 指向的 C 字符串写入标准输出 (stdout)。 如果 format 包括格式说明符(以 % 开头的子序列), 格式后面的附加参数被格式化并插入 在结果字符串中替换它们各自的说明符。

      这里已经很好地解释了printf 的实际工作原理:

      1. 您的软件调用 printf()。

      2. printf() 处理你的字符串和参数,然后需要执行 一个内核函数,因为不能在 ring 3 中写入文件。

      3. printf() 生成软件中断,将 内核函数的编号(在这种情况下是 write() 函数)。

      4. 软件执行中断,指令指针 移动到内核代码。所以我们现在在环 0 中,在内核中 功能。
      5. 内核处理请求,写入文件(stdout 是 文件描述符)。

      6. 完成后,内核使用 iret 返回到软件代码 说明。

      7. 软件代码继续。

      ISO C99 第 7.19.3/3 节

      中的一些有用行

      当一个流没有缓冲时,字符应该从 尽快到达源头或目的地。否则 字符可以累积并传输到主机或从主机传输 环境作为一个块。

      当一个流被完全缓冲时,字符应该是 当缓冲区作为块传输到主机环境或从主机环境传输 已满。

      当流被行缓冲时,字符旨在 当换行时作为块传输到主机环境或从主机环境传输 遇到字符。

      此外,字符旨在作为一个块传输到 填充缓冲区时的主机环境,请求输入时 在无缓冲的流上,或在缓冲的行上请求输入时 需要从主机传输字符的流 环境。

      对这些特性的支持是实现定义的,并且可能 受 setbuf 和 setvbuf 函数影响。

      【讨论】:

      • 谢谢,但它没有解释缓冲区部分。为什么有时它不打印,除非它遇到'\n'
      • @RahulBhojwani:- stdout 流是缓冲的,因此只会在到达换行符后显示缓冲区中的内容
      猜你喜欢
      • 2022-09-22
      • 2013-03-24
      • 2019-11-15
      • 2014-07-14
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 2018-12-05
      相关资源
      最近更新 更多